liusheng
昨天 09f75e1b4ee21241940ad26b91462ea15c5e4f00
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -348,6 +348,15 @@
                List<SvyTaskTemplateScriptVO> cacheList = serviceSubTaskCacheReq.getSvyTaskTemplateScriptVOS();
                cacheList.sort(Comparator.comparingLong(SvyTaskTemplateScriptVO::getSort));
                log.info("问卷回答结果:{}", cacheList);
                // 预查询循环中不变的数据,避免每题重复查数据库
                ServiceSubtaskEntity preSubtaskVO = new ServiceSubtaskEntity();
                preSubtaskVO.setTaskid(tid);
                preSubtaskVO.setPatid(pid);
                preSubtaskVO.setSubId(subid);
                List<ServiceSubtask> preServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(preSubtaskVO);
                ServiceTask preServiceTask = serviceTaskService.selectServiceTaskByTaskid(tid);
                Map<Long, Long> preDetailIdMap = getExistingDetailIdMap(subid);
                Map<Long, Long> preTraceIdMap = getExistingTraceIdMap(subid);
                for (int i = 0; i < cacheList.size(); i++) {
                    if (i == 0) {
                        //这个时间要找到第一题
@@ -356,7 +365,7 @@
                                //说明是第一题
                                List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = svyTaskTemplateScriptVO.getSvyTaskTemplateTargetoptions();
                                svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid, preServiceSubtaskList, preServiceTask, preDetailIdMap, preTraceIdMap);
                                if (map == null) continue;
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -376,7 +385,7 @@
                        svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                        if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid, preServiceSubtaskList, preServiceTask, preDetailIdMap, preTraceIdMap);
                            log.error("nextScriptNo的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -764,25 +773,29 @@
        if (ObjectUtils.isNotEmpty(scriptInfoByCondition) && ObjectUtils.isNotEmpty(scriptInfoByCondition.get("script"))) {
            if (scriptInfoByCondition.get("type").equals("1")) {
                List<IvrTaskTemplateScriptVO> ivrTaskTemplateScriptVOS = (List<IvrTaskTemplateScriptVO>) scriptInfoByCondition.get("script");
                // 批量查询所有明细,避免循环中逐条查数据库(N+1问题优化)
                Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
                for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : ivrTaskTemplateScriptVOS) {
                    Map<String, String> scriptResult = getScriptResult(subid, patid, ivrTaskTemplateScriptVO.getId());
                    if (ObjectUtils.isNotEmpty(scriptResult)) {
                        ivrTaskTemplateScriptVO.setScriptResult(scriptResult.get("asrtext"));
                        ivrTaskTemplateScriptVO.setScriptResultId(scriptResult.get("asrtextId"));
                    ServiceSubtaskDetail detail = detailMap.get(ivrTaskTemplateScriptVO.getId());
                    if (detail != null) {
                        ivrTaskTemplateScriptVO.setScriptResult(detail.getAsrtext());
                        ivrTaskTemplateScriptVO.setScriptResultId(String.valueOf(detail.getId()));
                    }
                }
                map.put("scriptResult", ivrTaskTemplateScriptVOS);
                map.put("taskName", scriptInfoByCondition.get("taskName"));
            } else if (scriptInfoByCondition.get("type").equals("2")) {
                List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOList = (List) scriptInfoByCondition.get("script");
                // 批量查询所有明细,避免循环中逐条查数据库(N+1问题优化)
                Map<Long, ServiceSubtaskDetail> detailMap = getScriptResultMap(subid, patid);
                for (SvyTaskTemplateScriptVO svyTaskTemplateScriptVO : svyTaskTemplateScriptVOList) {
                    Map<String, String> scriptResult = getScriptResult(subid, patid, svyTaskTemplateScriptVO.getId());
                    if (ObjectUtils.isNotEmpty(scriptResult)) {
                        if (StringUtils.isNotEmpty(scriptResult.get("asrtext")))
                            svyTaskTemplateScriptVO.setScriptResult(StringUtils.isNotEmpty(scriptResult.get("asrtext")) ? scriptResult.get("asrtext").replaceAll("^(\"|')(.*)\\1$", "$2") : "");
                        svyTaskTemplateScriptVO.setScriptResultId(scriptResult.get("asrtextId"));
                        if (StringUtils.isNotEmpty(scriptResult.get("answerps")))
                            svyTaskTemplateScriptVO.setAnswerps(scriptResult.get("answerps"));
                    ServiceSubtaskDetail detail = detailMap.get(svyTaskTemplateScriptVO.getId());
                    if (detail != null) {
                        if (StringUtils.isNotEmpty(detail.getAsrtext()))
                            svyTaskTemplateScriptVO.setScriptResult(detail.getAsrtext().replaceAll("^(\"|')(.*)\\1$", "$2"));
                        svyTaskTemplateScriptVO.setScriptResultId(String.valueOf(detail.getId()));
                        if (StringUtils.isNotEmpty(detail.getAnswerps()))
                            svyTaskTemplateScriptVO.setAnswerps(detail.getAnswerps());
                    }
                }
                map.put("scriptResult", svyTaskTemplateScriptVOList);
@@ -795,6 +808,31 @@
            }
        }
        return map;
    }
    /**
     * 批量查询子任务明细并按scriptid分组,避免循环中逐条查数据库
     *
     * @param subid 子任务ID
     * @param pid   患者ID
     * @return key=scriptid, value=对应的第一条ServiceSubtaskDetail
     */
    private Map<Long, ServiceSubtaskDetail> getScriptResultMap(Long subid, Long pid) {
        ServiceSubtaskDetail query = new ServiceSubtaskDetail();
        query.setSubId(subid);
        query.setPatid(pid);
        List<ServiceSubtaskDetail> details = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(query);
        if (CollectionUtils.isEmpty(details)) {
            return Collections.emptyMap();
        }
        Map<Long, ServiceSubtaskDetail> result = new HashMap<>();
        for (ServiceSubtaskDetail detail : details) {
            // 同一个scriptid可能有多条记录,只取第一条(与原逻辑一致)
            if (!result.containsKey(detail.getScriptid())) {
                result.put(detail.getScriptid(), detail);
            }
        }
        return result;
    }
@@ -821,6 +859,52 @@
        serviceSubtaskVO.setPatid(patid);
        serviceSubtaskVO.setSubId(subid);
        List<ServiceSubtask> selectServiceSubtaskList = serviceSubtaskMapper.selectServiceSubtaskList(serviceSubtaskVO);
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskid);
        Map<Long, Long> existingDetailIdMap = getExistingDetailIdMap(subid);
        Map<Long, Long> existingTraceIdMap = getExistingTraceIdMap(subid);
        return setWJInfo(svyTaskTemplateScriptVO, taskid, patid, subid, selectServiceSubtaskList, serviceTask, existingDetailIdMap, existingTraceIdMap);
    }
    /**
     * 批量查询已存在的明细记录ID,按scriptid分组(避免循环中逐条查询)
     */
    private Map<Long, Long> getExistingDetailIdMap(Long subid) {
        if (subid == null) return Collections.emptyMap();
        ServiceSubtaskDetail query = new ServiceSubtaskDetail();
        query.setSubId(subid);
        List<ServiceSubtaskDetail> details = serviceSubtaskDetailMapper.selectServiceSubtaskDetailList(query);
        if (CollectionUtils.isEmpty(details)) return Collections.emptyMap();
        Map<Long, Long> map = new HashMap<>();
        for (ServiceSubtaskDetail d : details) {
            if ((d.getDelFlag() == null || "0".equals(d.getDelFlag())) && d.getScriptid() != null && !map.containsKey(d.getScriptid())) {
                map.put(d.getScriptid(), d.getId());
            }
        }
        return map;
    }
    /**
     * 批量查询异常跟踪记录ID,按scriptid分组(避免循环中逐条查询)
     */
    private Map<Long, Long> getExistingTraceIdMap(Long subid) {
        if (subid == null) return Collections.emptyMap();
        ServiceSubtaskDetailTraceVO query = new ServiceSubtaskDetailTraceVO();
        query.setSubId(subid);
        List<ServiceSubtaskDetailTrace> traces = traceService.selectServiceSubtaskDetailTtraceList(query);
        if (CollectionUtils.isEmpty(traces)) return Collections.emptyMap();
        Map<Long, Long> map = new HashMap<>();
        for (ServiceSubtaskDetailTrace t : traces) {
            if (t.getScriptid() != null && !map.containsKey(t.getScriptid())) {
                map.put(t.getScriptid(), t.getId());
            }
        }
        return map;
    }
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid, Long subid,
                                           List<ServiceSubtask> selectServiceSubtaskList, ServiceTask serviceTask,
                                           Map<Long, Long> existingDetailIdMap, Map<Long, Long> existingTraceIdMap) {
        log.error("-----svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
        String score = "0";
        //下题跳转
        String nextScriptNo = null;
@@ -860,7 +944,6 @@
                nextScriptNo = getNextScriptNo(svyTaskTemplateScriptVO.getTemplateID(), svyTaskTemplateScriptVO.getScriptContent());
            }
        }
        ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(taskid);
        serviceSubtaskDetailVO.setQuestiontext(svyTaskTemplateScriptVO.getScriptContent());
        serviceSubtaskDetailVO.setIsMydException(svyTaskTemplateScriptVO.getIsMydException());
        serviceSubtaskDetailVO.setDimension(svyTaskTemplateScriptVO.getDimension());
