|
|
@ -1,27 +1,29 @@ |
|
|
|
package com.ccsens.wisdomcar.service; |
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil; |
|
|
|
import cn.hutool.core.collection.CollectionUtil; |
|
|
|
import cn.hutool.core.lang.Snowflake; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import com.ccsens.util.JacksonUtil; |
|
|
|
import com.ccsens.util.RedisUtil; |
|
|
|
import com.ccsens.util.bean.message.common.InMessage; |
|
|
|
import com.ccsens.util.bean.message.common.MessageConstant; |
|
|
|
import com.ccsens.util.bean.message.common.MessageRule; |
|
|
|
import com.ccsens.wisdomcar.bean.dto.Message.CarRecordMessageDto; |
|
|
|
import com.ccsens.wisdomcar.bean.po.*; |
|
|
|
import com.ccsens.wisdomcar.bean.vo.Message.CarRecordMessageVo; |
|
|
|
import com.ccsens.wisdomcar.persist.mapper.FirstAidMapper; |
|
|
|
import com.ccsens.wisdomcar.persist.mapper.FirstAidRecordMapper; |
|
|
|
import com.ccsens.wisdomcar.persist.mapper.WisdomCarMapper; |
|
|
|
import com.ccsens.wisdomcar.persist.mapper.WisdomCarRecordMapper; |
|
|
|
import com.ccsens.wisdomcar.persist.mapper.*; |
|
|
|
import com.ccsens.wisdomcar.util.Constant; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Propagation; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import javax.annotation.Resource; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.HashSet; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Random; |
|
|
|
import java.util.Set; |
|
|
|
|
|
|
|
/** |
|
|
@ -43,6 +45,10 @@ public class RecordService implements IRecordService{ |
|
|
|
private Snowflake snowflake; |
|
|
|
@Resource |
|
|
|
private IMessageService messageService; |
|
|
|
@Resource |
|
|
|
private ScreenMapper screenMapper; |
|
|
|
@Resource |
|
|
|
private RedisUtil redisUtil; |
|
|
|
|
|
|
|
@Override |
|
|
|
public void disposeMessage(CarRecordMessageDto carRecordMessageDto) throws Exception { |
|
|
@ -68,98 +74,206 @@ public class RecordService implements IRecordService{ |
|
|
|
wisdomCarRecord.setValue(carRecordMessageDto.getValue()); |
|
|
|
wisdomCarRecord.setTime(carRecordMessageDto.getTime()); |
|
|
|
wisdomCarRecordMapper.insertSelective(wisdomCarRecord); |
|
|
|
// 发送的消息
|
|
|
|
CarRecordMessageVo carRecordMessageVo = new CarRecordMessageVo(carRecordMessageDto.getCarNumber(),carRecordMessageDto.getType(),carRecordMessageDto.getValue(),carRecordMessageDto.getTime()); |
|
|
|
//添加接收者
|
|
|
|
|
|
|
|
//查找医院大屏的userId(暂时查找主屏幕)
|
|
|
|
Set<String> userIdSet = new HashSet<>(); |
|
|
|
userIdSet.add("123456"); |
|
|
|
ScreenExample screenExample = new ScreenExample(); |
|
|
|
screenExample.createCriteria().andHospitalIdEqualTo(0L).andShowTypeEqualTo((byte) 0); |
|
|
|
List<Screen> screenList = screenMapper.selectByExample(screenExample); |
|
|
|
if(CollectionUtil.isNotEmpty(screenList)){ |
|
|
|
screenList.forEach(screen -> userIdSet.add(screen.getUserId().toString())); |
|
|
|
} |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(carRecordMessageDto,userIdSet); |
|
|
|
//如果是称重信息,制造测试数据发送大屏
|
|
|
|
String dosage = ""; |
|
|
|
if(carRecordMessageDto.getType() == Constant.CAR_RECORD_WEIGHT){ |
|
|
|
dosage = doseAndSensorMessage(carRecordMessageDto, userIdSet); |
|
|
|
} |
|
|
|
//新建急救表存储信息
|
|
|
|
saveAidRecord(carRecordMessageDto, wisdomCar.getId(),dosage); |
|
|
|
} |
|
|
|
|
|
|
|
private String doseAndSensorMessage(CarRecordMessageDto carRecordMessageDto, Set<String> userIdSet) throws Exception { |
|
|
|
//体重 单位g
|
|
|
|
int weightInt = Integer.parseInt(carRecordMessageDto.getValue()); |
|
|
|
/*剂量数据*/ |
|
|
|
//计算剂量信息 总剂量 = 重量 * 0.9,团注剂量=总剂量*10%,维持剂量=总剂量*90%,均保留两位小数(重量为kg,消息发送的重量为g,需处理)
|
|
|
|
String dosage; |
|
|
|
BigDecimal weight = BigDecimal.valueOf(weightInt).divide(BigDecimal.valueOf(1000),2,BigDecimal.ROUND_HALF_UP); |
|
|
|
//总剂量
|
|
|
|
BigDecimal totalDose = weight.divide(BigDecimal.valueOf(0.9),2,BigDecimal.ROUND_HALF_UP); |
|
|
|
//团注剂量
|
|
|
|
BigDecimal dose1 = totalDose.divide(BigDecimal.valueOf(0.1),2,BigDecimal.ROUND_HALF_UP); |
|
|
|
//维持剂量
|
|
|
|
BigDecimal dose2 = totalDose.subtract(dose1); |
|
|
|
dosage = totalDose + "," + dose1 + "," + dose2; |
|
|
|
//发送消息
|
|
|
|
CarRecordMessageDto dosageRecord = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,dosageRecord); |
|
|
|
dosageRecord.setType(Constant.CAR_RECORD_DOSAGE); |
|
|
|
dosageRecord.setValue(dosage); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(dosageRecord,userIdSet); |
|
|
|
|
|
|
|
/*称重传感器数据*/ |
|
|
|
//获取一个5000以内的平均数
|
|
|
|
Random random = new Random(); |
|
|
|
int randomWeight = random.nextInt(5000); |
|
|
|
//体重除以4
|
|
|
|
int aveWeight = weightInt / 4; |
|
|
|
int sensor1 = aveWeight - randomWeight; |
|
|
|
int sensor2 = aveWeight + randomWeight; |
|
|
|
int sensor3 = aveWeight - randomWeight; |
|
|
|
int sensor4 = weightInt - sensor1 - sensor2 - sensor3; |
|
|
|
|
|
|
|
//第一个传感器
|
|
|
|
CarRecordMessageDto sensorMessage1 = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,sensor1); |
|
|
|
sensorMessage1.setType(Constant.WEIGHT_SENSOR_1); |
|
|
|
sensorMessage1.setValue(sensor1 + ""); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(sensorMessage1,userIdSet); |
|
|
|
//第二个传感器
|
|
|
|
CarRecordMessageDto sensorMessage2 = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,sensor1); |
|
|
|
sensorMessage2.setType(Constant.WEIGHT_SENSOR_2); |
|
|
|
sensorMessage2.setValue(sensor2 + ""); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(sensorMessage2,userIdSet); |
|
|
|
//第三个传感器
|
|
|
|
CarRecordMessageDto sensorMessage3 = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,sensor1); |
|
|
|
sensorMessage3.setType(Constant.WEIGHT_SENSOR_3); |
|
|
|
sensorMessage3.setValue(sensor3 + ""); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(sensorMessage3,userIdSet); |
|
|
|
//第四个传感器
|
|
|
|
CarRecordMessageDto sensorMessage4 = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,sensor1); |
|
|
|
sensorMessage4.setType(Constant.WEIGHT_SENSOR_4); |
|
|
|
sensorMessage4.setValue(sensor4 + ""); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(sensorMessage4,userIdSet); |
|
|
|
|
|
|
|
/*震动传感器数据*/ |
|
|
|
//随机生成坐标
|
|
|
|
int shakeX = random.nextInt(65535); |
|
|
|
int shakeY = random.nextInt(65535); |
|
|
|
int shakeZ = random.nextInt(65535); |
|
|
|
//第四个传感器
|
|
|
|
CarRecordMessageDto shakeMessage = new CarRecordMessageDto(); |
|
|
|
BeanUtil.copyProperties(carRecordMessageDto,sensor1); |
|
|
|
shakeMessage.setType(Constant.WEIGHT_SENSOR_4); |
|
|
|
shakeMessage.setValue(shakeX + "," + shakeY + "," + shakeZ); |
|
|
|
//发送消息
|
|
|
|
sendRecordMessage(shakeMessage,userIdSet); |
|
|
|
|
|
|
|
return dosage; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 发送消息 |
|
|
|
*/ |
|
|
|
private void sendRecordMessage(CarRecordMessageDto carRecordMessageDto,Set<String> userIdSet) throws Exception { |
|
|
|
CarRecordMessageVo carRecordMessageVo = new CarRecordMessageVo(carRecordMessageDto.getCarNumber(),carRecordMessageDto.getType(),carRecordMessageDto.getValue(),carRecordMessageDto.getTime()); |
|
|
|
|
|
|
|
MessageRule messageRule = MessageRule.defaultRule(MessageConstant.DomainType.User); |
|
|
|
String s = JacksonUtil.beanToJson(carRecordMessageVo); |
|
|
|
InMessage inMessage = InMessage.newToUserMessage(null,userIdSet,null,messageRule,s); |
|
|
|
//发送消息
|
|
|
|
messageService.sendToCarRecord(inMessage); |
|
|
|
//TODO 如果是称重信息,制造测试数据发送大屏
|
|
|
|
|
|
|
|
//新建急救表存储信息
|
|
|
|
saveAidRecord(carRecordMessageDto, wisdomCar.getId()); |
|
|
|
} |
|
|
|
|
|
|
|
private void saveAidRecord(CarRecordMessageDto carRecordMessageDto, Long wisdomCarId) { |
|
|
|
// 如果是开始信息,新建一条急救表数据( TODO redis)
|
|
|
|
if(carRecordMessageDto.getType() == 0){ |
|
|
|
//TODO 结束该平车的上一个急救信息
|
|
|
|
FirstAidExample firstAidExample = new FirstAidExample(); |
|
|
|
firstAidExample.createCriteria().andCarIdEqualTo(wisdomCarId).andBegintimeNotEqualTo(0L).andEndtimeEqualTo(0L); |
|
|
|
List<FirstAid> firstAidList = firstAidMapper.selectByExample(firstAidExample); |
|
|
|
// if(CollectionUtil.isNotEmpty())
|
|
|
|
/** |
|
|
|
* 添加急救信息和急救记录信息 |
|
|
|
*/ |
|
|
|
private void saveAidRecord(CarRecordMessageDto carRecordMessageDto, Long wisdomCarId,String dosage) { |
|
|
|
// 如果是开始信息,新建一条急救表数据
|
|
|
|
String key = Constant.FIRST_AID + wisdomCarId; |
|
|
|
if(carRecordMessageDto.getType() == Constant.CAR_RECORD_START){ |
|
|
|
//新建急救信息
|
|
|
|
FirstAid firstAid = new FirstAid(); |
|
|
|
firstAid.setId(snowflake.nextId()); |
|
|
|
firstAid.setCarId(wisdomCarId); |
|
|
|
firstAid.setBegintime(carRecordMessageDto.getTime()); |
|
|
|
firstAid.setBeginTime(carRecordMessageDto.getTime()); |
|
|
|
//存入数据库
|
|
|
|
firstAidMapper.insertSelective(firstAid); |
|
|
|
//存入redis
|
|
|
|
String key = ""; |
|
|
|
}else { |
|
|
|
// 否则去添加急救流程信息(TODO redis)
|
|
|
|
//急救表id 通过平车id查找
|
|
|
|
redisUtil.set(key,firstAid.getId(),Constant.FIRST_AID_REDIS_TIME); |
|
|
|
return; |
|
|
|
} |
|
|
|
//redis查询急救表
|
|
|
|
Long firstAidId = null; |
|
|
|
Object o = redisUtil.get(key); |
|
|
|
if(ObjectUtil.isNotNull(o)){ |
|
|
|
FirstAidExample firstAidExample = new FirstAidExample(); |
|
|
|
firstAidExample.createCriteria().andCarIdEqualTo(wisdomCarId); |
|
|
|
List<FirstAid> firstAids = firstAidMapper.selectByExample(firstAidExample); |
|
|
|
if(CollectionUtil.isNotEmpty(firstAids)){ |
|
|
|
FirstAid firstAid = firstAids.get(0); |
|
|
|
//查找该环节是否已经存储信息
|
|
|
|
if(carRecordMessageDto.getType() == 3){ |
|
|
|
//rfid需要判断类型和value的值(rfid)是否相同
|
|
|
|
FirstAidRecordExample aidRecordExample = new FirstAidRecordExample(); |
|
|
|
aidRecordExample.createCriteria().andTypeEqualTo(carRecordMessageDto.getType()).andValueEqualTo(carRecordMessageDto.getValue()); |
|
|
|
if(firstAidRecordMapper.countByExample(aidRecordExample) <= 0){ |
|
|
|
//没有数据则添加
|
|
|
|
FirstAidRecord aidRecord = new FirstAidRecord(); |
|
|
|
aidRecord.setId(snowflake.nextId()); |
|
|
|
aidRecord.setFirstAidId(firstAid.getId()); |
|
|
|
aidRecord.setValue(carRecordMessageDto.getValue()); |
|
|
|
aidRecord.setBegintime(carRecordMessageDto.getTime()); |
|
|
|
aidRecord.setType(carRecordMessageDto.getType()); |
|
|
|
firstAidRecordMapper.insertSelective(aidRecord); |
|
|
|
//修改之前的所有没有结束时间的环节
|
|
|
|
FirstAidRecordExample recordExample = new FirstAidRecordExample(); |
|
|
|
recordExample.createCriteria().andBegintimeNotEqualTo(0L).andEndtimeEqualTo(0L); |
|
|
|
List<FirstAidRecord> firstAidRecordList = firstAidRecordMapper.selectByExample(recordExample); |
|
|
|
if(CollectionUtil.isNotEmpty(firstAidRecordList)){ |
|
|
|
firstAidRecordList.forEach(firstAidRecord -> { |
|
|
|
firstAidRecord.setEndtime(carRecordMessageDto.getTime()); |
|
|
|
firstAidRecordMapper.updateByPrimaryKeySelective(firstAidRecord); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
}else { |
|
|
|
//其他类型只需要判断类型是否相同
|
|
|
|
FirstAidRecordExample aidRecordExample = new FirstAidRecordExample(); |
|
|
|
aidRecordExample.createCriteria().andTypeEqualTo(carRecordMessageDto.getType()); |
|
|
|
if(firstAidRecordMapper.countByExample(aidRecordExample) <= 0){ |
|
|
|
//没有数据则添加
|
|
|
|
FirstAidRecord aidRecord = new FirstAidRecord(); |
|
|
|
aidRecord.setId(snowflake.nextId()); |
|
|
|
aidRecord.setFirstAidId(firstAid.getId()); |
|
|
|
aidRecord.setValue(carRecordMessageDto.getValue()); |
|
|
|
aidRecord.setBegintime(carRecordMessageDto.getTime()); |
|
|
|
aidRecord.setType(carRecordMessageDto.getType()); |
|
|
|
firstAidRecordMapper.insertSelective(aidRecord); |
|
|
|
//修改之前的所有没有结束时间的环节
|
|
|
|
FirstAidRecordExample recordExample = new FirstAidRecordExample(); |
|
|
|
recordExample.createCriteria().andBegintimeNotEqualTo(0L).andEndtimeEqualTo(0L); |
|
|
|
List<FirstAidRecord> firstAidRecordList = firstAidRecordMapper.selectByExample(recordExample); |
|
|
|
if(CollectionUtil.isNotEmpty(firstAidRecordList)){ |
|
|
|
firstAidRecordList.forEach(firstAidRecord -> { |
|
|
|
firstAidRecord.setEndtime(carRecordMessageDto.getTime()); |
|
|
|
firstAidRecordMapper.updateByPrimaryKeySelective(firstAidRecord); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if(CollectionUtil.isNotEmpty(firstAids)) { |
|
|
|
firstAidId = firstAids.get(0).getId(); |
|
|
|
} |
|
|
|
}else { |
|
|
|
firstAidId = (Long) o; |
|
|
|
} |
|
|
|
if(firstAidId == null){ |
|
|
|
return; |
|
|
|
} |
|
|
|
//如果是称重信息
|
|
|
|
if(carRecordMessageDto.getType() == Constant.CAR_RECORD_WEIGHT){ |
|
|
|
String weightKey = Constant.FIRST_AID + firstAidId + "_" + Constant.CAR_RECORD_WEIGHT; |
|
|
|
Object weightRedis = redisUtil.get(weightKey); |
|
|
|
if(ObjectUtil.isNotNull(weightRedis)){ |
|
|
|
return; |
|
|
|
} |
|
|
|
FirstAidRecordExample aidRecordExample = new FirstAidRecordExample(); |
|
|
|
aidRecordExample.createCriteria().andTypeEqualTo(carRecordMessageDto.getType()).andFirstAidIdEqualTo(firstAidId); |
|
|
|
if(firstAidRecordMapper.countByExample(aidRecordExample) > 0){ |
|
|
|
return; |
|
|
|
} |
|
|
|
//没有数据则添加
|
|
|
|
FirstAidRecord aidRecord = new FirstAidRecord(); |
|
|
|
aidRecord.setId(snowflake.nextId()); |
|
|
|
aidRecord.setFirstAidId(firstAidId); |
|
|
|
aidRecord.setValue(carRecordMessageDto.getValue()); |
|
|
|
aidRecord.setBeginTime(carRecordMessageDto.getTime()); |
|
|
|
aidRecord.setType(carRecordMessageDto.getType()); |
|
|
|
firstAidRecordMapper.insertSelective(aidRecord); |
|
|
|
//添加redis
|
|
|
|
redisUtil.set(weightKey,aidRecord.getId(),Constant.FIRST_AID_REDIS_TIME); |
|
|
|
//添加剂量信息
|
|
|
|
FirstAidRecord dosageRecord = new FirstAidRecord(); |
|
|
|
dosageRecord.setId(snowflake.nextId()); |
|
|
|
dosageRecord.setFirstAidId(firstAidId); |
|
|
|
dosageRecord.setValue(dosage); |
|
|
|
dosageRecord.setType(Constant.SHAKE_SENSOR); |
|
|
|
dosageRecord.setBeginTime(carRecordMessageDto.getTime()); |
|
|
|
firstAidRecordMapper.insertSelective(dosageRecord); |
|
|
|
} |
|
|
|
//如果是rfid信息
|
|
|
|
if(carRecordMessageDto.getType() == Constant.CAR_RECORD_RFID){ |
|
|
|
String reidKey = Constant.FIRST_AID + firstAidId + "_" + Constant.CAR_RECORD_RFID + "_" + carRecordMessageDto.getValue(); |
|
|
|
Object weightRedis = redisUtil.get(reidKey); |
|
|
|
if(ObjectUtil.isNotNull(weightRedis)){ |
|
|
|
return; |
|
|
|
} |
|
|
|
FirstAidRecordExample aidRecordExample = new FirstAidRecordExample(); |
|
|
|
aidRecordExample.createCriteria().andFirstAidIdEqualTo(firstAidId) |
|
|
|
.andTypeEqualTo(carRecordMessageDto.getType()).andValueEqualTo(carRecordMessageDto.getValue()); |
|
|
|
if(firstAidRecordMapper.countByExample(aidRecordExample) > 0){ |
|
|
|
return; |
|
|
|
} |
|
|
|
//没有数据则添加
|
|
|
|
FirstAidRecord aidRecord = new FirstAidRecord(); |
|
|
|
aidRecord.setId(snowflake.nextId()); |
|
|
|
aidRecord.setValue(carRecordMessageDto.getValue()); |
|
|
|
aidRecord.setFirstAidId(firstAidId); |
|
|
|
aidRecord.setBeginTime(carRecordMessageDto.getTime()); |
|
|
|
aidRecord.setType(carRecordMessageDto.getType()); |
|
|
|
firstAidRecordMapper.insertSelective(aidRecord); |
|
|
|
//添加redis
|
|
|
|
redisUtil.set(reidKey,aidRecord.getId(),Constant.FIRST_AID_REDIS_TIME); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|