liusheng
8 天以前 f0a09ee996ab2605869844d6a3d812709e2bf0fa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
package com.ruoyi.satisfaction.service;
 
import com.ruoyi.satisfaction.domain.ServiceSubtaskDetailRatioExport;
import com.ruoyi.satisfaction.domain.dto.MydTrendReqDTO;
import com.ruoyi.satisfaction.domain.dto.MzMydScoreRankDTO;
import com.ruoyi.satisfaction.domain.dto.QuestionCountKsOrBqDTO;
import com.ruoyi.satisfaction.domain.vo.MydTrendReqVO;
import com.ruoyi.satisfaction.domain.vo.MzMydScoreRankVO;
import com.ruoyi.satisfaction.domain.vo.QuestionCountKsOrBqVO;
import com.ruoyi.satisfaction.domain.row.SatisfactionCategoryRow;
import com.ruoyi.satisfaction.domain.row.SatisfactionIvrScriptRow;
import com.ruoyi.satisfaction.domain.row.SatisfactionScriptQuery;
import com.ruoyi.satisfaction.domain.row.SatisfactionSubtaskQuery;
import com.ruoyi.satisfaction.domain.row.SatisfactionSubtaskRef;
import com.ruoyi.satisfaction.domain.row.SatisfactionSvyScriptRow;
import com.ruoyi.satisfaction.domain.vo.SatisfactionExceptConfigQuestionReqVO;
import com.ruoyi.satisfaction.domain.vo.SltdMydTotalVO;
 
import java.util.Date;
import java.util.List;
import java.util.Map;
 
/**
 * 满意度「子任务维度」统计服务。
 * <p>
 * 迁移说明:这些方法原属 {@code com.ruoyi.task.service.IServiceSubtaskService},
 * 但只有满意度相关入口在用(已逐个核实无其它调用方),故整批搬入满意度模块。
 * 方法签名除 {@link #getDetailRatio} 外均<b>一字未改</b>。
 * <p>
 * ⚠️ 本接口只应在满意度模块内部使用;其它模块需要满意度数据请用
 * {@code com.ruoyi.satisfaction.api} 下的门面接口。
 */
public interface SatisfactionSubtaskService {
 
    // ================================================================ 选项占比
 
    /**
     * 统计满意度选项的百分比。
     * <p>
     * 注意:本方法开头会先清理重复明细({@code selectRepeatDetailIds} / {@code deleteRepeatDetailByIds}),
     * 这是原实现就有的行为。
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOption(
            List<Long> taskIds, Date startFinishTime, Date endFinishTime,
            Date startOutHospTime, Date endOutHospTime, String scriptContent,
            Double scoreStart, Double scoreEnd, String valueType, List<Long> subtaskIds);
 
    /**
     * 满意度导出:选项占比。
     */
    List<ServiceSubtaskDetailRatioExport> statMydQuestionOptionForExport(
            List<Long> subtaskIds, String questiontext);
 
    /**
     * 根据子任务 ID 统计满意度选项的百分比(满意度 serviceType=6/14 用)。
     */
    List<ServiceSubtaskDetailRatioExport> statQuestionOptionBySubtaskIds(
            List<Long> subtaskIds, Date startOutHospTime, Date endOutHospTime,
            Date startFinishTime, Date endFinishTime, String scriptContent,
            Double scoreStart, Double scoreEnd, String valueType);
 
