陈昶聿
昨天 357100150bd0ba266d78d8d0f3b02c37b22435d8
smartor/src/main/java/com/smartor/service/impl/ServiceTaskServiceImpl.java
@@ -255,20 +255,6 @@
            }
        }
        if (CollectionUtils.isNotEmpty(selectServiceSubtaskList)) {
            //将当前方式的发送状态改成已领取
            ServiceSubtask serviceSubtask = selectServiceSubtaskList.get(0);
            ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform();
            serviceSubtaskPreachform.setPreachform(serviceSubtask.getCurrentPreachform());
            serviceSubtaskPreachform.setSubid(serviceSubtask.getId());
            serviceSubtaskPreachform.setTaskid(serviceTask.getTaskid());
            List<ServiceSubtaskPreachform> serviceSubtaskPreachforms = serviceSubtaskPreachformMapper.selectServiceSubtaskPreachformList(serviceSubtaskPreachform);
            if (CollectionUtils.isNotEmpty(serviceSubtaskPreachforms)) {
                ServiceSubtaskPreachform ssp = serviceSubtaskPreachforms.get(0);
                ssp.setSendstate("3");
                serviceSubtaskPreachformMapper.updateServiceSubtaskPreachform(ssp);
            }
        }
        if (serviceTask != null) {
            if (StringUtils.isNotEmpty(serviceTask.getKcb())) map.put("kcb", serviceTask.getKcb());
            map.put("script", info);
@@ -456,34 +442,50 @@
            serviceSubtaskVO.setPatid(patid);
        }
        List<ServiceSubtask> serviceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS = null;
        if (CollectionUtils.isNotEmpty(serviceSubtaskList) && serviceSubtaskList.size() == 1) {
            if (serviceSubtaskList.get(0).getSendstate() == 3 && isFinish == true) {
                ServiceSubtask serviceSubtask = new ServiceSubtask();
                serviceSubtask.setSendstate(1L);
                serviceSubtask.setPatid(patid);
                serviceSubtask.setTaskid(serviceTask.getTaskid());
                serviceSubtaskMapper.updateServiceSubtaskByPatId(serviceSubtask);
            }
            //通过模板ID获取问题信息
            SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
            svyTaskTemplateScript.setTemplateID(Long.valueOf(serviceTask.getTemplateid()));
            if (serviceSubtaskList.get(0).getTemplateid() != null)
                svyTaskTemplateScript.setTemplateID(serviceSubtaskList.get(0).getTemplateid());
            else if (serviceTask.getTemplateid() != null)
                svyTaskTemplateScript.setTemplateID(serviceTask.getTemplateid());
            svyTaskTemplateScript.setDelFlag("0");
            List<SvyTaskTemplateScript> svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
            if (CollectionUtils.isEmpty(svyTaskTemplateScripts) || svyTaskTemplateScripts.size() == 0) {
                insertSvyTaskTempScript(null, serviceTask);
                svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
                if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
                    throw new BaseException("请联系管理员,检查问题模板信息!");
                }
            }
            svyTaskTemplateScriptVOS = DtoConversionUtils.sourceToTarget(svyTaskTemplateScripts, SvyTaskTemplateScriptVO.class);
        if (CollectionUtils.isEmpty(serviceSubtaskList)) {
            throw new BaseException("未找到患者子任务,taskid=" + serviceTask.getTaskid()
                    + ", patid=" + patid + ", subId=" + subId);
        }
        if (serviceSubtaskList.size() > 1) {
            throw new BaseException("存在多条患者子任务,请传入子任务ID后再查询,taskid=" + serviceTask.getTaskid()
                    + ", patid=" + patid);
        }
        ServiceSubtask serviceSubtask = serviceSubtaskList.get(0);
        if (Long.valueOf(3L).equals(serviceSubtask.getSendstate()) && Boolean.TRUE.equals(isFinish)) {
            ServiceSubtask updateSubtask = new ServiceSubtask();
            updateSubtask.setSendstate(1L);
            updateSubtask.setPatid(patid);
            updateSubtask.setTaskid(serviceTask.getTaskid());
            serviceSubtaskMapper.updateServiceSubtaskByPatId(updateSubtask);
        }
        // 子任务模板优先;子任务未设置时回退到任务模板。
        Long templateId = serviceSubtask.getTemplateid() != null
                ? serviceSubtask.getTemplateid() : serviceTask.getTemplateid();
        if (templateId == null) {
            throw new BaseException("任务未配置问卷模板,taskid=" + serviceTask.getTaskid());
        }
        // 查询与兜底复制必须使用同一个模板ID,否则会出现“复制到A、仍查B”的死循环。
        SvyTaskTemplateScript svyTaskTemplateScript = new SvyTaskTemplateScript();
        svyTaskTemplateScript.setTemplateID(templateId);
        svyTaskTemplateScript.setDelFlag("0");
        List<SvyTaskTemplateScript> svyTaskTemplateScripts =
                svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
        if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
            log.warn("问卷任务模板问题为空,开始从模板库兜底复制, taskid={}, patid={}, subId={}, queryTemplateId={}, taskTemplateId={}, libTemplateId={}",
                    serviceTask.getTaskid(), patid, subId, templateId,
                    serviceTask.getTemplateid(), serviceTask.getLibtemplateid());
            insertSvyTaskTempScript(null, serviceTask, templateId);
            svyTaskTemplateScripts = svyTaskTemplateScriptMapper.selectSvyTaskTemplateScriptList(svyTaskTemplateScript);
            if (CollectionUtils.isEmpty(svyTaskTemplateScripts)) {
                throw new BaseException("请联系管理员,检查问题模板信息! taskid=" + serviceTask.getTaskid()
                        + ", templateId=" + templateId + ", libTemplateId=" + serviceTask.getLibtemplateid());
            }
        }
        List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS =
                DtoConversionUtils.sourceToTarget(svyTaskTemplateScripts, SvyTaskTemplateScriptVO.class);
        //获取患者信息
        PatArchive patArchive = null;
        if (patfrom.equals("0")) patArchive = patArchiveMapper.selectPatArchiveByPatid(patid);
