liusheng
9 天以前 34f78281cf395a24e1f3f1c3b861186ff8a03b7b
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.core.service.TemplateModuleDisabledException;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DtoConversionUtils;
@@ -20,6 +21,28 @@
import com.smartor.service.IServiceTaskService;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.template.domain.HeLibrary;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.ruoyi.inhospvisit.domain.PatMedInhospVO;
import com.ruoyi.outpatientvisit.domain.PatMedOuthosp;
import com.ruoyi.outpatientvisit.domain.PatMedOuthospQueryReq;
import com.ruoyi.inhospvisit.api.InhospVisitFacade;
import com.ruoyi.outpatientvisit.api.OuthospDataFacade;
import com.ruoyi.template.domain.IvrTaskTemplateScript;
import com.ruoyi.template.domain.IvrTaskTemplateScriptVO;
import com.ruoyi.template.domain.IvrTaskTemplateTargetoption;
import com.ruoyi.template.mapper.IvrTaskTemplateScriptMapper;
import com.ruoyi.template.mapper.IvrTaskTemplateTargetoptionMapper;
import com.ruoyi.template.domain.SvyLibTemplateScript;
import com.ruoyi.template.domain.SvyLibTemplateTargetoption;
import com.ruoyi.template.domain.SvyTaskTemplateScript;
import com.ruoyi.template.domain.SvyTaskTemplateScriptVO;
import com.ruoyi.template.domain.SvyTaskTemplateTargetoption;
import com.ruoyi.template.mapper.SvyLibTemplateScriptMapper;
import com.ruoyi.template.mapper.SvyLibTemplateTargetoptionMapper;
import com.ruoyi.template.mapper.SvyTaskTemplateScriptMapper;
import com.ruoyi.template.mapper.SvyTaskTemplateTargetoptionMapper;
import com.ruoyi.template.api.TemplateFacade;
/**
 * 语音任务Service业务层处理
 *
@@ -31,6 +54,24 @@
public class ServiceTaskServiceImpl implements IServiceTaskService {
    @Autowired
    private ServiceTaskMapper serviceTaskMapper;
    /**
     * 模板数据一律经 ruoyi-template 的门面取用(跨模块数据访问原则)。
     */
    @Autowired
    private TemplateFacade templateFacade;
    /**
     * 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。
     */
    @Autowired
    private OuthospDataFacade outhospDataFacade;
    /**
     * 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。
     */
    @Autowired
    private InhospVisitFacade inhospVisitFacade;
    @Autowired
    private ServiceSubtaskMapper serviceSubtaskMapper;
    @Autowired
@@ -40,8 +81,6 @@
    @Autowired
    private ServiceSubtaskPreachformMapper serviceSubtaskPreachformMapper;
    @Autowired
    private HeLibraryMapper heLibraryMapper;
    @Autowired
    private SvyTaskTemplateScriptMapper svyTaskTemplateScriptMapper;
    @Autowired
    private IvrTaskTemplateScriptMapper ivrTaskTemplateScriptMapper;
@@ -49,10 +88,6 @@
    private SvyLibTemplateScriptMapper svyLibTemplateScriptMapper;
    @Autowired
    private PatArchiveMapper patArchiveMapper;
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    @Autowired
    private PatMedOuthospMapper patMedOuthospMapper;
    @Autowired
    private SvyLibTemplateTargetoptionMapper svyLibTemplateTargetoptionMapper;
    @Autowired
@@ -265,8 +300,11 @@
            List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
                ServiceSubtaskPreachform ssp = serviceSubtaskPreachforms.get(0);
                ssp.setSendstate("3");
                serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
                //人工无-3已领取状态(service_subtask_preachform.sendstate = 3)
                if(StringUtils.isNotEmpty(ssp.getPreachform()) && !ssp.getPreachform().equals("1")){
                    ssp.setSendstate("3");
                    serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
                }
            }
        }
        if (serviceTask != null) {
@@ -300,14 +338,14 @@
        if (StringUtils.isNotEmpty(zyserialnum)) {
            PatMedInhospVO patMedInhospVO = new PatMedInhospVO();
            patMedInhospVO.setSerialnum(zyserialnum);
            List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospListByCondition(patMedInhospVO);
            List<PatMedInhosp> patMedInhospList = inhospVisitFacade.selectPatMedInhospListByCondition(patMedInhospVO);
            if (CollectionUtils.isNotEmpty(patMedInhospList)) {
                patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedInhospList.get(0).getPatid());
            }
        } else if (StringUtils.isNotEmpty(mzserialnum)) {
            PatMedOuthospQueryReq patMedOuthosp = new PatMedOuthospQueryReq();
            patMedOuthosp.setSerialnum(mzserialnum);
            List<PatMedOuthosp> patMedOuthosps = patMedOuthospMapper.callSpQueryOuthosp(patMedOuthosp);
            List<PatMedOuthosp> patMedOuthosps = outhospDataFacade.callSpQueryOuthosp(patMedOuthosp);
            if (CollectionUtils.isNotEmpty(patMedOuthosps)) {
                patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOuthosps.get(0).getPatid());
            }
