package com.ruoyi.task.mapper;
import com.ruoyi.template.domain.VO.HeLibraryCountVO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.ruoyi.common.core.service.dto.PatMedReq;
import com.ruoyi.common.core.service.dto.PatMedRes;
import com.ruoyi.task.domain.entity.ServiceSubtaskEntity;
import com.ruoyi.task.domain.ServiceStatisticsRequest;
import com.ruoyi.task.domain.ServiceStatisticsResponse;
import com.ruoyi.task.domain.ServiceSubtask;
import com.ruoyi.task.domain.ServiceSubtaskCount;
import com.ruoyi.task.domain.ServiceSubtaskCountReq;
import com.ruoyi.task.domain.ServiceSubtaskScriptCount;
import com.ruoyi.task.domain.ServiceSubtaskStatistic;
import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO;
/**
* 单一任务(随访)Mapper接口
*
* @author ruoyi
* @date 2024-02-02
*/
@Mapper
public interface ServiceSubtaskMapper {
/**
* 查询单一任务(随访)
*
* @param id 单一任务(随访)主键
* @return 单一任务(随访)
*/
public ServiceSubtask selectServiceSubtaskById(Long id);
/**
* 查询单一任务(随访)列表
*
* 入参 soonTimeout=1 且 soonTimeoutHours=N 时,仅返回“尚未超时、且将在 N 小时内超时”的数据,
* 截止时间口径与 getCurrentUserServiceSubtaskCount 的 soonTimeoutCount 一致。
*
* @param serviceSubtaskVO 单一任务(随访)
* @return 单一任务(随访)集合
*/
public List selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
/**
* 分页第一阶段:只取当前页的子任务 id。
*
* where / order 与 {@link #selectServiceSubtaskList} 共用同一份 XML 片段
* ({@code serviceSubtaskWhere} / {@code serviceSubtaskOrderByPaged}),
* 保证两条语句口径一致,不会出现「第一阶段选出行、第二阶段又被过滤掉」。
*
* 之所以要单独一条:列表语句 select 约 100 列,深翻页时被 offset 跳过的每一行
* 都要回表读整行;而只取 id 的语句可以走覆盖索引并提前截断。
*
* @param serviceSubtaskVO 查询条件(pageNum 是 offset、pageSize 是每页条数,由调用方算好)
* @return 当前页的子任务 id,已按排序规则排好序
*/
public List selectServiceSubtaskIdsPage(ServiceSubtaskEntity serviceSubtaskVO);
/**
* 用于补偿查询
*
* @param serviceSubtaskVO
* @return
*/
public List getCompensateServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
public List selectServiceSubtaskByDiagname(ServiceSubtask serviceSubtask);
public List queryServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO);
public List selectServiceSubtaskBySendstate(ServiceSubtaskEntity serviceSubtaskVO);
public List selectServiceSubtaskListByCreateTime(ServiceSubtaskEntity serviceSubtaskVO);
public List selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskVO);
public List selectServiceSubtaskListDeadLine(ServiceSubtaskEntity serviceSubtaskVO);
public List selectSendstateByCondition(ServiceSubtask serviceSubtask);
/**
* 新增单一任务(随访)
*
* @param ServiceSubtask 单一任务(随访)
* @return 结果
*/
public int insertServiceSubtask(ServiceSubtask ServiceSubtask);
/**
* 任务组(appltype=5):统计某一轮次内仍在运行的 subtask 数量。
* 仍在运行 = sendstate in (1,2,3) 且未删除。
* 用于判断本轮是否已全部 finalize(成功/失败/不执行/超时)。
*
* @param scheduleId 计划主键
* @param loopCount 轮次(0=首轮)
*/
public int countActiveByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId, @Param("loopCount") Long loopCount);
/**
* 任务组(appltype=5):拉取某一轮次的全部 subtask(用于克隆到下一轮)。
*/
public List selectByScheduleIdAndLoop(@Param("scheduleId") Long scheduleId, @Param("loopCount") Long loopCount);
/**
* 随访及时率:应随访时间<实际随访时间
*
* @param ServiceSubtask
* @return
*/
public Double selectTimelyRate(ServiceSubtask ServiceSubtask);
/**
* 随访及时率(按 groupKey 分组批量统计)
*
* rate:出院时间(endtime)起 rateDay + 补偿天数 内完成随访的占比。
* 补偿天数取自 service_subtask_preachform.compensate_time 按子任务求和,
* 用子任务快照而非 service_task.preachform_desc,保证历史数据不随任务改配置而变动。
* rateDay 为空时 rate 返回 NULL。
*
* finishRate:应随访时间(visit_time) <= 实际完成时间(finishtime) 的占比,当前未被随访统计使用。
*
* @param ServiceSubtaskvo
* @return
*/
@MapKey("groupKey")
public Map> selectTimelyRateBatch(ServiceSubtaskEntity ServiceSubtaskvo);
/**
* 随访及时率详情
*
* @param ServiceSubtask
* @return
*/
public List selectTimelyRateDetail(ServiceSubtask ServiceSubtask);
/**
* 修改单一任务(随访)
*
* @return 结果
*/
public Boolean updateServiceSubtask(ServiceSubtask ServiceSubtask);
public Boolean updateServiceSubtaskByPatId(ServiceSubtask ServiceSubtask);
public Boolean updateServiceSubtaskByCondition(ServiceSubtask ServiceSubtask);
public Boolean updateServiceSubtaskByTaskGuid(ServiceSubtask ServiceSubtask);
/**
* 删除单一任务(随访)
*
* @param id 单一任务(随访)主键
* @return 结果
*/
public int deleteServiceSubtaskById(Long id);
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 inhospids,
@Param("sendstates") List sendstates);
/**
* 统计患者指定任务下未完成的随访任务数量(用于人工随访重复校验)
*
* @param patid 患者ID
* @param taskid 任务ID
* @param sendstates 未完成状态集合
* @return 未完成任务数量
*/
int countUnfinishedServiceSubtaskByPatidAndTaskid(@Param("patid") Long patid,
@Param("taskid") Long taskid,
@Param("sendstates") List sendstates);
/**
* 删除单一任务(随访)
*
* @return 结果
*/
public List getDataByTime(@Param("beganTime") String beganTime, @Param("endTime") String endTime);
public List getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq);
public List getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq);
/**
* 随访分类统计:按分组(groupKey=drcode / leaveldeptcode / leavehospitaldistrictcode)在库里聚合。
*
* 用于替代“把 getSfStatistics 命中的全部明细行捞回内存再逐行累加”的老做法,
* 只返回分组数(几十行)的结果;统计口径与 {@code getStatisticCategory} 完全一致。
*
* @param serviceSubtaskCountReq 查询条件(必须已设置 groupKey / groupKeyList)
* @return 每个分组的聚合统计
*/
public List getSfStatisticsScriptSum(ServiceSubtaskCountReq serviceSubtaskCountReq);
/**
* 随访分类统计:满意度题目量按分组聚合(替代 getSfStatisticsCategory 的 IN 大列表 + 内存过滤)。
*
* @param serviceSubtaskCountReq 查询条件(必须已设置 groupKey / groupKeyList / configValue)
* @return 每行包含 groupCode、joyAllCount、joyCount 三个键
*/
public List