@@ -884,10 +967,10 @@
        serviceSubtaskDetailVO.setTemplatequestionnum(svyTaskTemplateScriptVO.getId());
        ServiceSubtaskDetail serviceSubtaskDetail = DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
        //先用subid和scriptid查询一下是否存在,如果存在则更新,不存在则插入
        ServiceSubtaskDetailDTO existServiceSubtaskDetail = serviceSubtaskDetailMapper.isExistServiceSubtaskDetail(serviceSubtaskDetailVO.getSubId(), serviceSubtaskDetailVO.getScriptid());
        if (ObjectUtils.isNotEmpty(existServiceSubtaskDetail)) {
            serviceSubtaskDetail.setId(existServiceSubtaskDetail.getId());
        //先用subid和scriptid查询一下是否存在,如果存在则更新,不存在则插入(使用预查询的Map,避免逐条查数据库)
        Long existDetailId = existingDetailIdMap.get(serviceSubtaskDetailVO.getScriptid());
        if (existDetailId != null) {
            serviceSubtaskDetail.setId(existDetailId);
            serviceSubtaskDetail.setUpdateTime(new Date());
            serviceSubtaskDetailMapper.updateServiceSubtaskDetail(serviceSubtaskDetail);
        } else {
@@ -945,23 +1028,16 @@
            subtaskDetailTrace.setUpdateTime(new Date());
            subtaskDetailTrace.setOrgid(selectServiceSubtaskList.get(0).getOrgid());
            ServiceSubtaskDetailTraceVO ssdt = new ServiceSubtaskDetailTraceVO();
            ssdt.setSubId(subtaskDetailTrace.getSubId());
            ssdt.setScriptid(subtaskDetailTrace.getScriptid());
            ssdt.setTemplateType(subtaskDetailTrace.getTemplateType());
            List<ServiceSubtaskDetailTrace> serviceSubtaskDetailTraces = traceService.selectServiceSubtaskDetailTtraceList(ssdt);
            if (CollectionUtils.isNotEmpty(serviceSubtaskDetailTraces)) {
                subtaskDetailTrace.setId(serviceSubtaskDetailTraces.get(0).getId());
            Long existTraceId = existingTraceIdMap.get(subtaskDetailTrace.getScriptid());
            if (existTraceId != null) {
                subtaskDetailTrace.setId(existTraceId);
                traceService.updateServiceSubtaskDetailTtrace(subtaskDetailTrace);
            } else traceService.insertServiceSubtaskDetailTtrace(subtaskDetailTrace);
        } else if (ObjectUtils.isNotEmpty(stt) && stt.getIsabnormal() != 1L) {
            //这里主要是怕医护人员把异常选项改成了非异常的,这里就需要查一下这条数据是不是在满意度异常表,如果在,则要删除
            ServiceSubtaskDetailTraceVO subtaskDetailTraceVO = new ServiceSubtaskDetailTraceVO();
            subtaskDetailTraceVO.setSubId(serviceSubtaskDetailVO.getSubId());
            subtaskDetailTraceVO.setScriptid(svyTaskTemplateScriptVO.getId());
            List<ServiceSubtaskDetailTrace> serviceSubtaskDetailTraces = traceService.selectServiceSubtaskDetailTtraceList(subtaskDetailTraceVO);
            if (CollectionUtils.isNotEmpty(serviceSubtaskDetailTraces)) {
                traceService.deleteServiceSubtaskDetailTtraceById(serviceSubtaskDetailTraces.get(0).getId());
            Long existTraceId = existingTraceIdMap.get(svyTaskTemplateScriptVO.getId());
            if (existTraceId != null) {
                traceService.deleteServiceSubtaskDetailTtraceById(existTraceId);
            }
        }