lifang 3 hónapja
szülő
commit
49d57630e6

+ 21 - 7
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/config/RabbitMQConfig.java

@@ -1,13 +1,13 @@
 package cn.tr.module.smart.common.config;
 
 import cn.tr.module.smart.common.enums.RabbitMQConstant;
-import org.springframework.amqp.core.Binding;
-import org.springframework.amqp.core.BindingBuilder;
-import org.springframework.amqp.core.Queue;
-import org.springframework.amqp.core.TopicExchange;
+import org.springframework.amqp.core.*;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.util.HashMap;
+import java.util.Map;
+
 @Configuration
 public class RabbitMQConfig {
     /**
@@ -39,6 +39,19 @@ public class RabbitMQConfig {
                 .with(RabbitMQConstant.ROUTING_KEY_PATIENT_MONITOR);
     }
 
+
+    /***************************服务号推送配置***************************/
+
+    /**
+     * 创建延迟消息交换机
+     * @return TopicExchange 交换机实例
+     */
+    @Bean
+    public CustomExchange mpDelayExchange() {
+        Map<String, Object> args = new HashMap<>();
+        args.put("x-delayed-type", "topic");
+        return new CustomExchange(RabbitMQConstant.TOPIC_EXCHANGE_MP_NAME, "x-delayed-message", true, false, args);
+    }
     /**
      * 创建服务号推送队列
      * @return Queue 队列实例
@@ -54,8 +67,9 @@ public class RabbitMQConfig {
      */
     @Bean
     public Binding mpPushBinding() {
-        return BindingBuilder.bind(patientMonitorQueue())
-                .to(topicExchange())
-                .with(RabbitMQConstant.ROUTING_KEY_MP_PUSH);
+        return BindingBuilder.bind(mpPushQueue())
+                .to(mpDelayExchange())
+                .with(RabbitMQConstant.ROUTING_KEY_MP_PUSH)
+                .noargs();
     }
 }

+ 55 - 172
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/config/listener/MpMsgPushListener.java

@@ -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));
-    }
-
-}
+}

+ 2 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/enums/RabbitMQConstant.java

