| | |
| | | import java.util.concurrent.Executors; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | import com.ruoyi.template.domain.HeLibrary; |
| | | import com.ruoyi.template.api.TemplateFacade; |
| | | @Slf4j |
| | | @Component//监听此队列 |
| | | public class RedisMqReceiver extends KeyExpirationEventMessageListener { |
| | |
| | | @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; |
| | |
| | | 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()); |
| | |
| | | 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; |
| | |
| | | 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); |