|
|
@@ -1,35 +1,26 @@
|
|
|
package cn.tr.module.smart.common.config.listener;
|
|
|
|
|
|
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.module.smart.common.po.BizMpPublishTaskPO;
|
|
|
+import cn.tr.module.smart.common.repository.BizClinicRoomRepository;
|
|
|
+import cn.tr.module.smart.common.repository.BizMpPublishTaskRepository;
|
|
|
+import cn.tr.module.smart.wx.config.WxTemplateSendHelper;
|
|
|
+import cn.tr.module.smart.wx.dto.BizMpPublishInfoDTO;
|
|
|
import cn.tr.plugin.security.bo.UserLoginInfoBO;
|
|
|
import cn.tr.plugin.security.context.LoginUserContextHolder;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
|
|
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.List;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Objects;
|
|
|
-import java.util.function.BiFunction;
|
|
|
-import java.util.function.Function;
|
|
|
|
|
|
/**
|
|
|
* 公众号消息推送
|
|
|
@@ -38,167 +29,59 @@ import java.util.function.Function;
|
|
|
@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)
|
|
|
+ private final RabbitTemplate rabbitTemplate;
|
|
|
+ private final BizMpPublishTaskRepository bizMpPublishTaskRepository;
|
|
|
+ private final BizClinicRoomRepository clinicRoomRepository;
|
|
|
+ private final WxTemplateSendHelper wxTemplateSendHelper;
|
|
|
+ /**
|
|
|
+ * 定时推送问卷
|
|
|
+ * @param taskId 推送任务id
|
|
|
+ */
|
|
|
+ @RabbitListener(queues = RabbitMQConstant.QUEUE_MP_PUSH)
|
|
|
@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());
|
|
|
+ public void mpPush(String taskId) {
|
|
|
+ log.info("开始执行公众号发布任务,任务ID: {}", taskId);
|
|
|
+ BizMpPublishTaskPO bizMpPublishTaskPO = bizMpPublishTaskRepository.selectById(taskId);
|
|
|
+ if (ObjectUtil.isNull(bizMpPublishTaskPO)) {
|
|
|
+ log.info("任务不存在,任务ID: {}", taskId);
|
|
|
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"));
|
|
|
+ UserLoginInfoBO userLoginInfoBO = UserLoginInfoBO.builder()
|
|
|
+ .userId(bizMpPublishTaskPO.getCreateBy())
|
|
|
+ .tenantId(bizMpPublishTaskPO.getTenantId())
|
|
|
+ .build();
|
|
|
+ LoginUserContextHolder.setUser(userLoginInfoBO);
|
|
|
|
|
|
- // 如果精确查找未找到,则进行模糊查找
|
|
|
- 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())){
|
|
|
- //已绑定
|
|
|
+ log.info("获取到任务信息,任务ID: {}, 任务类型: {}, 已执行次数: {}, 总次数: {}", taskId, bizMpPublishTaskPO.getType(), bizMpPublishTaskPO.getPublishCount(), bizMpPublishTaskPO.getTotalCount());
|
|
|
+ if (!Objects.equals(bizMpPublishTaskPO.getPublishCount(), bizMpPublishTaskPO.getTotalCount())) {
|
|
|
+ log.info("满足标准发送推送公众号,任务ID: {}", taskId);
|
|
|
+ //更新执行次数
|
|
|
+ int newPublishCount = bizMpPublishTaskPO.getPublishCount() + 1;
|
|
|
+ log.info("更新任务执行次数,任务ID: {}, 更新前次数: {}, 更新后次数: {}", taskId, bizMpPublishTaskPO.getPublishCount(), newPublishCount);
|
|
|
+ bizMpPublishTaskRepository.update(null,new LambdaUpdateWrapper<BizMpPublishTaskPO>()
|
|
|
+ .set(BizMpPublishTaskPO::getPublishCount, newPublishCount)
|
|
|
+ .eq(BizMpPublishTaskPO::getId,taskId));
|
|
|
+ //执行推送数据
|
|
|
+ log.debug("执行推送数据逻辑,任务ID: {}", taskId);
|
|
|
+ BizMpPublishInfoDTO publishInfo=clinicRoomRepository.selectMpPushTaskInfoById(bizMpPublishTaskPO.getClinicRoomId());
|
|
|
+ log.info("获取推送信息,任务ID: {}, 诊室ID: {}, OpenID是否存在: {}", taskId, bizMpPublishTaskPO.getClinicRoomId(), ObjectUtil.isNotNull(publishInfo.getOpenId()));
|
|
|
+ if(ObjectUtil.isNull(publishInfo.getOpenId())){
|
|
|
+ log.info("公众号用户openId不存在,任务ID: {}", taskId);
|
|
|
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());
|
|
|
+ try {
|
|
|
+ log.info("开始发送模板消息,任务ID: {}, OpenID: {}, 消息类型: {}", taskId, publishInfo.getOpenId(), bizMpPublishTaskPO.getType());
|
|
|
+ wxTemplateSendHelper.sendMsg(publishInfo, bizMpPublishTaskPO.getType());
|
|
|
+ log.info("模板消息发送成功,任务ID: {}", taskId);
|
|
|
+ }catch (Exception e){
|
|
|
+ log.error("模板消息发送失败,任务ID: {}", taskId, e);
|
|
|
+ bizMpPublishTaskRepository.deleteById(taskId);
|
|
|
}
|
|
|
} else {
|
|
|
- log.warn("未找到匹配的患者信息,住院号: {}", source.getPatientCode());
|
|
|
+ log.info("任务执行次数已完成,准备清理任务数据,任务ID: {}", taskId);
|
|
|
+ bizMpPublishTaskRepository.deleteById(taskId);
|
|
|
+ log.info("任务数据已清理,任务ID: {}", taskId);
|
|
|
}
|
|
|
-
|
|
|
- log.info("患者监护数据处理完成");
|
|
|
+ log.info("公众号发布任务执行结束,任务ID: {}", taskId);
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * @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));
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
+}
|