diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/api/StatisticsController.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/api/StatisticsController.java index 109ef427..c99a1ade 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/api/StatisticsController.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/api/StatisticsController.java @@ -13,5 +13,4 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/statistics") public class StatisticsController { - } diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/Message/CarRecordMessageDto.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/Message/CarRecordMessageDto.java index ce72b5bd..d1811432 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/Message/CarRecordMessageDto.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/Message/CarRecordMessageDto.java @@ -12,7 +12,7 @@ public class CarRecordMessageDto { */ private String carNumber; /** - * 类型 0:开始 1:体重 2:剂量 3:rfid + * 类型 0开始 1体重 2rfid, 3称重一 4称重二 5称重三 6称重四 7震动 8剂量 */ private byte type; /** diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/StatisticsDto.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/StatisticsDto.java new file mode 100644 index 00000000..027782bc --- /dev/null +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/dto/StatisticsDto.java @@ -0,0 +1,20 @@ +package com.ccsens.wisdomcar.bean.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 逗 + */ +@Data +public class StatisticsDto { + + @Data + @ApiModel("医院id") + public static class Hospital{ + @ApiModelProperty("医院id") + private Long id; + } + +} diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/vo/StatisticsVo.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/vo/StatisticsVo.java new file mode 100644 index 00000000..23a7aa4f --- /dev/null +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/bean/vo/StatisticsVo.java @@ -0,0 +1,20 @@ +package com.ccsens.wisdomcar.bean.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 逗 + */ +@Data +public class StatisticsVo { + + + @Data + @ApiModel("医院id") + public static class FastEdResult{ + @ApiModelProperty("医院id") + private Long id; + } +} diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/rabbitMQ/RabbitController.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/rabbitMQ/RabbitController.java index 02c25c0f..bbccaf20 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/rabbitMQ/RabbitController.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/rabbitMQ/RabbitController.java @@ -9,6 +9,7 @@ import com.ccsens.util.config.RabbitMQConfig; import com.ccsens.wisdomcar.bean.dto.Message.CarRecordMessageDto; import com.ccsens.wisdomcar.service.IRecordService; import com.ccsens.wisdomcar.service.RecordService; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitHandler; @@ -19,7 +20,7 @@ import javax.annotation.Resource; import java.util.List; import java.util.Set; - +@Slf4j @Component @RabbitListener(queues = RabbitMQConfig.WISDOM_CAR) public class RabbitController { @@ -44,7 +45,12 @@ public class RabbitController { if(ObjectUtil.isNull(carRecordMessageDto)){ return; } - recordService.disposeMessage(carRecordMessageDto); + try { + recordService.disposeMessage(carRecordMessageDto); + } catch (Exception e) { + log.error("处理平车信息异常",e); + e.printStackTrace(); + } }); } diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/IRecordService.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/IRecordService.java index 424e20fa..1debd2fc 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/IRecordService.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/IRecordService.java @@ -4,9 +4,11 @@ import com.ccsens.wisdomcar.bean.dto.Message.CarRecordMessageDto; import com.fasterxml.jackson.core.JsonProcessingException; public interface IRecordService { + /** * 后台接受消息并处理 * @param carRecordMessageDto 接收到的消息 + * @throws Exception */ - void disposeMessage(CarRecordMessageDto carRecordMessageDto) throws JsonProcessingException, Exception; + void disposeMessage(CarRecordMessageDto carRecordMessageDto) throws Exception; } diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/RecordService.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/RecordService.java index 0953377e..58fd2010 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/RecordService.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/service/RecordService.java @@ -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 userIdSet = new HashSet<>(); - userIdSet.add("123456"); + ScreenExample screenExample = new ScreenExample(); + screenExample.createCriteria().andHospitalIdEqualTo(0L).andShowTypeEqualTo((byte) 0); + List 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 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 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 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 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 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 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); } } } diff --git a/wisdomcar/src/main/java/com/ccsens/wisdomcar/util/Constant.java b/wisdomcar/src/main/java/com/ccsens/wisdomcar/util/Constant.java index 1922824b..eb61ac9a 100644 --- a/wisdomcar/src/main/java/com/ccsens/wisdomcar/util/Constant.java +++ b/wisdomcar/src/main/java/com/ccsens/wisdomcar/util/Constant.java @@ -1,14 +1,36 @@ package com.ccsens.wisdomcar.util; + /** - * @description: - * @author: whj - * @time: 2020/8/13 17:14 + * @author 逗 */ public class Constant { /** * 急救信息 */ - public static final long SINGLE_ROLL_30_S = 2011; + public static final String FIRST_AID = "first_aid_"; + /** + * redis存储时间:五小时 (秒) + */ + public static final Long FIRST_AID_REDIS_TIME = 5 * 60 * 60L; + /**开始*/ + public static final byte CAR_RECORD_START = 0; + /**体重*/ + public static final byte CAR_RECORD_WEIGHT = 1; + /**rfid*/ + public static final byte CAR_RECORD_RFID = 2; + /**称重传感器一*/ + public static final byte WEIGHT_SENSOR_1 = 3; + /**称重传感器二*/ + public static final byte WEIGHT_SENSOR_2 = 4; + /**称重传感器三*/ + public static final byte WEIGHT_SENSOR_3 = 5; + /**称重传感器四*/ + public static final byte WEIGHT_SENSOR_4 = 6; + /**振动传感器(倾角传感器)*/ + public static final byte SHAKE_SENSOR = 7; + /**剂量*/ + public static final byte CAR_RECORD_DOSAGE = 8; + }