|
|
@@ -0,0 +1,204 @@
|
|
|
+package cn.tr.module.smart.common.config;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.tr.core.annotation.TenantIgnore;
|
|
|
+import cn.tr.core.utils.JsonUtils;
|
|
|
+import cn.tr.module.api.sys.tenant.SysTenantApi;
|
|
|
+import cn.tr.module.api.sys.tenant.SysTenantPojo;
|
|
|
+import cn.tr.module.smart.common.dto.NbPumpInfusionDTO;
|
|
|
+import cn.tr.module.smart.common.enums.FlowStatusEnum;
|
|
|
+import cn.tr.module.smart.common.enums.InfusionBindType;
|
|
|
+import cn.tr.module.smart.common.enums.RabbitMQConstant;
|
|
|
+import cn.tr.module.smart.common.mapper.BizDeviceAlarmMapper;
|
|
|
+import cn.tr.module.smart.common.mapper.BizDeviceHistoryMapper;
|
|
|
+import cn.tr.module.smart.common.mapper.BizDeviceMapper;
|
|
|
+import cn.tr.module.smart.common.mapper.BizInfusionHistoryMapper;
|
|
|
+import cn.tr.module.smart.common.po.*;
|
|
|
+import cn.tr.module.smart.common.repository.*;
|
|
|
+import cn.tr.plugin.security.bo.UserLoginInfoBO;
|
|
|
+import cn.tr.plugin.security.context.LoginUserContextHolder;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.function.BiFunction;
|
|
|
+import java.util.function.Function;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 公众号消息推送
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
+public class MpMsgPushListener {
|
|
|
+ private final SysTenantApi sysTenantApi;
|
|
|
+ private final BizInfusionClinicRepository infusionClinicRepository;
|
|
|
+ private final BizInfusionHistoryRepository infusionHistoryRepository;
|
|
|
+ private final BizPatientRepository patientRepository;
|
|
|
+ private final BizDeviceHistoryRepository deviceHistoryRepository;
|
|
|
+ private final BizDeviceRepository deviceRepository;
|
|
|
+ private final BizDeviceAlarmRepository deviceAlarmRepository;
|
|
|
+ @RabbitListener(queues = RabbitMQConstant.QUEUE_PATIENT_MONITOR)
|
|
|
+ @TenantIgnore
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void handlePatientMonitorMessage(String message) {
|
|
|
+ UserLoginInfoBO userLoginInfoBO = new UserLoginInfoBO();
|
|
|
+ userLoginInfoBO.setUserId("1");
|
|
|
+ LoginUserContextHolder.setUser(userLoginInfoBO);
|
|
|
+ log.debug("接收到网络泵消息: {}", message);
|
|
|
+ // 在这里处理接收到的消息
|
|
|
+ processPatientMonitorData(message);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void processPatientMonitorData(String message) {
|
|
|
+ log.info("开始处理患者监护数据");
|
|
|
+
|
|
|
+ // 解析消息为NbPumpInfusionDTO对象
|
|
|
+ NbPumpInfusionDTO source = JsonUtils.parseObject(message, NbPumpInfusionDTO.class);
|
|
|
+ if (ObjectUtil.isNull(source)) {
|
|
|
+ log.warn("无法解析患者监护消息,消息内容: {}", message);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.debug("成功解析网络泵数据: {}", source);
|
|
|
+
|
|
|
+ // 根据医院编码查找租户信息
|
|
|
+ log.debug("开始查找医院信息,医院编码: {}", source.getHospitalCode());
|
|
|
+ SysTenantPojo tenant = sysTenantApi.selectByHospitalCode(source.getHospitalCode());
|
|
|
+ if(ObjectUtil.isNull(tenant)){
|
|
|
+ log.warn("未找到医院编码: {}", source.getHospitalCode());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.debug("成功找到医院信息,医院名称: {}, 租户ID: {}", tenant.getName(), tenant.getTenantId());
|
|
|
+ BizInfusionHistoryPO infusionHistory = BizInfusionHistoryMapper.INSTANCE.convertPO(source);
|
|
|
+ BizDeviceHistoryPO deviceHistory = BizDeviceHistoryMapper.INSTANCE.convertPO(source);
|
|
|
+
|
|
|
+ infusionHistory.setTenantId(tenant.getTenantId());
|
|
|
+ deviceHistory.setTenantId(tenant.getTenantId());
|
|
|
+
|
|
|
+ deviceHistoryRepository.insert(deviceHistory);
|
|
|
+ log.debug("开始保存或更新输液历史记录,记录ID: {}", infusionHistory.getId());
|
|
|
+ BizInfusionHistoryPO oldInfusionHistory = infusionHistoryRepository.selectById(infusionHistory.getId());
|
|
|
+ if (ObjectUtil.isNotNull(oldInfusionHistory)) {
|
|
|
+ log.debug("更新已存在的输液历史记录");
|
|
|
+ infusionHistoryRepository.updateById(infusionHistory);
|
|
|
+ }else {
|
|
|
+ log.debug("插入新的输液历史记录");
|
|
|
+ infusionHistoryRepository.insert(infusionHistory);
|
|
|
+ }
|
|
|
+ log.info("输液历史记录保存完成");
|
|
|
+ //保存或者记录设备信息
|
|
|
+ BizDevicePO device = BizDeviceMapper.INSTANCE.convertPO(source);
|
|
|
+ device.setTenantId(tenant.getTenantId());
|
|
|
+ BizDevicePO oldDevice = deviceRepository.selectById(device);
|
|
|
+ if (ObjectUtil.isNotNull(oldDevice)) {
|
|
|
+ log.debug("更新已存在的设备记录");
|
|
|
+ deviceRepository.updateById(device);
|
|
|
+ }else {
|
|
|
+ log.debug("插入新的设备记录");
|
|
|
+ deviceRepository.insert(device);
|
|
|
+ }
|
|
|
+ //处理设备报警信息
|
|
|
+ BizDeviceAlarmPO bizDeviceAlarmPO = handleAlarmData(infusionHistory,oldInfusionHistory, deviceHistory);
|
|
|
+ if(ObjectUtil.isNotNull(bizDeviceAlarmPO)){
|
|
|
+ deviceAlarmRepository.insert(bizDeviceAlarmPO);
|
|
|
+ }
|
|
|
+ // 根据住院号查找患者信息
|
|
|
+ log.debug("开始精确查找患者信息,住院号: {}", source.getPatientCode());
|
|
|
+ BizPatientPO patientPO=patientRepository.selectOne(new LambdaQueryWrapper<BizPatientPO>()
|
|
|
+ .eq(BizPatientPO::getPatientCode, source.getPatientCode())
|
|
|
+ .eq(BizPatientPO::getTenantId,tenant.getTenantId())
|
|
|
+ .last("limit 1"));
|
|
|
+
|
|
|
+ // 如果精确查找未找到,则进行模糊查找
|
|
|
+ if(ObjectUtil.isNull(patientPO)){
|
|
|
+ log.debug("精确查找未找到患者,开始模糊查找,住院号: {}", infusionHistory.getPatientCode());
|
|
|
+ patientPO=patientRepository.selectMayBeLinkedPatient(infusionHistory.getPatientCode(),infusionHistory.getTenantId());
|
|
|
+ }
|
|
|
+ // 如果找到相似的住院号
|
|
|
+ if (ObjectUtil.isNotNull(patientPO)) {
|
|
|
+ BizInfusionClinicPO infusionClinic = new BizInfusionClinicPO();
|
|
|
+ infusionClinic.setInfusionId(infusionHistory.getId());
|
|
|
+ infusionClinic.setClinicId(patientPO.getCurrentClinicId());
|
|
|
+ infusionClinic.setType(InfusionBindType.autoBind);
|
|
|
+ //判断有没有被绑定
|
|
|
+ BizInfusionClinicPO infusionClinicPO = infusionClinicRepository.selectOne(new LambdaQueryWrapper<BizInfusionClinicPO>()
|
|
|
+ .eq(BizInfusionClinicPO::getClinicId, patientPO.getCurrentClinicId())
|
|
|
+ .last("limit 1"));
|
|
|
+ if(StrUtil.equals(infusionClinicPO.getInfusionId(),infusionHistory.getId())){
|
|
|
+ //已绑定
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (ObjectUtil.isNotNull(infusionClinicPO)) {
|
|
|
+ if(InfusionBindType.autoBind.equals(infusionClinicPO.getType())){
|
|
|
+ //如果是自动绑的,则判断两个泵头的先后顺序
|
|
|
+ BizInfusionHistoryPO preInfusionHistory = infusionHistoryRepository.selectById(infusionClinicPO.getInfusionId());
|
|
|
+ if (ObjectUtil.isNotNull(preInfusionHistory)) {
|
|
|
+ infusionClinicRepository.deleteById(infusionClinicPO.getId());
|
|
|
+ infusionClinicRepository.insert(infusionClinic);
|
|
|
+ log.info("找到匹配的患者信息,患者ID: {}", patientPO.getId());
|
|
|
+ }else {
|
|
|
+ if(ObjectUtil.compare(infusionHistory.getInfusionStartTime(),preInfusionHistory.getInfusionStartTime())>0){
|
|
|
+ infusionClinicRepository.deleteById(infusionClinicPO.getId());
|
|
|
+ infusionClinicRepository.insert(infusionClinic);
|
|
|
+ log.info("找到匹配的患者信息,患者ID: {}", patientPO.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ infusionClinicRepository.insert(infusionClinic);
|
|
|
+ log.info("找到匹配的患者信息,患者ID: {}", patientPO.getId());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.warn("未找到匹配的患者信息,住院号: {}", source.getPatientCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("患者监护数据处理完成");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 处理报警信息
|
|
|
+ * @author wangzl
|
|
|
+ * @date 2025/8/8
|
|
|
+ */
|
|
|
+ public BizDeviceAlarmPO handleAlarmData(BizInfusionHistoryPO infusionHistory, BizInfusionHistoryPO oldInfusionHistory, BizDeviceHistoryPO deviceHistory) {
|
|
|
+ //如果输入数据相同,则不处理
|
|
|
+ if(isEqual(infusionHistory, oldInfusionHistory)){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ log.info("开始处理报警信息 新输注ID {} ,设备ID {}", infusionHistory.getId(), deviceHistory.getId());
|
|
|
+ BizDeviceAlarmPO alarmPO = BizDeviceAlarmMapper.INSTANCE.convertInfusionToPO(infusionHistory);
|
|
|
+ alarmPO.setDeviceType(deviceHistory.getDeviceType());
|
|
|
+ alarmPO.setDeviceId(deviceHistory.getId());
|
|
|
+ Function<BizInfusionHistoryPO, Boolean> check = o -> StrUtil.isNotBlank(o.getDeviceAlarm())
|
|
|
+ && !o.getDeviceAlarm().equals(FlowStatusEnum.None.name());
|
|
|
+ alarmPO.setAlarm(check.apply(infusionHistory));
|
|
|
+ log.info("报警信息处理完成 ");
|
|
|
+ return alarmPO;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 校验输液历史记录是否相同
|
|
|
+ * @author wangzl
|
|
|
+ * @date 2025/8/8
|
|
|
+ */
|
|
|
+ public boolean isEqual(BizInfusionHistoryPO infusionHistory, BizInfusionHistoryPO oldInfusionHistory) {
|
|
|
+ if (infusionHistory == null && oldInfusionHistory == null) return true;
|
|
|
+ if (oldInfusionHistory == null || infusionHistory == null) return false;
|
|
|
+ List<BiFunction<BizInfusionHistoryPO, BizInfusionHistoryPO, Boolean>> checks = Arrays.asList(
|
|
|
+ (o, n) -> Objects.equals(o.getDeviceAlarm(), n.getDeviceAlarm()),
|
|
|
+ (o, n) -> Objects.equals(o.getWarnFlow(), n.getWarnFlow()),
|
|
|
+ (o, n) -> Objects.equals(o.getWarnAnalgesicPoor(), n.getWarnAnalgesicPoor()),
|
|
|
+ (o, n) -> Objects.equals(o.getWarnWillFinished(), n.getWarnWillFinished()),
|
|
|
+ (o, n) -> Objects.equals(o.getWarnLowBattery(), n.getWarnLowBattery())
|
|
|
+ );
|
|
|
+ return checks.stream().allMatch(check -> check.apply(oldInfusionHistory, infusionHistory));
|
|
|
+ }
|
|
|
+
|
|
|
+}
|