@@ -493,7 +495,7 @@
        }
        //通过患者信息和任务信息中的textParam对问题中的变量进行填充
        //通过患者信息和任务信息中的 textParam 对问题中的变量进行填充
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Map<String, String>> ivrTaskMap = null;
        try {
@@ -501,28 +503,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());
@@ -535,7 +545,7 @@
                    svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                } else {
                    //如果选项没有查到,需要去基础模板库将选项查询出来,放到任务模板选项库中
                    insertSvyTaskTempScript(svyTaskTemplateScriptVO, serviceTask);
                    insertSvyTaskTempScript(svyTaskTemplateScriptVO, serviceTask, templateId);
                }
            }
@@ -545,8 +555,13 @@
    }
    private void insertSvyTaskTempScript(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, ServiceTask serviceTask) {
        log.info("-------基础模板libtemplateid的值为:{}", serviceTask.getLibtemplateid());
    private void insertSvyTaskTempScript(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO,
                                         ServiceTask serviceTask, Long targetTemplateId) {
        log.info("-------基础模板libtemplateid的值为:{},目标templateID为:{}", serviceTask.getLibtemplateid(), targetTemplateId);
        if (targetTemplateId == null) {
            log.warn("目标模板ID为空,无法复制基础模板问题, taskid={}", serviceTask.getTaskid());
            return;
        }
        if (StringUtils.isEmpty(serviceTask.getLibtemplateid())) {
            return;
        }
@@ -557,7 +572,8 @@
        log.info("-------基础模板svyLibTemplateScripts问题值为:{}", svyLibTemplateScripts.size());
        for (SvyLibTemplateScript sll : svyLibTemplateScripts) {
            if (ObjectUtils.isNotEmpty(svyTaskTemplateScriptVO)) {
                if (sll.getScriptContent().trim().equals(svyTaskTemplateScriptVO.getScriptContent().trim())) {
                if (StringUtils.equals(StringUtils.trim(sll.getScriptContent()),
                        StringUtils.trim(svyTaskTemplateScriptVO.getScriptContent()))) {
                    SvyLibTemplateTargetoption sltto = new SvyLibTemplateTargetoption();
                    sltto.setScriptid(sll.getId());
                    List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(sltto);
@@ -565,7 +581,7 @@
                    //将查出来的选项,放到svyTaskTemplateTargetoption中
                    List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptionList = DtoConversionUtils.sourceToTarget(svyLibTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                    for (int i = 0; i < svyTaskTemplateTargetoptionList.size(); i++) {
                        svyTaskTemplateTargetoptionList.get(i).setTemplateID(svyTaskTemplateScriptVO.getTemplateID());
                        svyTaskTemplateTargetoptionList.get(i).setTemplateID(targetTemplateId);
                        svyTaskTemplateTargetoptionList.get(i).setScriptid(svyTaskTemplateScriptVO.getId());
                        svyTaskTemplateTargetoptionMapper.insertSvyTaskTemplateTargetoption(svyTaskTemplateTargetoptionList.get(i));
                        log.info("-------新增完之后的选项ID值为:{}", svyTaskTemplateTargetoptionList.get(i).getId());
@@ -577,7 +593,7 @@
                SvyTaskTemplateScript stts = DtoConversionUtils.sourceToTarget(sll, SvyTaskTemplateScript.class);
                stts.setId(null);
                stts.setTaskid(serviceTask.getTaskid());
                stts.setTemplateID(serviceTask.getTemplateid());
                stts.setTemplateID(targetTemplateId);
                svyTaskTemplateScriptMapper.insertSvyTaskTemplateScript(stts);
                //新增问题选项
@@ -586,7 +602,7 @@
                List<SvyLibTemplateTargetoption> svyLibTemplateTargetoptions = svyLibTemplateTargetoptionMapper.selectSvyLibTemplateTargetoptionList(sltto);
                List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptionList = DtoConversionUtils.sourceToTarget(svyLibTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                for (int i = 0; i < svyTaskTemplateTargetoptionList.size(); i++) {
                    svyTaskTemplateTargetoptionList.get(i).setTemplateID(serviceTask.getTemplateid());
                    svyTaskTemplateTargetoptionList.get(i).setTemplateID(targetTemplateId);
                    svyTaskTemplateTargetoptionList.get(i).setScriptid(stts.getId());
                    svyTaskTemplateTargetoptionMapper.insertSvyTaskTemplateTargetoption(svyTaskTemplateTargetoptionList.get(i));
                }