陈昶聿
5 天以前 04d04154d9041535342736bd1c924ade5d818614
ruoyi-task/src/main/java/com/ruoyi/task/mapper/ServiceSubtaskMapper.java
@@ -38,11 +38,29 @@
    /**
     * 查询单一任务(随访)列表
     * <p>
     * 入参 soonTimeout=1 且 soonTimeoutHours=N 时,仅返回“尚未超时、且将在 N 小时内超时”的数据,
     * 截止时间口径与 getCurrentUserServiceSubtaskCount 的 soonTimeoutCount 一致。
     *
     * @param serviceSubtaskVO 单一任务(随访)
     * @return 单一任务(随访)集合
     */
    public List<ServiceSubtask> selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * 分页第一阶段:只取当前页的子任务 id。
     * <p>
     * where / order 与 {@link #selectServiceSubtaskList} 共用同一份 XML 片段
     * ({@code serviceSubtaskWhere} / {@code serviceSubtaskOrderByPaged}),
     * 保证两条语句口径一致,不会出现「第一阶段选出行、第二阶段又被过滤掉」。
     * <p>
     * 之所以要单独一条:列表语句 select 约 100 列,深翻页时被 offset 跳过的每一行
     * 都要回表读整行;而只取 id 的语句可以走覆盖索引并提前截断。
     *
     * @param serviceSubtaskVO 查询条件(pageNum 是 offset、pageSize 是每页条数,由调用方算好)
     * @return 当前页的子任务 id,已按排序规则排好序
     */
    public List<Long> selectServiceSubtaskIdsPage(ServiceSubtaskEntity serviceSubtaskVO);
    
@@ -108,10 +126,14 @@
    /**
     * 随访及时率(按 groupKey 分组批量统计)
     * <p>
     * rate:出院时间(endtime)起 rateDay + 补偿天数 内完成随访的占比。
     * rate:完成时间(finishtime) 不晚于及时率基准的占比,分母为应随访数。
     * 非任务组(appltype != 5):endtime + send_day(缺省1) + Σ补偿天数 + 1 天;
     * 任务组(appltype = 5):按 schedule_benchmark 解析基准时间
     * (1-入院 2-出院 3-就诊 4-入组 0/其它-自定义时间) + day_offset
     * + Σ补偿天数 + 1 天(不叠加 send_day)。
     * 补偿天数取自 service_subtask_preachform.compensate_time 按子任务求和,
     * 用子任务快照而非 service_task.preachform_desc,保证历史数据不随任务改配置而变动。
     * rateDay 为空时 rate 返回 NULL。
     * rateDay 参数不再参与该口径。
     * <p>
     * finishRate:应随访时间(visit_time) &lt;= 实际完成时间(finishtime) 的占比,当前未被随访统计使用。
     *
@@ -140,6 +162,14 @@
    public Boolean updateServiceSubtaskByCondition(ServiceSubtask ServiceSubtask);
    /**
     * 微信公众号已领取未填写按默认选项完成:只更新当前子任务,且只允许 sendstate=1、未提交的数据。
     *
     * @param serviceSubtask 必填 id、finishtime、result、remark
     * @return 影响行数
     */
    public int updateWechatDefaultComplete(ServiceSubtask serviceSubtask);
    public Boolean updateServiceSubtaskByTaskGuid(ServiceSubtask ServiceSubtask);
    /**
@@ -153,6 +183,30 @@
    public int deleteServiceSubtaskByCondition(@Param("taskid") Long id, @Param("patid") Long patid);
    /**
     * 删除患者出院记录对应的未完成随访任务
     *
     * @param patid      患者ID
     * @param inhospids  出院记录ID集合
     * @param sendstates 未完成状态集合
     * @return 删除条数
     */
    public int deleteUnfinishedServiceSubtaskByInhospids(@Param("patid") Long patid,
                                                         @Param("inhospids") List<Long> inhospids,
                                                         @Param("sendstates") List<Long> sendstates);
    /**
     * 统计患者指定任务下未完成的随访任务数量(用于人工随访重复校验)
     *
     * @param patid      患者ID
     * @param taskid     任务ID
     * @param sendstates 未完成状态集合
     * @return 未完成任务数量
     */
    int countUnfinishedServiceSubtaskByPatidAndTaskid(@Param("patid") Long patid,
                                                      @Param("taskid") Long taskid,
                                                      @Param("sendstates") List<Long> sendstates);
    /**
     * 删除单一任务(随访)
     *
     * @return 结果
@@ -162,6 +216,25 @@
    public List<ServiceSubtaskCount> getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public List<ServiceSubtask> getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * 随访分类统计:按分组(groupKey=drcode / leaveldeptcode / leavehospitaldistrictcode)在库里聚合。
     * <p>
     * 用于替代“把 getSfStatistics 命中的全部明细行捞回内存再逐行累加”的老做法,
     * 只返回分组数(几十行)的结果;统计口径与 {@code getStatisticCategory} 完全一致。
     *
     * @param serviceSubtaskCountReq 查询条件(必须已设置 groupKey / groupKeyList)
     * @return 每个分组的聚合统计
     */
    public List<ServiceSubtaskStatistic> getSfStatisticsScriptSum(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * 随访分类统计:满意度题目量按分组聚合(替代 getSfStatisticsCategory 的 IN 大列表 + 内存过滤)。
     *
     * @param serviceSubtaskCountReq 查询条件(必须已设置 groupKey / groupKeyList / configValue)
     * @return 每行包含 groupCode、joyAllCount、joyCount 三个键
     */
    public List<Map<String, Object>> getSfStatisticsScriptJoySum(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public List<ServiceSubtaskStatistic> getSpecialSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq);
@@ -194,6 +267,14 @@
     */
    public List<ServiceSubtaskScriptCount> getSfStatisticsScriptItemDetails(ServiceSubtaskCountReq serviceSubtaskCountReq);
    /**
     * 问题选项数字下钻:查询选择了指定选项的 service_subtask 列表
     *
     * @param serviceSubtaskCountReq 统计维度、科室/病区、任务、题目及选项条件
     * @return service_subtask 列表
     */
    public List<ServiceSubtask> getSfStatisticsScriptDetailsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq);
    public List<PatMedRes> getDeptRanking(PatMedReq patMedReq);
@@ -212,6 +293,7 @@
     * ywc: 已完成数量 sendstate = 6L
     * dfs: 待发送数量 sendstate = 1L, 3L, 4L, 5L, 6L, 7L
     * yfs: 已发送数量 sendstate = 2L
     * cs: 超时数量 sendstate = 7L
     * yc: 异常数量 excep = '1'
     * yc: 警告数量 excep = '2'
     */
@@ -226,8 +308,20 @@
     * failedVisitCount: 当前登录人随访任务失败总量
     * abnormalVisitVount: 当前登录人随访任务异常总量
     * allVisitCount: 当前登录人随访任务总量
     * soonTimeoutCount: 当前登录人即将超时数量(超时截止时间在 soonTimeoutHours 小时内,仅统计尚未超时的数据)
     */
    public Map<String, Object> getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * 当前登录人待处理随访任务,按出院年月分组统计
     * <p>
     * 统计口径:出院随访/门诊随访(service_type in 2,3)+ 人工(current_preachform = '1')
     * + 待随访状态(sendstate in 1,2,3,5,7)+ 出院时间早于等于今天 - 7 天。
     *
     * @param serviceSubtaskVO 查询条件(orgid、科室、病区)
     * @return 每行包含 month(yyyy-MM)与 cnt(数量),数量为 0 的月份不会返回
     */
    public List<Map<String, Object>> countPendingManualTaskByMonth(ServiceSubtaskEntity serviceSubtaskVO);
    /**
     * 获取门诊随访人数
@@ -282,4 +376,14 @@
    
    /**
     * 条件更新原任务的“是否再次随访”标识,用于二次随访幂等控制。
     * 仅当当前值不是目标值时才更新,返回受影响行数。
     *
     * @param id           子任务 ID
     * @param isVisitAgain 目标值(2-已再次随访)
     * @return 受影响行数,1 表示抢到生成权,0 表示已被其他请求处理
     */
    int updateIsVisitAgainById(@Param("id") Long id, @Param("isVisitAgain") Integer isVisitAgain);
}