| | |
| | | for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) { |
| | | scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent(), ivrLibaTemplateScript.getDimension())); |
| | | } |
| | | // 只保留本期真正下发过任务的模板:题库里挂着的历史模板(从未下发)不再占行 |
| | | scriptRefs = keepActiveTemplates(scriptRefs, activeTemplateIds(patSatisfactionReqVO, "1")); |
| | | buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals); |
| | | } |
| | | |
| | |
| | | // 问卷的选项表按 svy_lib_template_script 的主键关联 |
| | | scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent(), svyLibTemplateScript.getDimension())); |
| | | } |
| | | // 只保留本期真正下发过任务的模板:题库里挂着的历史模板(从未下发)不再占行 |
| | | scriptRefs = keepActiveTemplates(scriptRefs, activeTemplateIds(patSatisfactionReqVO, "2")); |
| | | buildSatisfactionDetailEntities(patSatisfactionReqVO, "2", false, scriptRefs, patSatisfactionDetailEntities, personTotals); |
| | | } |
| | | result.setTotalAnswerRate(Arith.div(personTotals[0], personTotals[1])); |
| | |
| | | for (SatisfactionIvrScriptRow ivrLibaTemplateScript : ivrLibaTemplateScripts) { |
| | | scriptRefs.add(new SatScriptRef(ivrLibaTemplateScript.getTemplateid(), ivrLibaTemplateScript.getScriptid(), ivrLibaTemplateScript.getScriptContent(), ivrLibaTemplateScript.getDimension())); |
| | | } |
| | | // 只保留本期真正下发过任务的模板:题库里挂着的历史模板(从未下发)不再占行 |
| | | scriptRefs = keepActiveTemplates(scriptRefs, activeTemplateIds(patSatisfactionReqVO, "1")); |
| | | buildSatisfactionDetailEntities(patSatisfactionReqVO, "1", true, scriptRefs, patSatisfactionDetailEntities, personTotals); |
| | | } |
| | | } |
| | |
| | | // 问卷的选项表按 svy_lib_template_script 的主键关联 |
| | | scriptRefs.add(new SatScriptRef(svyLibTemplateScript.getSvyid(), svyLibTemplateScript.getId(), svyLibTemplateScript.getScriptContent(), svyLibTemplateScript.getDimension())); |
| | | } |
| | | // 只保留本期真正下发过任务的模板:题库里挂着的历史模板(从未下发)不再占行 |
| | | scriptRefs = keepActiveTemplates(scriptRefs, activeTemplateIds(patSatisfactionReqVO, "2")); |
| | | buildSatisfactionDetailEntities(patSatisfactionReqVO, "2", false, scriptRefs, patSatisfactionDetailEntities, personTotals); |
| | | } |
| | | } |
| | |
| | | statQuery.setEndTime(reqVO.getEndTime()); |
| | | statQuery.setDeptcodes(reqVO.getDeptcodes()); |
| | | statQuery.setHospitaldistrictcodes(reqVO.getHospitaldistrictcodes()); |
| | | statQuery.setLeaveldeptcodes(reqVO.getLeaveldeptcodes()); |
| | | statQuery.setLeavehospitaldistrictcodes(reqVO.getLeavehospitaldistrictcodes()); |
| | | statQuery.setLibTemplateIds(CollectionUtils.isEmpty(templateIds) ? templateIds |
| | | : templateIds.stream().filter(Objects::nonNull).distinct().collect(Collectors.toList())); |
| | | return statQuery; |
| | |
| | | // 这里把三处构造收敛为帮助方法,条件与原来逐字对应。 |
| | | |
| | | /** |
| | | * 本期内<b>真正下发过任务</b>的模板 id 集合(空集合表示本次条件下没有任何任务)。 |
| | | * <p> |
| | | * 背景:{@code /statistics} 的题目来源是「满意度分类」下的全量题库题目 |
| | | * ({@link SatisfactionScriptMapper#querySvyScriptByCategory} / |
| | | * {@link SatisfactionScriptMapper#queryIvrScriptByAssort}), |
| | | * 既不看模板也不看时间。题库里只要挂进过一套历史问卷模板 |
| | | * (题目还在、但从来没下发过任务),统计结果就会多出一整批 |
| | | * 「平均分 0 / 最高分 0 / 答题人数 0」的行。 |
| | | * <p> |
| | | * 实测(丽水 smartor_sltd,某次入参):满意度分类下 6 套模板共 69 道题, |
| | | * 而本期只有 2 套模板共 25 道题真正下发过,于是页面显示 69 行、其中 44 行全 0。 |
| | | * 用本方法裁掉无任务模板后,行数回到 25。 |
| | | * |
| | | * @param reqVO 原始请求(条件与「有数据」判断同口径:机构、服务类型、科室 OR 病区、时间兜底) |
| | | * @param type service_subtask.type:1 语音、2 问卷 |
| | | */ |
| | | private Set<Long> activeTemplateIds(PatSatisfactionReqVO reqVO, String type) { |
| | | List<Long> ids = satisfactionMapper.selectSatisfactionActiveTemplateIds(reqVO, type); |
| | | if (CollectionUtils.isEmpty(ids)) return Collections.emptySet(); |
| | | return new HashSet<>(ids); |
| | | } |
| | | |
| | | /** |
| | | * 只保留本期真正下发过任务的模板的题目(空集合时返回空列表,即「本期没有任务 → 不出行」)。 |
| | | * <p> |
| | | * 保留 {@code scriptRefs} 的原有顺序,因为返回顺序就是页面展示顺序。 |
| | | */ |
| | | private List<SatScriptRef> keepActiveTemplates(List<SatScriptRef> scriptRefs, Set<Long> activeTemplateIds) { |
| | | if (CollectionUtils.isEmpty(scriptRefs) || CollectionUtils.isEmpty(activeTemplateIds)) { |
| | | return new ArrayList<>(); |
| | | } |
| | | List<SatScriptRef> kept = new ArrayList<>(scriptRefs.size()); |
| | | for (SatScriptRef scriptRef : scriptRefs) { |
| | | if (scriptRef.getTemplateId() != null && activeTemplateIds.contains(scriptRef.getTemplateId())) { |
| | | kept.add(scriptRef); |
| | | } |
| | | } |
| | | return kept; |
| | | } |
| | | |
| | | /** |
| | | * 满意度分类查询(语音侧)。 |
| | | * <p> |
| | | * ⚠️ <b>与原文一致:只传 orgid,<u>不传 type</u></b>。原实现是 |