陈昶聿
5 小时以前 27700927ebef0dbe669433ec2cdd3170647c226a
Merge branch 'master' into master-手术随访
已修改10个文件
205 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-ls.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskRecordMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/IServiceSubtaskRecordService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskRecordServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/resources/mapper/smartor/ServiceSubtaskRecordMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -96,12 +96,6 @@
    @ApiOperation("查询患者随访信息")
    @PostMapping("/patItem")
    public Map<String, Object> patItem(@RequestBody ServiceSubtaskVO serviceSubtaskVO) {
//        if (serviceSubtaskVO.getLeavehospitaldistrictcodes() != null && serviceSubtaskVO.getLeavehospitaldistrictcodes().size() > 10) {
//            throw new BaseException("病区查询数量不能超过10个");
//        }
//        if (serviceSubtaskVO.getLeaveldeptcodes() != null && serviceSubtaskVO.getLeaveldeptcodes().size() > 10) {
//            throw new BaseException("科室查询数量不能超过10个");
//        }
        serviceSubtaskVO.setPageNum(PageUtils.getOffset(serviceSubtaskVO.getPageNum(), serviceSubtaskVO.getPageSize()));
        List<ServiceSubtaskRes> serviceSubtaskList = null;
@@ -114,29 +108,42 @@
            serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
            serviceSubtaskList = serviceSubtaskService.patItem(serviceSubtaskEntity);
        }
        for (ServiceSubtaskRes serviceSubtask : serviceSubtaskList) {
            ServiceSubtaskRecord serviceSubtaskRecord = new ServiceSubtaskRecord();
            serviceSubtaskRecord.setSubtaskId(serviceSubtask.getId());
            serviceSubtaskRecord.setOrgid(serviceSubtask.getOrgid());
            if (ObjectUtils.isNotEmpty((serviceSubtask.getTaskid())))
                serviceSubtaskRecord.setTaskid(serviceSubtask.getTaskid().toString());
            serviceSubtask.setServiceSubtaskRecordList(serviceSubtaskRecordService.selectServiceSubtaskRecordList(serviceSubtaskRecord));
            ServiceTask serviceTask = serviceTaskService.selectServiceTaskByTaskid(serviceSubtask.getTaskid());
            if (ObjectUtils.isNotEmpty(serviceTask)) serviceSubtask.setPreachform(serviceTask.getPreachform());
        // 批量查 subtask_record,1次SQL替代循环中N次单独查
        List<Long> subtaskIds = serviceSubtaskList.stream().map(ServiceSubtaskRes::getId).filter(ObjectUtils::isNotEmpty).collect(Collectors.toList());
        Map<Long, List<ServiceSubtaskRecord>> recordMap = serviceSubtaskRecordService.selectRecordMapBySubtaskIds(subtaskIds);
        for (ServiceSubtaskRes serviceSubtask : serviceSubtaskList) {
            serviceSubtask.setServiceSubtaskRecordList(recordMap.getOrDefault(serviceSubtask.getId(), new ArrayList<>()));
        }
//      patItemCount 调用redisCache记录统计数据
        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
//      patItemCount 走Redis缓存版,避免每次全表聚合扫描
        Map<String, Object> map = getPatItemCountWithCache(serviceSubtaskEntity);
        map.put("serviceSubtaskList", serviceSubtaskList);
        List<Map<String, Object>> list = new ArrayList<>();
        list.add(map);
        // 直接从已有聚合结果推算total,避免去掉分页后再全量查一遍大表
        long total = 0L;
        try {
            long wzx = map.get("wzx") != null ? ((Number) map.get("wzx")).longValue() : 0L;
            long ysf = map.get("ysf") != null ? ((Number) map.get("ysf")).longValue() : 0L;
            long dsf = map.get("dsf") != null ? ((Number) map.get("dsf")).longValue() : 0L;
            long yc = map.get("yc") != null ? ((Number) map.get("yc")).longValue() : 0L;
            long jg = map.get("jg") != null ? ((Number) map.get("jg")).longValue() : 0L;
            long fssb = map.get("fssb") != null ? ((Number) map.get("fssb")).longValue() : 0L;
            long yfs = map.get("yfs") != null ? ((Number) map.get("yfs")).longValue() : 0L;
            long blq = map.get("blq") != null ? ((Number) map.get("blq")).longValue() : 0L;
            total = wzx + ysf + dsf + yc + jg + fssb + yfs + blq;
        } catch (Exception e) {
            // 兜底:全量count
        serviceSubtaskEntity.setPageNum(null);
        serviceSubtaskEntity.setPageSize(null);
        List<ServiceSubtaskRes> serviceSubtasks = serviceSubtaskService.patItem(serviceSubtaskEntity);
            List<ServiceSubtask> serviceSubtasks = serviceSubtaskService.selectServiceSubtaskList(serviceSubtaskEntity);
            total = CollectionUtils.isNotEmpty(serviceSubtasks) ? serviceSubtasks.size() : 0L;
        }
        return getDataTable3(CollectionUtils.isNotEmpty(serviceSubtasks) ? serviceSubtasks.size() : 0L, list);
        return getDataTable3(total, list);
    }
    /**
@@ -151,42 +158,48 @@
        ServiceSubtaskEntity serviceSubtaskEntity = DtoConversionUtils.sourceToTarget(serviceSubtaskVO, ServiceSubtaskEntity.class);
        serviceSubtaskEntity.setContinueContent(ObjectUtils.isNotEmpty(serviceSubtaskVO.getContinueContent()) ? serviceSubtaskVO.getContinueContent().toString() : null);
        // 通过redis记录结果
        Map<String, Object> redisMap = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        SysUser user = null;
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser)) {
            user = loginUser.getUser();
            if (ObjectUtils.isNotEmpty(user)) {
                userId = user.getUserId();
            }
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            redisMap = redisCache.getCacheObject(userId + "patItemCount");
            //记录是否有可用缓存
            map = getPatItemCountWithCache(serviceSubtaskEntity);
        }
        map.put("code", HttpStatus.SUCCESS);
        return map;
    }
    /**
     * 带Redis缓存的统计查询,供patItem和patItemCount共用,条件不变时直接命中缓存
     */
    private Map<String, Object> getPatItemCountWithCache(ServiceSubtaskEntity serviceSubtaskEntity) {
        Map<String, Object> map = new HashMap<>();
        LoginUser loginUser = getLoginUser();
        Long userId = null;
        if (ObjectUtils.isNotEmpty(loginUser) && ObjectUtils.isNotEmpty(loginUser.getUser())) {
            userId = loginUser.getUser().getUserId();
        }
        if (ObjectUtils.isNotEmpty(userId)) {
            Map<String, Object> redisMap = redisCache.getCacheObject(userId + "patItemCount");
            Boolean redisFlag = false;
            ServiceSubtaskEntity oldCondition = null;
            if (MapUtils.isNotEmpty(redisMap)) {
                oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                // 比较查询条件是否一致
                ServiceSubtaskEntity oldCondition = (ServiceSubtaskEntity) redisMap.get("searchCondition");
                if (ObjectUtils.isNotEmpty(oldCondition) && isSameCondition(oldCondition, serviceSubtaskEntity)) {
                    // 条件一致,使用缓存
                    redisFlag = true;
                    map = redisMap;
                    redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
                }
            }
            // 如果没有缓存或者条件不一致,重新查询
            if (!redisFlag) {
                map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
                map.put("searchCondition", serviceSubtaskEntity);
                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
            }
        } else {
            map = serviceSubtaskService.patItemCount(serviceSubtaskEntity);
        }
        map.put("code", HttpStatus.SUCCESS);
        return map;
    }
