| | |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import com.ruoyi.template.domain.HeLibrary; |
| | | import com.ruoyi.template.domain.IvrLibaScriptAssort; |
| | | import com.ruoyi.inhospvisit.domain.PatMedInhosp; |
| | | 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.IvrTaskTemplate; |
| | | import com.ruoyi.template.domain.IvrTaskTemplateScriptVO; |
| | | import com.ruoyi.template.domain.IvrTaskTemplateTargetoption; |
| | | import com.ruoyi.template.service.IIvrTaskTemplateService; |
| | | import com.ruoyi.template.domain.IvrLibaTemplateScript; |
| | | import com.ruoyi.template.mapper.IvrLibaScriptAssortMapper; |
| | | import com.ruoyi.template.service.IIvrLibaTemplateScriptService; |
| | | import com.ruoyi.template.domain.SvyLibScriptCategory; |
| | | import com.ruoyi.template.domain.SvyLibTemplateScript; |
| | | import com.ruoyi.template.domain.SvyTaskTemplate; |
| | | import com.ruoyi.template.domain.SvyTaskTemplateScriptVO; |
| | | import com.ruoyi.template.domain.SvyTaskTemplateTargetoption; |
| | | import com.ruoyi.template.mapper.SvyLibScriptCategoryMapper; |
| | | import com.ruoyi.template.service.ISvyTaskTemplateService; |
| | | /** |
| | | * 任务问卷问题选项Service业务层处理 |
| | | * |
| | |
| | | public class ServiceSubtaskAnswerServiceImpl implements IServiceSubtaskAnswerService { |
| | | @Autowired |
| | | private ServiceSubtaskAnswerMapper serviceSubtaskAnswerMapper; |
| | | |
| | | /** |
| | | * 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。 |
| | | */ |
| | | @Autowired |
| | | private OuthospDataFacade outhospDataFacade; |
| | | |
| | | /** |
| | | * 跨模块访问一律经模块门面(禁止直连已搬走的 Mapper)。 |
| | | */ |
| | | @Autowired |
| | | private InhospVisitFacade inhospVisitFacade; |
| | | |
| | | @Autowired |
| | | private ServiceSubtaskMapper serviceSubtaskMapper; |
| | |
| | | private PatArchiveMapper patArchiveMapper; |
| | | |
| | | |
| | | @Autowired |
| | | private PatMedInhospMapper patMedInhospMapper; |
| | | |
| | | @Autowired |
| | | private PatMedOuthospMapper patMedOuthospMapper; |
| | | |
| | | @Autowired |
| | | private IServiceSubtaskDetailTraceService traceService; |
| | |
| | | @Autowired |
| | | private ISvyLibTemplateScriptService svyLibTemplateScriptService; |
| | | |
| | | @Autowired |
| | | private ISvyTaskTemplateTargetoptionService svyTaskTemplateTargetoptionService; |
| | | |
| | | @Autowired |
| | | private IIvrTaskTemplateService ivrTaskTemplateService; |
| | |
| | | |
| | | @Value("${dealDeptCode}") |
| | | private String dealDeptCode; |
| | | |
| | | /** |
| | | * 安全解析分数:null、空串、空白串以及非法格式一律按 0 处理,避免 Double.parseDouble 抛 NumberFormatException |
| | | * |
| | | * @param scoreValue 分数字符串 |
| | | * @return 解析后的分数,无法解析时返回 0 |
| | | */ |
| | | private double parseScore(String scoreValue) { |
| | | if (StringUtils.isEmpty(scoreValue)) { |
| | | return 0D; |
| | | } |
| | | try { |
| | | return Double.parseDouble(scoreValue.trim()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("分数格式非法,按 0 处理,原始值:{}", scoreValue); |
| | | return 0D; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 将累加后的分值格式化为落库字符串,去掉多余的小数位(如 5.0 -> 5) |
| | | * |
| | | * @param scoreValue 分值 |
| | | * @return 分数字符串 |
| | | */ |
| | | private String formatScore(double scoreValue) { |
| | | if (Double.isNaN(scoreValue) || Double.isInfinite(scoreValue)) { |
| | | log.warn("分数计算结果非法,按 0 处理,原始值:{}", scoreValue); |
| | | return "0"; |
| | | } |
| | | return BigDecimal.valueOf(scoreValue).stripTrailingZeros().toPlainString(); |
| | | } |
| | | |
| | | /** |
| | | * 安全解析异常标记:null、空串、非法格式一律按 0(正常)处理 |
| | | * |
| | | * @param isabnormalFlag 异常标记字符串 |
| | | * @return 异常标记值 |
| | | */ |
| | | private Integer parseIsabnormal(String isabnormalFlag) { |
| | | if (StringUtils.isEmpty(isabnormalFlag)) { |
| | | return 0; |
| | | } |
| | | try { |
| | | return Integer.valueOf(isabnormalFlag.trim()); |
| | | } catch (NumberFormatException e) { |
| | | log.warn("异常标记格式非法,按 0 处理,原始值:{}", isabnormalFlag); |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 归一化分数字符串,避免把 null 或空串(前端未传/未作答)放到 map 中传递给累加逻辑 |
| | | * |
| | | * @param scoreValue 原始分值 |
| | | * @return 非空分值,默认 "0" |
| | | */ |
| | | private String normalizeScore(String scoreValue) { |
| | | return StringUtils.isEmpty(scoreValue) ? "0" : scoreValue.trim(); |
| | | } |
| | | |
| | | /** |
| | | * 查询任务问卷问题选项 |
| | |
| | | subtaskCache.put(subtaskCacheKey, initialSubtaskList.get(0)); |
| | | } |
| | | |
| | | String score = "0"; |
| | | double scoreTotal = 0D; |
| | | Long nextScriptno = null; |
| | | aa: |
| | | for (String key : targetKeys) { |
| | |
| | | if (map == null) continue aa; |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | if (score == null || score.isEmpty()) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | } |
| | | scoreTotal += parseScore(map.get("score")); |
| | | } |
| | | } |
| | | |
| | |
| | | log.error("nextScriptNo的信息为:{}", map.get("nextScriptNo")); |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | if (score == null) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | } |
| | | scoreTotal += parseScore(map.get("score")); |
| | | } |
| | | } |
| | | } |
| | |
| | | Map<String, String> map = setSFInfo(ivrTaskTemplateScriptVO, tid, pid, subid); |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | if (score == null || score.isEmpty()) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | } |
| | | scoreTotal += parseScore(map.get("score")); |
| | | } |
| | | } |
| | | |
| | |
| | | log.error("----nextScriptNo2的信息为:{}", map.get("nextScriptNo")); |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | if (score == null) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | } |
| | | scoreTotal += parseScore(map.get("score")); |
| | | } |
| | | } |
| | | } |
| | |
| | | serviceSubtask.setFinishtime(new Date()); |
| | | serviceSubtask.setUpdateTime(new Date()); |
| | | log.error("将该key和value从redis中,serviceSubtask的值为--------:{}", serviceSubtask); |
| | | if (score != null && !score.isEmpty()) serviceSubtask.setScore(score); |
| | | serviceSubtask.setScore(formatScore(scoreTotal)); |
| | | serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); |
| | | |
| | | //将当前发送状态改成 9 完成(缓存 preachform 查询) |
| | |
| | | Long tid = Long.valueOf(serviceSubTaskCacheReq.getParam1()); |
| | | Long pid = Long.valueOf(serviceSubTaskCacheReq.getParam2()); |
| | | Long subid = Long.valueOf(serviceSubTaskCacheReq.getParam6()); |
| | | String score = "0"; |
| | | double scoreTotal = 0D; |
| | | if (ObjectUtils.isNotEmpty(serviceSubTaskCacheReq)) { |
| | | Long nextScriptno = null; |
| | | String isabnormalFlag = "0"; |
| | |
| | | |
| | | if (shouldProcess) { |
| | | Map<String, String> map = setWJInfo(svyTaskTemplateScriptVO, tid, pid, subid, preServiceSubtaskList, preServiceTask, preDetailIdMap, preTraceIdMap); |
| | | log.error("nextScriptNo 的信息为:{}", map.get("nextScriptNo")); |
| | | if (map == null) continue; |
| | | log.info("nextScriptNo 的信息为:{}", map.get("nextScriptNo")); |
| | | |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | |
| | | if (score == null) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | scoreTotal += parseScore(map.get("score")); |
| | | if (StringUtils.isNotEmpty(map.get("isabnormal"))) { |
| | | isabnormalFlag = map.get("isabnormal"); |
| | | } |
| | | isabnormalFlag = map.get("isabnormal"); |
| | | } |
| | | } |
| | | } else if (serviceSubTaskCacheReq.getType() == 1) { |
| | |
| | | log.error("----nextScriptNo2 的信息为:{}", map.get("nextScriptNo")); |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) |
| | | nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | if (score == null) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | scoreTotal += parseScore(map.get("score")); |
| | | if (StringUtils.isNotEmpty(map.get("isabnormal"))) { |
| | | isabnormalFlag = map.get("isabnormal"); |
| | | } |
| | | isabnormalFlag = map.get("isabnormal"); |
| | | } |
| | | } |
| | | } |
| | |
| | | serviceSubtask.setTaskid(tid); |
| | | serviceSubtask.setPatid(pid); |
| | | serviceSubtask.setSubmit(1L); |
| | | serviceSubtask.setIsabnormal(Integer.valueOf(isabnormalFlag)); |
| | | serviceSubtask.setIsabnormal(parseIsabnormal(isabnormalFlag)); |
| | | serviceSubtask.setSendstate(6L); |
| | | serviceSubtask.setExcep(isabnormalFlag); |
| | | serviceSubtask.setFinishtime(new Date()); |
| | | serviceSubtask.setUpdateTime(new Date()); |
| | | if (score != null && !score.isEmpty()) serviceSubtask.setScore(score); |
| | | serviceSubtask.setScore(formatScore(scoreTotal)); |
| | | serviceSubtaskMapper.updateServiceSubtaskByCondition(serviceSubtask); |
| | | |
| | | //将当前发送状态改成9完成 |
| | |
| | | //住院 |
| | | PatMedInhosp patMedInhosp = new PatMedInhosp(); |
| | | patMedInhosp.setSerialnum(serviceSubTaskMYDAnswerReq.getSerialnum()); |
| | | patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp); |
| | | patMedInhospList = inhospVisitFacade.selectPatMedInhospList(patMedInhosp); |
| | | if (CollectionUtils.isNotEmpty(patMedInhospList)) patid = patMedInhospList.get(0).getPatid(); |
| | | } else if (serviceSubTaskMYDAnswerReq.getMzzy().equals("2")) { |
| | | //门诊 |
| | | PatMedOuthospQueryReq patMedOuthosp = new PatMedOuthospQueryReq(); |
| | | patMedOuthosp.setSerialnum(serviceSubTaskMYDAnswerReq.getSerialnum()); |
| | | patMedOuthosps = patMedOuthospMapper.callSpQueryOuthosp(patMedOuthosp); |
| | | patMedOuthosps = outhospDataFacade.callSpQueryOuthosp(patMedOuthosp); |
| | | if (CollectionUtils.isNotEmpty(patMedOuthosps)) patid = patMedOuthosps.get(0).getPatid(); |
| | | } else if (serviceSubTaskMYDAnswerReq.getMzzy().equals("3")) { |
| | | //指定一个部门,用来处理投诉建议 |
| | |
| | | } |
| | | |
| | | if (CollectionUtils.isNotEmpty(serviceSubTaskMYDAnswerReq.getSvyTaskTemplateScriptVOS())) { |
| | | String score = "0"; |
| | | double scoreTotal = 0D; |
| | | List<SvyTaskTemplateScriptVO> svyTaskTemplateScriptVOS = serviceSubTaskMYDAnswerReq.getSvyTaskTemplateScriptVOS(); |
| | | Long nextScriptno = null; |
| | | |
| | |
| | | log.error("nextScriptNo 的信息为:{}", map.get("nextScriptNo")); |
| | | if (!Objects.isNull(map.get("nextScriptNo"))) nextScriptno = Long.valueOf(map.get("nextScriptNo")); |
| | | |
| | | if (score == null || score.isEmpty()) { |
| | | score = map.get("score"); |
| | | } else { |
| | | score = String.valueOf(Double.parseDouble(score) + Double.parseDouble(map.get("score"))); |
| | | } |
| | | scoreTotal += parseScore(map.get("score")); |
| | | |
| | | if (!Objects.isNull(map.get("id"))) { |
| | | idList.add(Long.valueOf(map.get("id"))); |
| | |
| | | serviceSubtask.setNurseName(patMedInhospList.get(0).getNurseName()); |
| | | serviceSubtask.setNurseId(patMedInhospList.get(0).getNurseId()); |
| | | serviceSubtask.setInhospid(patMedInhospList.get(0).getInhospid()); |
| | | serviceSubtask.setCampusid(patMedInhospList.get(0).getCampusid()); |
| | | serviceSubtask.setServiceType("6"); |
| | | } else if (CollectionUtils.isNotEmpty(patMedOuthosps)) { |
| | | serviceSubtask.setHospType("1"); |
| | |
| | | serviceSubtask.setDeptcode(patMedOuthosps.get(0).getDeptcode()); |
| | | serviceSubtask.setDrname(patMedOuthosps.get(0).getDrname()); |
| | | serviceSubtask.setDrcode(patMedOuthosps.get(0).getDrcode()); |
| | | serviceSubtask.setCampusid(patMedOuthosps.get(0).getCampusid()); |
| | | serviceSubtask.setServiceType("14"); |
| | | } |
| | | if (!Objects.isNull(patArchive)) { |
| | |
| | | serviceSubtask.setSfzh(patArchive.getIdcardno()); |
| | | serviceSubtask.setAddr(patArchive.getPlaceOfResidence()); |
| | | serviceSubtask.setOrgid(patArchive.getOrgid()); |
| | | // 院区兜底:住院/门急诊记录的院区在本库常为空,用患者档案的院区补上, |
| | | // 否则统计接口(@AddOrgId 按登录用户院区过滤 service_subtask.campusid)会把这些子任务整批丢掉 |
| | | if (StringUtils.isEmpty(serviceSubtask.getCampusid())) { |
| | | serviceSubtask.setCampusid(patArchive.getCampusid()); |
| | | } |
| | | } |
| | | if (StringUtils.isNotEmpty(dealDept)) { |
| | | //投诉建议的处理部门 |
| | |
| | | serviceSubtask.setUpdateTime(new Date()); |
| | | serviceSubtask.setCreateTime(new Date()); |
| | | serviceSubtask.setVisitTime(new Date()); |
| | | if (score != null && !score.isEmpty()) serviceSubtask.setScore(score); |
| | | serviceSubtask.setScore(formatScore(scoreTotal)); |
| | | serviceSubtaskMapper.insertServiceSubtask(serviceSubtask); |
| | | //将当前发送状态改成9完成 |
| | | ServiceSubtaskPreachform serviceSubtaskPreachform = new ServiceSubtaskPreachform(); |
| | |
| | | nextScriptNo = getNextScriptNo(svyTaskTemplateScriptVO.getTemplateID(), svyTaskTemplateScriptVO.getScriptContent()); |
| | | } |
| | | if (svyTaskTemplateScriptVO.getScore() != null) { |
| | | score = String.valueOf(svyTaskTemplateScriptVO.getScore()); |
| | | score = normalizeScore(String.valueOf(svyTaskTemplateScriptVO.getScore())); |
| | | } |
| | | serviceSubtaskDetailVO.setAsrtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", "")); |
| | | serviceSubtaskDetailVO.setMatchedtext(StringUtils.isEmpty(svyTaskTemplateScriptVO.getScriptResult()) ? "" : svyTaskTemplateScriptVO.getScriptResult().replaceAll("^\"|\"$", "")); |
| | |
| | | if (StringUtils.isNotEmpty(svyTaskTemplateScriptVO.getScriptResult())) { |
| | | serviceSubtaskDetailVO.setAsrtext(svyTaskTemplateScriptVO.getScriptResult()); |
| | | if (svyTaskTemplateScriptVO.getScore() != null) { |
| | | score = String.valueOf(svyTaskTemplateScriptVO.getScore()); |
| | | score = normalizeScore(String.valueOf(svyTaskTemplateScriptVO.getScore())); |
| | | } |
| | | } |
| | | nextScriptNo = svyTaskTemplateScriptVO.getNextScriptno(); |
| | |
| | | |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("nextScriptNo", nextScriptNo); |
| | | map.put("score", score); |
| | | map.put("score", normalizeScore(score)); |
| | | map.put("id", "" + serviceSubtaskDetail.getId()); |
| | | map.put("isabnormal", isabnormalFlag.toString()); |
| | | return map; |
| | |
| | | } |
| | | |
| | | if (ivrTaskTemplateScriptVO.getScore() != null) { |
| | | score = String.valueOf(ivrTaskTemplateScriptVO.getScore()); |
| | | score = normalizeScore(String.valueOf(ivrTaskTemplateScriptVO.getScore())); |
| | | } |
| | | if (StringUtils.isNotEmpty(ivrTaskTemplateScriptVO.getQuestionResult())) { |
| | | serviceSubtaskDetailVO.setAsrtext(ivrTaskTemplateScriptVO.getQuestionResult().replaceAll("^\"|\"$", "")); |
| | |
| | | nextScriptNo = "" + getVoiceNextScriptNo(ivrTaskTemplateScriptVO.getTemplateID(), ivrTaskTemplateScriptVO.getScriptContent()); |
| | | } |
| | | if (ivrTaskTemplateScriptVO.getScore() != null) { |
| | | score = String.valueOf(ivrTaskTemplateScriptVO.getScore()); |
| | | score = normalizeScore(String.valueOf(ivrTaskTemplateScriptVO.getScore())); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | Map<String, String> map = new HashMap<>(); |
| | | map.put("nextScriptNo", nextScriptNo); |
| | | map.put("score", score); |
| | | map.put("score", normalizeScore(score)); |
| | | map.put("isabnormal", isabnormalFlag); |
| | | return map; |
| | | } |