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; /** * 满意度「子任务维度」统计服务。 *

* 迁移说明:这些方法原属 {@code com.smartor.service.IServiceSubtaskService}, * 但只有满意度相关入口在用(已逐个核实无其它调用方),故整批搬入满意度模块。 * 方法签名除 {@link #getDetailRatio} 外均一字未改。 *

* ⚠️ 本接口只应在满意度模块内部使用;其它模块需要满意度数据请用 * {@code com.ruoyi.satisfaction.api} 下的门面接口。 */ public interface SatisfactionSubtaskService { // ================================================================ 选项占比 /** * 统计满意度选项的百分比。 *

* 注意:本方法开头会先清理重复明细({@code selectRepeatDetailIds} / {@code deleteRepeatDetailByIds}), * 这是原实现就有的行为。 */ List statQuestionOption( List taskIds, Date startFinishTime, Date endFinishTime, Date startOutHospTime, Date endOutHospTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType, List subtaskIds); /** * 满意度导出:选项占比。 */ List statMydQuestionOptionForExport( List subtaskIds, String questiontext); /** * 根据子任务 ID 统计满意度选项的百分比(满意度 serviceType=6/14 用)。 */ List statQuestionOptionBySubtaskIds( List subtaskIds, Date startOutHospTime, Date endOutHospTime, Date startFinishTime, Date endFinishTime, String scriptContent, Double scoreStart, Double scoreEnd, String valueType); /** * 按科室/病区对满意度题目做归类统计。 */ Map>> statQuestionOptionByKsOrBq(QuestionCountKsOrBqVO vo); /** * 问题结果占比(省立同德满意度统计用)。 *

* 与原文的差异(仅签名):原文入参是 {@code List}, * 方法内部从中抽出 taskIds 与 subtaskIds。为让满意度模块不依赖 smartor 的实体, * 改为直接接收这两个 id 列表;口径与分支判断完全不变: *

* * @param taskIds 任务 id 列表(随访分支用;由调用方从查询结果抽出) * @param subtaskIds 子任务 id 列表(满意度分支用;由调用方从查询结果抽出) */ List getDetailRatio( SltdMydTotalVO sltdMydTotalVO, List subtaskRefs); // ================================================================ 省立同德:趋势与维度 /** * 省立同德患者满意度趋势(按周/月/年/日补零)。 */ List mydTrend(MydTrendReqVO mydTrendReqVO); /** * 省立同德患者满意度——按维度(科室/院区)统计。 */ List sltdMydTotalByDimension(MydTrendReqVO mydTrendReqVO); // ================================================================ 门诊得分排名 /** * 门诊满意度综合得分排名(按科室或病区)。 *

* 入参缺省处理保留原实现:{@code dimensionType} 为空则置 {@code "1"}; * {@code serviceTypes} 为空则置 {@code ["14"]}(门诊满意度)。 */ List mzMydScoreRank(MzMydScoreRankVO mzMydScoreRankVO); /** * 按机构/院区/服务类型/出院时间/科室病区取子任务引用(只含 id、taskid)。 *

* 供 {@code /sltdMydTotalByScore} 使用:原实现逐个 serviceType 调用 * {@code getServiceSubtasks} 再转成 {@code ServiceSubtaskRes},现改为本方法。 */ List getMydSubtaskRefs(SatisfactionSubtaskQuery query); /** * 获取满意度问题分类(语音 + 问卷),带缓存。 *

* 供登录链路使用(原 {@code smartor.UserExtInfoServiceImpl.getSatisfactionCategories})。 */ Map getSatisfactionCategories(String orgid); /** * 获取满意度异常配置题目(语音 + 问卷),用于「满意度异常配置」页面。 *

* 迁移说明:原为 {@code com.smartor.service.IServiceSubtaskDetailTraceService#getSatisfactionExceptConfigQuestion}, * 服务实现落在随访异常跟踪 Service 里,但逻辑完全是满意度分类/题目的查询, * 故按模块化要求搬入本模块。返回结构、字段名、筛选条件均与原文一致: *

     * {
     *   "voiceDataList":         [ {questionId, libtemplateid, questionContent, questionTopic, questionType, categoryName, categoryId}, ... ],
     *   "questionnaireDataList": [ 同上 ]
     * }
     * 
* 保留的原文不对称行为(不要"统一"): *
    *
  • {@code scriptType} 为空时,语音与问卷两段都执行,两个 key 都会出现;
  • *
  • 语音侧的分类取的是服务方法(拼树后只返回顶层分类),问卷侧用的是 Mapper(取全部分类);
  • *
  • {@code type} 为空时按 {@code "myd"} 过滤,入参有值时覆盖。
  • *
* * @param questionReqVO 入参(scriptType:1 语音 / 2 问卷,为空取两者;type:满意度类型,默认 myd) * @return 语音与问卷的题目列表 */ Map getSatisfactionExceptConfigQuestion(SatisfactionExceptConfigQuestionReqVO questionReqVO); /** * 随访统计页的「满意度指数」:满意度题目总量 / 填报量 / 完成比例。 *

* 迁移说明:原为 {@code com.smartor.service.impl.ServiceSubtaskServiceImpl#getSatisfactionIndex} * (私有方法,被 {@code getSfStatisticsJoy} 调用)。 *

* ⚠️ 原实现缺陷已原样保留:由于 {@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 getSatisfactionIndex(String type, String code, String orgid, Long ivrCategoryid, Long svyCategoryid); }