@@ -659,6 +672,7 @@
    /**
     * 统计任务各种状态的数量(优化版)
     *
     * @return Map<String, Object> 包含各状态统计数据
     *         pendingVisitCount: 当前登录人截止今日待随访总量
     *         failedVisitCount: 当前登录人随访任务失败总量
ruoyi-admin/src/main/resources/application-druid.yml
@@ -118,7 +118,7 @@
    database: 0
    password: Smartor
    # 连接超时时间
    timeout: 10s
    timeout: 30s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
ruoyi-admin/src/main/resources/application-ls.yml
@@ -92,7 +92,7 @@
    # 密码
    password: Smartor
    # 连接超时时间
    timeout: 10s
    timeout: 30s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
smartor/src/main/java/com/smartor/mapper/ServiceSubtaskRecordMapper.java
@@ -30,6 +30,11 @@
    public List<ServiceSubtaskRecord> selectServiceSubtaskRecordList(ServiceSubtaskRecord serviceSubtaskRecord);
    /**
     * 按 subtask_id 列表批量查询随访记录,消除N+1
     */
    public List<ServiceSubtaskRecord> selectServiceSubtaskRecordBySubtaskIds(List<Long> subtaskIds);
    /**
     * 新增【请填写功能名称】
     *
     * @param serviceSubtaskRecord 【请填写功能名称】
smartor/src/main/java/com/smartor/service/IServiceSubtaskRecordService.java
@@ -29,6 +29,11 @@
    public List<ServiceSubtaskRecord> selectServiceSubtaskRecordList(ServiceSubtaskRecord serviceSubtaskRecord);
    /**
     * 按 subtask_id 列表批量查询,结果用 Map<subtaskId, records> 结构返回
     */
    public java.util.Map<Long, List<ServiceSubtaskRecord>> selectRecordMapBySubtaskIds(List<Long> subtaskIds);
    /**
     * 新增【请填写功能名称】
     *
     * @param serviceSubtaskRecord 【请填写功能名称】
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskAnswerServiceImpl.java
@@ -202,7 +202,7 @@
                                //说明是第一题
                                List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = cacheList.get(0).getSvyTaskTemplateTargetoptions();
                                svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, null);
                                if (map == null) continue aa;
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -224,7 +224,7 @@
                        if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
//                            log.error("svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]));
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]), null);
                            log.error("nextScriptNo的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -250,7 +250,7 @@
                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = cacheList.get(0).getIvrTaskScriptTargetoptionList();
//                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(ivrLibaTemplateTargetoptions, IvrTaskTemplateTargetoption.class);
                                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid);
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid, null);
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (score == null) {
@@ -267,7 +267,7 @@
                        ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                        if (ivrTaskTemplateScriptVO.getSort() != null && Long.valueOf(ivrTaskTemplateScriptVO.getSort()).equals(nextScriptno)) {
                            Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]));
                            Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, Long.valueOf(split[1]), Long.valueOf(split[0]), null);
                            log.error("----nextScriptNo2的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -325,6 +325,7 @@
    public Integer saveQuestionDetail(ServiceSubTaskCacheReq serviceSubTaskCacheReq, Long flag) {
        Long tid = Long.valueOf(serviceSubTaskCacheReq.getParam1());
        Long pid = Long.valueOf(serviceSubTaskCacheReq.getParam2());
        Long subid = Long.valueOf(serviceSubTaskCacheReq.getParam6());
        Double score = null;
        if (ObjectUtils.isNotEmpty(serviceSubTaskCacheReq)) {
            Long nextScriptno = null;
@@ -341,7 +342,7 @@
                                //说明是第一题
                                List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = cacheList.get(0).getSvyTaskTemplateTargetoptions();
                                svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid);
                                Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid);
                                if (map == null) continue;
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -361,7 +362,7 @@
                        svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                        if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid);
                            log.error("nextScriptNo的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -376,19 +377,21 @@
                }
            } else if (serviceSubTaskCacheReq.getType() == 1) {
                List<IvrTaskTemplateScriptVO> cacheList = serviceSubTaskCacheReq.getIvrTaskTemplateScriptVOList();
                cacheList.sort(Comparator.comparingLong(IvrTaskTemplateScriptVO::getSort));
                cacheList.sort(Comparator.comparingLong(
                        vo -> Optional.ofNullable(vo.getSort()).orElse(0)
                ));
                log.error("电话随访问卷回答结果:{}", cacheList.size());
                for (int i = 0; i < cacheList.size(); i++) {
                    if (i == 0) {
                        //这个时间要找到第一题
                        for (IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO : cacheList) {
                            if (ivrTaskTemplateScriptVO.getSort() == 1L) {
                            if (ivrTaskTemplateScriptVO.getSort() != null && ivrTaskTemplateScriptVO.getSort() == 1L) {
                                //说明是第一题
                                List<IvrTaskTemplateTargetoption> ivrTaskTemplateTargetoptions = cacheList.get(0).getIvrTaskScriptTargetoptionList();
                                ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                                //它俩都是ivr_task_templatescript_id,所以这里需要设置一下
                                ivrTaskTemplateScriptVO.setId(ivrTaskTemplateScriptVO.getScriptID());
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid);
                                Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid, subid);
                                if (!Objects.isNull(map.get("nextScriptNo")))
                                    nextScriptno = Long.valueOf(map.get("nextScriptNo"));
                                if (score == null) {
@@ -406,7 +409,7 @@
                        ivrTaskTemplateScriptVO.setIvrTaskScriptTargetoptionList(ivrTaskTemplateTargetoptions);
                        if (ivrTaskTemplateScriptVO.getSort() != null && Long.valueOf(ivrTaskTemplateScriptVO.getSort()).equals(nextScriptno)) {
                            Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid);
                            Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid, subid);
                            log.error("----nextScriptNo2的信息为:{}", map.get("nextScriptNo"));
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -503,7 +506,7 @@
                            List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = svyTaskTemplateScriptVOS.get(0).getSvyTaskTemplateTargetoptions();
//                            List<SvyTaskTemplateTargetoption> svyTaskTemplateTargetoptions = DtoConversionUtils.sourceToTarget(svyTaskTemplateTargetoptions, SvyTaskTemplateTargetoption.class);
                            svyTaskTemplateScriptVO.setSvyTaskTemplateTargetoptions(svyTaskTemplateTargetoptions);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid);
                            Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid, null);
                            if (map == null) continue;
                            if (!Objects.isNull(map.get("nextScriptNo")))
                                nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -527,7 +530,7 @@
                    if (svyTaskTemplateScriptVO.getSort() != null && svyTaskTemplateScriptVO.getSort().equals(nextScriptno)) {
                        log.error("svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
                        Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid);
                        Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, Long.valueOf(serviceSubTaskMYDAnswerReq.getTaskId()), patid, null);
                        log.error("map的信息为:{}", map);
                        if (!Objects.isNull(map.get("nextScriptNo")))
                            nextScriptno = Long.valueOf(map.get("nextScriptNo"));
@@ -792,7 +795,7 @@
        return null;
    }
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid) {
    private Map<String, String> setWJInfo(SvyTaskTemplateScriptVO svyTaskTemplateScriptVO, Long taskid, Long patid, Long subid) {
        log.error("-----svyTaskTemplateScriptVO的值为:{}", svyTaskTemplateScriptVO);
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskid);
@@ -849,7 +852,7 @@
            serviceSubtaskDetailVO.setGuid(serviceTask.getGuid());
            serviceSubtaskDetailVO.setOrgid(serviceTask.getOrgid());
        }
        serviceSubtaskDetailVO.setSubId(CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.get(0).getId() : null);
        serviceSubtaskDetailVO.setSubId(subid == null ? CollectionUtils.isNotEmpty(selectServiceSubtaskList) ? selectServiceSubtaskList.get(0).getId() : null : subid);
        serviceSubtaskDetailVO.setTemplatequestionnum(svyTaskTemplateScriptVO.getId());
        ServiceSubtaskDetail serviceSubtaskDetail = DtoConversionUtils.sourceToTarget(serviceSubtaskDetailVO, ServiceSubtaskDetail.class);
@@ -903,7 +906,7 @@
            JSONObject patdescJson1 = new JSONObject();
            patdescJson1.put("sendname", selectServiceSubtaskList.get(0).getSendname());
            patdescJson1.put("phone", selectServiceSubtaskList.get(0).getPhone());
            patdescJson1.put("sex", selectServiceSubtaskList.get(0).getSex() == null ? selectServiceSubtaskList.get(0).getSex() == 1 ? "男" : "女" : null);
            patdescJson1.put("sex", selectServiceSubtaskList.get(0).getSex() != null ? selectServiceSubtaskList.get(0).getSex() == 1 ? "男" : "女" : null);
            patdescJson1.put("age", selectServiceSubtaskList.get(0).getAge());
            subtaskDetailTrace.setPatdesc(patdescJson1.toJSONString());
            subtaskDetailTrace.setTodeptcode(svyTaskTemplateScriptVO.getDutyDeptCode());
@@ -913,8 +916,17 @@
            subtaskDetailTrace.setCreateTime(new Date());
            subtaskDetailTrace.setUpdateTime(new Date());
            subtaskDetailTrace.setOrgid(selectServiceSubtaskList.get(0).getOrgid());
            traceService.insertServiceSubtaskDetailTtrace(subtaskDetailTrace);
        } else if (ObjectUtils.isNotEmpty(stt) && stt.getIsabnormal() == 1L) {
            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());
                traceService.updateServiceSubtaskDetailTtrace(subtaskDetailTrace);
            } else traceService.insertServiceSubtaskDetailTtrace(subtaskDetailTrace);
        } else if (ObjectUtils.isNotEmpty(stt) && stt.getIsabnormal() != 1L) {
            //这里主要是怕医护人员把异常选项改成了非异常的,这里就需要查一下这条数据是不是在满意度异常表,如果在,则要删除
            ServiceSubtaskDetailTraceVO subtaskDetailTraceVO = new ServiceSubtaskDetailTraceVO();
            subtaskDetailTraceVO.setSubId(serviceSubtaskDetailVO.getSubId());
@@ -1023,7 +1035,7 @@
        return commonTaskcallMQJson;
    }
    private Map<String, String> setSFInfo(IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, Long taskid, Long patid) {
    private Map<String, String> setSFInfo(IvrTaskTemplateScriptVO ivrTaskTemplateScriptVO, Long taskid, Long patid, Long subid) {
        ServiceSubtaskEntity serviceSubtaskVO = new ServiceSubtaskEntity();
        serviceSubtaskVO.setTaskid(taskid);
        serviceSubtaskVO.setPatid(patid);
@@ -1034,7 +1046,7 @@
        String nextScriptNo = null;
        ServiceSubtaskDetailVO serviceSubtaskDetailVO = new ServiceSubtaskDetailVO();
        String isabnormalFlag = "0";
        if (ivrTaskTemplateScriptVO.getScriptType().equals("1") || ivrTaskTemplateScriptVO.getScriptType().equals("2")) {
        if (ivrTaskTemplateScriptVO.getScriptType() != null && (ivrTaskTemplateScriptVO.getScriptType().equals("1") || ivrTaskTemplateScriptVO.getScriptType().equals("2"))) {
            //1、2为单选或多选
            for (IvrTaskTemplateTargetoption ivrTaskTemplateTargetoption : ivrTaskTemplateScriptVO.getIvrTaskScriptTargetoptionList()) {
                //将问题选项记录下来
@@ -1059,9 +1071,9 @@
            }
        } else {
            //非单多选
            if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getQuestionResult())) {
                serviceSubtaskDetailVO.setAsrtext(ivrTaskTemplateScriptVO.getQuestionResult().replaceAll("^\"|\"$", ""));
                serviceSubtaskDetailVO.setMatchedtext(ivrTaskTemplateScriptVO.getQuestionResult().replaceAll("^\"|\"$", ""));
            if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getQuestionResult()) || StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getIvrtext())) {
                serviceSubtaskDetailVO.setAsrtext(ivrTaskTemplateScriptVO.getQuestionResult() != null ? ivrTaskTemplateScriptVO.getQuestionResult().replaceAll("^\"|\"$", "") : ivrTaskTemplateScriptVO.getIvrtext());
                serviceSubtaskDetailVO.setMatchedtext(ivrTaskTemplateScriptVO.getQuestionResult() != null ? ivrTaskTemplateScriptVO.getQuestionResult().replaceAll("^\"|\"$", "") : ivrTaskTemplateScriptVO.getIvrtext());
                serviceSubtaskDetailVO.setScore(ivrTaskTemplateScriptVO.getScore() != null ? ivrTaskTemplateScriptVO.getScore().toString() : "0");
                nextScriptNo = ivrTaskTemplateScriptVO.getNextScriptno() == null ? null : ivrTaskTemplateScriptVO.getNextScriptno().toString();
                if (ivrTaskTemplateScriptVO.getScore() != null) {
@@ -1081,7 +1093,7 @@
        serviceSubtaskDetailVO.setGuid(ivrTaskTemplateScriptVO.getGuid());
        serviceSubtaskDetailVO.setOrgid(ivrTaskTemplateScriptVO.getOrgid());
        serviceSubtaskDetailVO.setUpdateTime(new Date());
        serviceSubtaskDetailVO.setSubId(selectServiceSubtaskList.get(0).getId());
        serviceSubtaskDetailVO.setSubId(subid == null ? selectServiceSubtaskList.get(0).getId() : subid);
        serviceSubtaskDetailVO.setTemplatequestionnum(ivrTaskTemplateScriptVO.getId());
        serviceSubtaskDetailVO.setTemplateType(1);
        serviceSubtaskDetailVO.setTemplateid(ivrTaskTemplateScriptVO.getTemplateID() == null ? null : ivrTaskTemplateScriptVO.getTemplateID().toString());
@@ -1131,9 +1143,7 @@
            subtaskDetailTrace.setGuid(ivrTaskTemplateScriptVO.getGuid());
            subtaskDetailTrace.setValueType(serviceSubtaskDetail.getValueType());
            subtaskDetailTrace.setTemplateType(1);
            subtaskDetailTrace.setType(ivrLibaScriptAssort != null ? ivrLibaScriptAssort.getType() : null);
            subtaskDetailTrace.setScriptid(ivrTaskTemplateScriptVO.getId() == null ? ivrTaskTemplateScriptVO.getScriptID() : ivrTaskTemplateScriptVO.getId());
            subtaskDetailTrace.setAsrtext(ivrTaskTemplateScriptVO.getIvrtext());
            subtaskDetailTrace.setRecordpath(null);
@@ -1141,7 +1151,7 @@
            JSONObject patdescJson2 = new JSONObject();
            patdescJson2.put("sendname", selectServiceSubtaskList.get(0).getSendname());
            patdescJson2.put("phone", selectServiceSubtaskList.get(0).getPhone());
            patdescJson2.put("sex", selectServiceSubtaskList.get(0).getSex() == null ? selectServiceSubtaskList.get(0).getSex() == 1 ? "男" : "女" : null);
            patdescJson2.put("sex", selectServiceSubtaskList.get(0).getSex() != null ? selectServiceSubtaskList.get(0).getSex() == 1 ? "男" : "女" : null);
            patdescJson2.put("age", selectServiceSubtaskList.get(0).getAge());
            subtaskDetailTrace.setPatdesc(patdescJson2.toJSONString());
            subtaskDetailTrace.setTodeptcode(ivrTaskTemplateScriptVO.getDutyDeptCode());
@@ -1151,8 +1161,17 @@
            subtaskDetailTrace.setCreateTime(new Date());
            subtaskDetailTrace.setUpdateTime(new Date());
            subtaskDetailTrace.setOrgid(selectServiceSubtaskList.get(0).getOrgid());
            traceService.insertServiceSubtaskDetailTtrace(subtaskDetailTrace);
        } else if (stt.getIsabnormal() != null && stt.getIsabnormal() != 1L) {
            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());
                traceService.updateServiceSubtaskDetailTtrace(subtaskDetailTrace);
            } else traceService.insertServiceSubtaskDetailTtrace(subtaskDetailTrace);
        } else if (stt != null && stt.getIsabnormal() != null && stt.getIsabnormal() != 1L) {
            //这里主要是怕医护人员把异常选项改成了非异常的,这里就需要查一下这条数据是不是在满意度异常表,如果在,则要删除
            ServiceSubtaskDetailTraceVO subtaskDetailTraceVO = new ServiceSubtaskDetailTraceVO();
            subtaskDetailTraceVO.setSubId(serviceSubtaskDetailVO.getSubId());
smartor/src/main/java/com/smartor/service/impl/ServiceSubtaskRecordServiceImpl.java
@@ -4,10 +4,14 @@
import com.smartor.domain.ServiceSubtaskRecord;
import com.smartor.mapper.ServiceSubtaskRecordMapper;
import com.smartor.service.IServiceSubtaskRecordService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 【请填写功能名称】Service业务层处理
@@ -42,6 +46,14 @@
        return serviceSubtaskRecordMapper.selectServiceSubtaskRecordList(serviceSubtaskRecord);
    }
    @Override
    public Map<Long, List<ServiceSubtaskRecord>> selectRecordMapBySubtaskIds(List<Long> subtaskIds) {
        if (CollectionUtils.isEmpty(subtaskIds)) return new java.util.HashMap<>();
        List<ServiceSubtaskRecord> all = serviceSubtaskRecordMapper.selectServiceSubtaskRecordBySubtaskIds(subtaskIds);
        if (CollectionUtils.isEmpty(all)) return new java.util.HashMap<>();
        return all.stream().collect(Collectors.groupingBy(ServiceSubtaskRecord::getSubtaskId));
    }
    /**
     * 新增【请填写功能名称】
     *
smartor/src/main/resources/mapper/smartor/ServiceSubtaskDetailTraceMapper.xml
@@ -160,6 +160,9 @@
        <if test="valueType != null  and valueType != ''">
            and value_type = #{valueType}
        </if>
        <if test="scriptid != null and scriptids==null ">
            and scriptid = #{scriptid}
        </if>
        <if test="scriptids != null ">
            and scriptid in
            <foreach item="scriptid" collection="scriptids" open="(" separator="," close=")">
@@ -275,8 +278,6 @@
            and template_type = #{templateType}
        </if>
    </select>
    <select id="selectServiceSubtaskDetailTtraceById" parameterType="Long"
smartor/src/main/resources/mapper/smartor/ServiceSubtaskMapper.xml
@@ -265,8 +265,7 @@
    <select id="selectServiceSubtaskList" parameterType="com.smartor.domain.entity.ServiceSubtaskEntity"
            resultMap="ServiceSubtaskResult">
        <include refid="selectServiceSubtaskVo"/>
        where 1=1
        and del_flag = 0
        where  del_flag = 0
        <if test="continueFlag != null ">and continue_flag = #{continueFlag}</if>
        <if test="continueTimeNow != null ">and continue_time_now = #{continueTimeNow,jdbcType=TIMESTAMP}</if>
        <if test="continueCount != null ">and continue_count = #{continueCount}</if>
smartor/src/main/resources/mapper/smartor/ServiceSubtaskRecordMapper.xml
@@ -74,6 +74,14 @@
            <if test="remark != null  and remark != ''">and remark = #{remark}</if>
    </select>
    <select id="selectServiceSubtaskRecordBySubtaskIds" resultMap="ServiceSubtaskRecordResult">
        <include refid="selectServiceSubtaskRecordVo"/>
        where subtask_id IN
        <foreach collection="list" item="subtaskId" open="(" separator="," close=")">
            #{subtaskId}
        </foreach>
    </select>
    <select id="selectServiceSubtaskRecordById" parameterType="Long" resultMap="ServiceSubtaskRecordResult">
        <include refid="selectServiceSubtaskRecordVo"/>
        where id = #{id}