liusheng
8 天以前 f0a09ee996ab2605869844d6a3d812709e2bf0fa
ruoyi-admin/src/main/java/com/ruoyi/web/component/RedisMqReceiver.java
@@ -18,10 +18,8 @@
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.smartor.domain.*;
import com.smartor.domain.entity.ServiceSubtaskEntity;
import com.smartor.mapper.*;
import com.smartor.service.IBaseSmsaccountService;
import com.smartor.service.IServiceOutPathService;
import com.smartor.service.IServiceSubtaskRecordService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -39,6 +37,19 @@
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.ruoyi.template.domain.HeLibrary;
import com.ruoyi.template.api.TemplateFacade;
import com.ruoyi.common.core.domain.entity.PatArchive;
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.domain.ServiceSubtaskRecord;
import com.ruoyi.task.domain.ServiceTask;
import com.ruoyi.task.mapper.ServiceSubtaskMapper;
import com.ruoyi.task.mapper.ServiceTaskMapper;
import com.ruoyi.task.domain.ServiceOutPath;
import com.ruoyi.task.service.IServiceOutPathService;
import com.ruoyi.task.domain.ServiceSubtaskPreachform;
import com.ruoyi.task.domain.SendMagParam;
@Slf4j
@Component//监听此队列
public class RedisMqReceiver extends KeyExpirationEventMessageListener {
@@ -58,12 +69,26 @@
    @Autowired
    private IServiceOutPathService iServiceOutPathService;
    /**
     * 模板数据一律经 ruoyi-template 的门面取用(跨模块数据访问原则)。
     */
    @Autowired
    private TemplateFacade templateFacade;
    /**
     * 宣教模块的<b>常驻门面</b>,用于判 {@code sys_config: publicity.enabled}。
     * <p>
     * ⚠️ 2025 修复:本类原本<b>完全没读宣教开关</b> ——
     * {@code tsakHandle} 的公众号 {@code type == 3} 分支(L518「//宣教」)
     * 照常拼宣教链接并发送,所以关掉 {@code publicity.enabled} 也拦不住这条路。
     */
    @Autowired
    private com.ruoyi.publicity.api.PublicityFacade publicityFacade;
    @Autowired
    private ServiceSubtaskMapper ivrTaskcallMapper;
    @Autowired
    private HeLibraryMapper heLibraryMapper;
    @Autowired
    private ServiceTaskMapper ivrTaskMapper;
@@ -208,6 +233,22 @@
                continue;
            }
            String descByCode = ServiceFromEnum.getDescByCode(Integer.valueOf(sendPreachform));
            // ⚠️ 2025 修复(宣教开关失效):type == 3 是**宣教/通知**(纯发送、无作答,
            // 见 setFailPreachForm 里「宣教或通知…直接改成 9」的判定),整条派发的所有通道
            // (电话/短信/公众号/人工)发的都是宣教内容。所以关掉 publicity.enabled 时
            // 应当**一个通道都不发**,而不是只拦其中一段。
            //
            // ⚠️ 刻意**不推进 subtask 状态、也不记失败**:关闭是"暂时不发",
            // 不是"这个患者不需要宣教"。若标成失败/不需要,开关恢复后这条宣教就永远丢了。
            // 保持 sendstate=2 不动,开关打开后下一次派发会照常发出。
            // (本方法的调用方 onMessage 处理完即删 Redis 消息、不重投,所以不会造成重投风暴。)
            if (type != null && type == 3 && !publicityFacade.isEnabled()) {
                log.warn("【宣教】模块未启用(参数配置 publicity.enabled=false),跳过宣教发送。subtaskId={}, patid={}",
                        serviceSubtask.getId(), serviceSubtask.getPatid());
                continue;
            }
            if (descByCode.equals("电话")) {
                try {
                    ServiceTask ivrTask = ivrTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
@@ -379,7 +420,10 @@
                        String url = "";
                        String format = String.format("%03X", serviceOutPath.getId());
                        //需要通过模板ID去判断要发的内容是宣教还是通知
                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
                        // ⚠️ 与 RyTask 同口径:**刻意不**为 TemplateModuleDisabledException 降级 ——
                        // 模板模块关闭时宣教内容取不到、短信确实发不出去,外层 try-catch 如实记失败
                        // 并走既有的通道升级机制。硬记成功等于用假记录掩盖"没发出去"。
                        HeLibrary heLibrary = templateFacade.findHeLibraryById(serviceSubtask.getLibtemplateid());
                        if (heLibrary.getHetype().equals("1")) {
                            sendMagParam.setPhone(serviceSubtask.getPhone());
                            url = StringUtils.isNotEmpty(req_path) ? ip + ":" + req_path + "/xj?p=" + format : ip + "/xj?p=" + format;
@@ -523,7 +567,7 @@
                        String format = String.format("%03X", serviceOutPath.getId());
                        //需要通过模板ID去判断要发的内容是宣教还是通知
//                        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(serviceSubtask.getLibtemplateid());
//                        HeLibrary heLibrary = templateFacade.findHeLibraryById(serviceSubtask.getLibtemplateid());
//                        if (heLibrary.getHetype().equals("1")) {
//                            sendMagParam.setPhone(serviceSubtask.getPhone());
//                            sendMagParam.setUrl(ip + ":" + req_path + "/xj?p=" + format);