@@ -9,6 +9,8 @@ public interface RabbitMQConstant {
 
     String QUEUE_PATIENT_MONITOR = "patient.monitor.queue";
 
+    // 消息推送定义队列、交换机和路由键名称
+    String TOPIC_EXCHANGE_MP_NAME = "mp.exchange";
 
     String ROUTING_KEY_MP_PUSH = "patient.mp.push";
 

+ 2 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizMpPublishTaskPO.java

@@ -75,6 +75,7 @@ public class BizMpPublishTaskPO extends TenantPO {
     private List<JobKeyEntity> cronJob;
 
 
-
+    @ApiModelProperty(value = "推送的时间间隔")
+    private Integer interval;
 
 }

+ 6 - 41
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizMpPublishTaskService.java

@@ -4,7 +4,10 @@ package cn.tr.module.smart.common.service;
 import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskDTO;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskQueryDTO;
+import cn.tr.module.smart.common.enums.ClinicUndoType;
 import org.quartz.SchedulerException;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
 import java.util.Date;
@@ -17,51 +20,13 @@ import java.util.List;
  * @date  2025/07/25 08:29
  **/
 public interface IBizMpPublishTaskService{
+    void createAssementTask(String clinicId, Date clinicEndTime);
 
     /**
-     * 根据条件查询公众号推送任务表
-     * @param    query 查询参数
-     * @author   wangzl
-     * @date      2025/07/25 08:29
-     */
-    List<BizMpPublishTaskDTO> selectBizMpPublishTaskList(BizMpPublishTaskQueryDTO query);
-
-    /**
-     * 根据id查询公众号推送任务表
-     * @param    id 主键id
-     * @author   wangzl
-     * @date      2025/07/25 08:29
-     */
-    BizMpPublishTaskDTO selectBizMpPublishTaskById(String id);
-
-    /**
-     * 编辑公众号推送任务表
-     * @param   source 编辑实体类
-     * @author  wangzl
-     * @date     2025/07/25 08:29
-     */
-    boolean updateBizMpPublishTaskById(BizMpPublishTaskDTO source);
-
-    /**
-     * 新增公众号推送任务表
-     * @param   source 新增实体类
-     * @author wangzl
-     * @date  2025/07/25 08:29
-     */
-    boolean insertBizMpPublishTask(BizMpPublishTaskDTO source);
-
-    /**
-     * 删除公众号推送任务表详情
-     * @param  ids 删除主键集合
-     * @author wangzl
-     * @date    2025/07/25 08:29
-     */
-    int removeBizMpPublishTaskByIds(Collection<String> ids) throws SchedulerException;
-
-    /**
+     *
      * @description: 创建定时任务
      * @author wangzl
      * @date 2025/7/29
      */
-    void createQuestionTask(String clinicId, Date clinicEndTime,String type) throws SchedulerException, TaskException;
+    void createQuestionTask(String clinicId, Date clinicEndTime);
 }

+ 1 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/helper/BizClinicRoomHelper.java

@@ -34,6 +34,7 @@ public class BizClinicRoomHelper {
         bizMpPublishTaskPO.setTotalCount(totalCount);
         bizMpPublishTaskPO.setPublishCount(0);
         bizMpPublishTaskPO.setCron(pushIntervalUnified);
+        bizMpPublishTaskPO.setInterval(pushInterval);
         return bizMpPublishTaskPO;
     }
 

+ 7 - 1
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizClinicRoomServiceImpl.java

@@ -19,6 +19,7 @@ import cn.tr.module.smart.common.dto.BizClinicRoomQueryDTO;
 import cn.tr.module.smart.common.dto.BizDeptDTO;
 import cn.tr.module.smart.common.entity.BizWxAppletQuestionAnswerEntity;
 import cn.tr.module.smart.common.enums.ClinicPhaseEnums;
+import cn.tr.module.smart.common.enums.ClinicUndoType;
 import cn.tr.module.smart.common.enums.InfusionBindType;
 import cn.tr.module.smart.common.enums.UserTypeEnums;
 import cn.tr.module.smart.common.mapper.BizClinicRoomMapper;
@@ -111,6 +112,8 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
     @Autowired
     private BizDeviceRepository deviceRepository;
 
+    @Autowired
+    private IBizMpPublishTaskService mpPublishTaskService;
     @Override
     public List<BizWxAppletClinicDetailVO> stdSelectWxAppletClinicList(BizWxAppletClinicQueryDTO query) {
         return baseRepository.stdSelectWxAppletClinicList(query);
@@ -343,6 +346,7 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
      * @date 2025/7/14
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public boolean finishClinic(AppDoctorClinicFinishDTO finishDTO) {
         BizClinicRoomPO clinicRoom = baseRepository.selectById(finishDTO.getClinicId());
         if (ObjectUtil.isNull(clinicRoom)) {
@@ -351,7 +355,6 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
         if (ClinicPhaseEnums.AFTER.equals(clinicRoom.getClinicStatus())) {
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "手术已结束,无法结束手术");
         }
-
         if (ObjectUtil.compare(finishDTO.getClinicEndTime(), new Date()) > 0) {
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001
                     , String.format("手术结束时间[%s],不得大于当前时间[%s]"
@@ -367,6 +370,9 @@ public class BizClinicRoomServiceImpl implements IBizClinicRoomService {
                 .set(BizClinicRoomPO::getClinicStatus, ClinicPhaseEnums.AFTER)
                 .set(BizClinicRoomPO::getClinicEndTime, finishDTO.getClinicEndTime())
                 .eq(BizClinicRoomPO::getId, finishDTO.getClinicId()));
+        //创建镇痛和问卷的消息通知的任务
+        mpPublishTaskService.createQuestionTask(clinicRoom.getId(),finishDTO.getClinicEndTime());
+        mpPublishTaskService.createAssementTask(clinicRoom.getId(),finishDTO.getClinicEndTime());
         return update != 0;
     }
 

+ 58 - 102
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizMpPublishTaskServiceImpl.java

@@ -4,12 +4,11 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
-import cn.tr.module.quartz.exception.TaskException;
-import cn.tr.module.quartz.job.dto.SysJobDTO;
-import cn.tr.module.quartz.utils.ScheduleUtils;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskDTO;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskQueryDTO;
 import cn.tr.module.smart.common.entity.JobKeyEntity;
+import cn.tr.module.smart.common.enums.ClinicUndoType;
+import cn.tr.module.smart.common.enums.RabbitMQConstant;
 import cn.tr.module.smart.common.mapper.BizMpPublishTaskMapper;
 import cn.tr.module.smart.common.po.BizClinicRoomPO;
 import cn.tr.module.smart.common.po.BizDeptPO;
@@ -22,15 +21,17 @@ import cn.tr.module.smart.common.repository.BizQuestionGroupRepository;
 import cn.tr.module.smart.common.service.IBizMpPublishTaskService;
 import cn.tr.module.smart.common.service.helper.BizClinicRoomHelper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import org.quartz.JobDetail;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -54,91 +55,26 @@ public class BizMpPublishTaskServiceImpl implements IBizMpPublishTaskService {
     @Autowired
     private BizDeptRepository bizDeptRepository;
 
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
 
     /**
-     * 根据条件查询公众号推送任务表
-     *
-     * @param query 查询参数
-     * @author wangzl
-     * @date 2025/07/25 08:29
-     */
-    @Override
-    public List<BizMpPublishTaskDTO> selectBizMpPublishTaskList(BizMpPublishTaskQueryDTO query) {
-        return BizMpPublishTaskMapper.INSTANCE.convertDtoList(
-                baseRepository.selectList(new LambdaQueryWrapper<BizMpPublishTaskPO>()
-                )
-        );
-    }
-
-    /**
-     * 根据id查询公众号推送任务表
-     *
-     * @param id 主键id
-     * @author wangzl
-     * @date 2025/07/25 08:29
-     */
-    @Override
-    public BizMpPublishTaskDTO selectBizMpPublishTaskById(String id) {
-        return BizMpPublishTaskMapper.INSTANCE.convertDto(baseRepository.selectById(id));
-    }
-
-    /**
-     * 编辑公众号推送任务表
-     *
-     * @param source 编辑实体类
+     * @description: 创建定时任务
      * @author wangzl
-     * @date 2025/07/25 08:29
+     * @date 2025/7/29
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public boolean updateBizMpPublishTaskById(BizMpPublishTaskDTO source) {
-        return baseRepository.updateById(BizMpPublishTaskMapper.INSTANCE.convertPO(source)) != 0;
-    }
-
-    /**
-     * 新增公众号推送任务表
-     *
-     * @param source 新增实体类
-     * @author wangzl
-     * @date 2025/07/25 08:29
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean insertBizMpPublishTask(BizMpPublishTaskDTO source) {
-        return baseRepository.insert(BizMpPublishTaskMapper.INSTANCE.convertPO(source)) != 0;
-    }
-
-    /**
-     * 删除公众号推送任务表详情
-     *
-     * @param ids 删除主键集合
-     * @author wangzl
-     * @date 2025/07/25 08:29
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int removeBizMpPublishTaskByIds(Collection<String> ids) throws SchedulerException {
-        if (CollectionUtil.isEmpty(ids)) {
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "请选择要删除的数据");
-        }
-        List<BizMpPublishTaskPO> bizMpPublishTaskPOS = baseRepository.selectBatchIds(ids);
-        baseRepository.deleteBatchIds(ids);
-        if(ObjectUtil.isNotNull(bizMpPublishTaskPOS)){
-            for (BizMpPublishTaskPO task : bizMpPublishTaskPOS) {
-                List<JobKeyEntity> cronJob = task.getCronJob();
-                List<JobKey> collect = cronJob.stream()
-                        .map(jobKeyEntity -> new JobKey(jobKeyEntity.getName(), jobKeyEntity.getGroup()))
-                        .collect(Collectors.toList());
-                for (JobKey jobKey : collect) {
-                    scheduler.deleteJob(jobKey);
-                }
-
-            }
-        }
-        return baseRepository.deleteBatchIds(ids);
+    @Async
+    public void createAssementTask(String clinicId, Date clinicEndTime) {
+        //查询推送频次和推送次数
+        BizMpPublishTaskPO mpPublishTask = BizClinicRoomHelper.getMpPublishTask(clinicId, clinicEndTime,
+                8, 4 ,ClinicUndoType.assessment);
+        baseRepository.insert(mpPublishTask);
+        //推送到消息队列
+        sendDelayMessage(mpPublishTask);
     }
 
-
     /**
      * @description: 创建定时任务
      * @author wangzl
@@ -146,39 +82,59 @@ public class BizMpPublishTaskServiceImpl implements IBizMpPublishTaskService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void createQuestionTask(String clinicId, Date clinicEndTime, String type) throws SchedulerException, TaskException {
+    @Async
+    public void createQuestionTask(String clinicId, Date clinicEndTime) {
         //查询推送频次和推送次数
         BizClinicRoomPO bizClinicRoomPO = bizClinicRoomRepository.selectById(clinicId);
         if (Objects.isNull(bizClinicRoomPO)){
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到手术信息");
+            return;
         }
         BizDeptPO bizDeptPO = bizDeptRepository.selectById(bizClinicRoomPO.getDeptId());
         if (Objects.isNull(bizDeptPO)){
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到科室信息");
+            return;
         }
         BizQuestionGroupPO bizQuestionGroupPO = questionGroupRepository.selectById(bizDeptPO.getGroupId());
         if (Objects.isNull(bizQuestionGroupPO)){
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到问卷组信息");
+            return;
         }
         BizMpPublishTaskPO mpPublishTask = BizClinicRoomHelper.getMpPublishTask(clinicId, clinicEndTime,
-                bizQuestionGroupPO.getInterval(), bizQuestionGroupPO.getFrequency(), type);
-
-        List<SysJobDTO> jobQuestion = BizClinicRoomHelper.getJobQuestion(mpPublishTask.getId(), mpPublishTask.getCron());
-        List<JobKey> jobKeys  = new ArrayList<>();
-        for (SysJobDTO job:jobQuestion  ){
-            JobDetail scheduleJob = ScheduleUtils.createScheduleJob(scheduler, job);
-            jobKeys.add(scheduleJob.getKey());
-        }
-        List<JobKeyEntity> collect = jobKeys.stream()
-                .map(jobKey -> {
-                    JobKeyEntity jobKeyEntity = new JobKeyEntity();
-                    jobKeyEntity.setName(jobKey.getName());
-                    jobKeyEntity.setGroup(jobKey.getGroup());
-                    return jobKeyEntity;
-                })
-                .collect(Collectors.toList());
-        mpPublishTask.setCronJob(collect);
+                bizQuestionGroupPO.getInterval(), bizQuestionGroupPO.getFrequency(),  ClinicUndoType.questionGroup);
+//        List<SysJobDTO> jobQuestion = BizClinicRoomHelper.getJobQuestion(mpPublishTask.getId(), mpPublishTask.getCron());
+//        List<JobKey> jobKeys  = new ArrayList<>();
+//        for (SysJobDTO job:jobQuestion  ){
+//            JobDetail scheduleJob = ScheduleUtils.createScheduleJob(scheduler, job);
+//            jobKeys.add(scheduleJob.getKey());
+//        }
+//        List<JobKeyEntity> collect = jobKeys.stream()
+//                .map(jobKey -> {
+//                    JobKeyEntity jobKeyEntity = new JobKeyEntity();
+//                    jobKeyEntity.setName(jobKey.getName());
+//                    jobKeyEntity.setGroup(jobKey.getGroup());
+//                    return jobKeyEntity;
+//                })
+//                .collect(Collectors.toList());
+//        mpPublishTask.setCronJob(collect);
         baseRepository.insert(mpPublishTask);
+        //推送到消息队列
+        sendDelayMessage(mpPublishTask);
     }
 
+    /**
+     * 发送延迟消息到RabbitMQ
+     * @param task 任务对象
+     */
+    private void sendDelayMessage(BizMpPublishTaskPO task) {
+        // 计算延迟时间(毫秒)
+        long delayTime = TimeUnit.HOURS.toMillis(task.getInterval());
+        // 发送延迟消息
+        rabbitTemplate.convertAndSend(
+                RabbitMQConstant.TOPIC_EXCHANGE_MP_NAME,
+                RabbitMQConstant.ROUTING_KEY_MP_PUSH,
+                task,
+                message -> {
+                    message.getMessageProperties().getHeaders().put("x-delay", delayTime);
+                    return message;
+                }
+        );
+    }
 }