    /**
     * 按科室/病区对满意度题目做归类统计。
     */
    Map<String, Map<String, List<QuestionCountKsOrBqDTO>>> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO vo);
 
    /**
     * 问题结果占比(省立同德满意度统计用)。
     * <p>
     * <b>与原文的差异(仅签名)</b>:原文入参是 {@code List<ServiceSubtaskRes>},
     * 方法内部从中抽出 taskIds 与 subtaskIds。为让满意度模块不依赖 smartor 的实体,
     * 改为直接接收这两个 id 列表;<b>口径与分支判断完全不变</b>:
     * <ul>
     *   <li>serviceTypeList 同时含 2 与 6/14 → 返回 {@code null}(原文即如此,调用方据此提示"暂不支持");</li>
     *   <li>含 2 → 走 {@link #statQuestionOption}(按 taskid 统计);</li>
     *   <li>含 6/14 → 走 {@link #statQuestionOptionBySubtaskIds}(按 subtask id 统计)。</li>
     * </ul>
     *
     * @param taskIds    任务 id 列表(随访分支用;由调用方从查询结果抽出)
     * @param subtaskIds 子任务 id 列表(满意度分支用;由调用方从查询结果抽出)
     */
    List<ServiceSubtaskDetailRatioExport> getDetailRatio(
            SltdMydTotalVO sltdMydTotalVO, List<SatisfactionSubtaskRef> subtaskRefs);
 
    // ================================================================ 省立同德:趋势与维度
 
    /**
     * 省立同德患者满意度趋势(按周/月/年/日补零)。
     */
    List<MydTrendReqDTO> mydTrend(MydTrendReqVO mydTrendReqVO);
 
    /**
     * 省立同德患者满意度——按维度(科室/院区)统计。
     */
    List<MydTrendReqDTO> sltdMydTotalByDimension(MydTrendReqVO mydTrendReqVO);
 
    // ================================================================ 门诊得分排名
 
    /**
     * 门诊满意度综合得分排名(按科室或病区)。
     * <p>
     * 入参缺省处理保留原实现:{@code dimensionType} 为空则置 {@code "1"};
     * {@code serviceTypes} 为空则置 {@code ["14"]}(门诊满意度)。
     */
    List<MzMydScoreRankDTO> mzMydScoreRank(MzMydScoreRankVO mzMydScoreRankVO);
    /**
     * 按机构/院区/服务类型/出院时间/科室病区取子任务引用(只含 id、taskid)。
     * <p>
     * 供 {@code /sltdMydTotalByScore} 使用:原实现逐个 serviceType 调用
     * {@code getServiceSubtasks} 再转成 {@code ServiceSubtaskRes},现改为本方法。
     */
    List<SatisfactionSubtaskRef> getMydSubtaskRefs(SatisfactionSubtaskQuery query);
    /**
     * 获取满意度问题分类(语音 + 问卷),带缓存。
     * <p>
     * 供登录链路使用(原 {@code smartor.UserExtInfoServiceImpl.getSatisfactionCategories})。
     */
    Map<String, Object> getSatisfactionCategories(String orgid);
 
    /**
     * 获取满意度异常配置题目(语音 + 问卷),用于「满意度异常配置」页面。
     * <p>
     * 迁移说明:原为 {@code com.ruoyi.task.service.IServiceSubtaskDetailTraceService#getSatisfactionExceptConfigQuestion},
     * 服务实现落在随访异常跟踪 Service 里,但逻辑完全是满意度分类/题目的查询,
     * 故按模块化要求搬入本模块。<b>返回结构、字段名、筛选条件均与原文一致</b>:
     * <pre>
     * {
     *   "voiceDataList":         [ {questionId, libtemplateid, questionContent, questionTopic, questionType, categoryName, categoryId}, ... ],
     *   "questionnaireDataList": [ 同上 ]
     * }
     * </pre>
     * <b>保留的原文不对称行为</b>(不要"统一"):
     * <ul>
     *   <li>{@code scriptType} 为空时,语音与问卷<b>两段都执行</b>,两个 key 都会出现;</li>
     *   <li>语音侧的分类取的是服务方法(拼树后<b>只返回顶层分类</b>),问卷侧用的是 Mapper(取<b>全部</b>分类);</li>
     *   <li>{@code type} 为空时按 {@code "myd"} 过滤,入参有值时覆盖。</li>
     * </ul>
     *
     * @param questionReqVO 入参(scriptType:1 语音 / 2 问卷,为空取两者;type:满意度类型,默认 myd)
     * @return 语音与问卷的题目列表
     */
    Map<String, Object> getSatisfactionExceptConfigQuestion(SatisfactionExceptConfigQuestionReqVO questionReqVO);
 
    /**
     * 随访统计页的「满意度指数」:满意度题目总量 / 填报量 / 完成比例。
     * <p>
     * 迁移说明:原为 {@code com.ruoyi.task.service.impl.ServiceSubtaskServiceImpl#getSatisfactionIndex}
     * (私有方法,被 {@code getSfStatisticsJoy} 调用)。
     * <p>
     * ⚠️ <b>原实现缺陷已原样保留</b>:由于 {@code BigDecimal.add(...)} 的返回值被丢弃,
     * 本方法实际上恒定返回 {@code {mydtmzl:0, mydtbl:0, wcbl:0.0}}(但查询照旧执行)。
     * 详见实现类上的注释。
     *
     * @param type          "1"=按科室,"2"=按病区
     * @param code          科室/病区编码
     * @param orgid         机构 id
     * @param ivrCategoryid 语音满意度分类 id(可为 null)
     * @param svyCategoryid 问卷满意度分类 id(可为 null)
     * @return {@code mydtmzl}(Integer) / {@code mydtbl}(Integer) / {@code wcbl}(Double)
     */
    Map<String, Object> getSatisfactionIndex(String type, String code, String orgid,
                                            Long ivrCategoryid, Long svyCategoryid);
}