@@ -461,8 +499,7 @@
            if (serviceSubtaskList.get(0).getSendstate() == 3 && isFinish == true) {
                ServiceSubtask serviceSubtask = new ServiceSubtask();
                serviceSubtask.setSendstate(1L);
                serviceSubtask.setPatid(patid);
                serviceSubtask.setTaskid(serviceTask.getTaskid());
               serviceSubtask.setId(serviceSubtaskList.get(0).getId());
                serviceSubtaskMapper.updateServiceSubtaskByPatId(serviceSubtask);
            }
@@ -493,7 +530,7 @@
        }
        //通过患者信息和任务信息中的textParam对问题中的变量进行填充
        //通过患者信息和任务信息中的 textParam 对问题中的变量进行填充
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Map<String, String>> ivrTaskMap = null;
        try {
@@ -501,28 +538,36 @@
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        List<Map<String, String>> mapList = new ArrayList<>();
        // 优化 1: 预先合并所有替换规则为一个 Map,避免多次遍历
        Map<String, String> replaceMap = new HashMap<>();
        if (ivrTaskMap != null) {
            for (Map<String, String> map : ivrTaskMap.values()) {
                mapList.add(map);
                replaceMap.putAll(map);
            }
        }
        //将模板问题话术里的通配符替换
        for (SvyTaskTemplateScriptVO svyTaskTemplateScriptVO : svyTaskTemplateScriptVOS) {
            if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getScriptContent())) {
                for (Map<String, String> map : mapList) {
                    for (String key : map.keySet()) {
                        svyTaskTemplateScriptVO.setScriptContent(svyTaskTemplateScriptVO.getScriptContent().replace(key, StringUtils.isNotEmpty(map.get(key)) ? map.get(key) : ""));
                    }
                // 优化 2: 使用正则 PatternMatcher 批量替换,提升性能
                String scriptContent = svyTaskTemplateScriptVO.getScriptContent();
                // 批量替换 IVR 任务参数
                for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
                    String value = StringUtils.isNotEmpty(entry.getValue()) ? entry.getValue() : "";
                    scriptContent = scriptContent.replace(entry.getKey(), value);
                }
                //替换患者个人信息数据
                log.info("问题id:{},   问题内容:{}", svyTaskTemplateScriptVO.getId(), svyTaskTemplateScriptVO.getScriptContent());
                if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getScriptContent()) && ObjectUtils.isNotEmpty(patArchive)) {
                    svyTaskTemplateScriptVO.setScriptContent(svyTaskTemplateScriptVO.getScriptContent().replace("${name}", StringUtils.isNotEmpty(patArchive.getName()) ? patArchive.getName() : ""));
                    svyTaskTemplateScriptVO.setScriptContent(svyTaskTemplateScriptVO.getScriptContent().replace("${dzz}", StringUtils.isNotEmpty(patArchive.getPlaceOfResidence()) ? patArchive.getPlaceOfResidence() : ""));
                    svyTaskTemplateScriptVO.setScriptContent(svyTaskTemplateScriptVO.getScriptContent().replace("${dhh}", StringUtils.isNotEmpty(patArchive.getTelcode()) ? patArchive.getTelcode() : ""));
                log.info("问题 id:{},   问题内容:{}", svyTaskTemplateScriptVO.getId(), scriptContent);
                if (ObjectUtils.isNotEmpty(patArchive)) {
                    // 优化 3: 减少不必要的非空判断(patArchive 已经判过)
                    scriptContent = scriptContent.replace("${name}", StringUtils.defaultString(patArchive.getName()));
                    scriptContent = scriptContent.replace("${dzz}", StringUtils.defaultString(patArchive.getPlaceOfResidence()));
                    scriptContent = scriptContent.replace("${dhh}", StringUtils.defaultString(patArchive.getTelcode()));
                }
                svyTaskTemplateScriptVO.setScriptContent(scriptContent);
                //获取问题选项
                SvyTaskTemplateTargetoption svyTaskTemplateTargetoption = new SvyTaskTemplateTargetoption();
                svyTaskTemplateTargetoption.setScriptid(svyTaskTemplateScriptVO.getId());
@@ -609,7 +654,18 @@
                serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask);
            }
        }
        HeLibrary heLibrary = heLibraryMapper.selectHeLibraryById(Long.valueOf(templateId));
        HeLibrary heLibrary;
        try {
            heLibrary = templateFacade.findHeLibraryById(Long.valueOf(templateId));
        } catch (TemplateModuleDisabledException e) {
            // 模板模块被关闭(sys_config: template.enabled=false):
            // 这里降级为空列表,而**不是**让异常冒出去 ——
            // 患者打开的宣教页面照常可看、可提交("只要打开了页面就算成功"的后续状态更新照旧执行)。
            // 原实现在模板查不到时返回的也是 [null],前端本就能容错;空列表更干净。
            log.warn("【模板】宣教任务取模板被拒(模块已关闭),taskid={}, templateId={},本次返回空内容",
                    taskid, templateId);
            return new ArrayList();
        }
        List list = new ArrayList();
        list.add(heLibrary);
        return list;