package com.ruoyi.task.service; import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.web.bind.annotation.RequestBody; import java.util.Date; import java.util.List; import java.util.Map; import com.ruoyi.template.domain.VO.HeLibraryCountVO; import com.ruoyi.template.domain.IvrTaskTemplateTargetoption; 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.ServiceTask; import com.ruoyi.task.domain.VO.ServiceSubtaskCotinueCountVO; import com.ruoyi.task.domain.PatArchiveSrmVO; import com.ruoyi.task.domain.ServiceSubtaskDiagname; import com.ruoyi.task.domain.ServiceSubtaskIsAbnormalStatistic; import com.ruoyi.task.domain.ServiceSubtaskRes; import com.ruoyi.task.domain.ServiceSubtaskTemplateVO; import com.ruoyi.task.domain.ServiceTaskVO; import com.ruoyi.task.domain.VO.TransferDeptVO; /** * 单一任务(随访)Service接口 * * @author ruoyi * @date 2024-02-02 */ public interface IServiceSubtaskService { /** * 丽水中医院 orgid。 * 微信公众号已领取未填写按默认选项完成,暂时只对该机构生效,其他医院仍走原补偿逻辑。 */ String WECHAT_DEFAULT_COMPLETE_ORGID = "47231022633110211A2101"; /** * 查询单一任务(随访) * * @param id 单一任务(随访)主键 * @return 单一任务(随访) */ public ServiceSubtask selectServiceSubtaskById(Long id); public List selectServiceSubtaskByDiagname(ServiceSubtask serviceSubtask); /** * 查询单一任务(随访)列表 * * @param serviceSubtaskVO 单一任务(随访) * @return 单一任务(随访)集合 */ public List selectServiceSubtaskList(ServiceSubtaskEntity serviceSubtaskVO); public List selectServiceSubtaskListAgain(ServiceSubtaskEntity serviceSubtaskVO); /** * 根据条件查询任务信息 * * @param ServiceSubtask * @return */ public ServiceTaskVO queryTaskByCondition(ServiceSubtask ServiceSubtask); /** * 查询患者随访信息 */ public List patItem(ServiceSubtaskEntity serviceSubtaskEntity); public List getServiceSubtasks(ServiceSubtaskEntity serviceSubtaskEntity); /** * 转移科室病区 * * @param transferDeptVO * @return */ public Integer transferDept(TransferDeptVO transferDeptVO); public List patItem2(ServiceSubtaskEntity serviceSubtaskEntity); public Map patItemCount(ServiceSubtaskEntity serviceSubtaskEntity); public Map countByCondition(ServiceSubtaskEntity serviceSubtaskEntity); /** * 新增单一任务(随访) * * @param ServiceSubtask 单一任务(随访) * @return 结果 */ public Map insertServiceSubtask(ServiceSubtask ServiceSubtask); /** * 再次新增单一任务(随访) * * @param ServiceSubtask 再次新增单一任务(随访) * @return 结果 */ public String addSubTaskAgain(ServiceSubtask ServiceSubtask); /** * 首次随访任务超时后,按下一任务自动生成再次随访任务(随访中心)。 *

* 与手动入口的差异:随访中心科室未配置时回退原任务科室;同一原任务只生成一条(锁 + 条件更新幂等)。 * * @param serviceSubtask 已超时的首次随访子任务 * @return 结果描述 */ public String addSubTaskAgainByDeadline(ServiceSubtask serviceSubtask); /** * 修改单一任务(随访) * * @param ServiceSubtask 单一任务(随访) * @return 结果 */ public Boolean updateServiceSubtask(ServiceSubtask ServiceSubtask); /** * 子任务模板修改 * * @param serviceSubtaskTemplateVO * @return */ public Boolean updateTemplate(ServiceSubtaskTemplateVO serviceSubtaskTemplateVO); /** * 批量删除单一任务(随访) * * @param ids 需要删除的单一任务(随访)主键集合 * @return 结果 */ public int deleteServiceSubtaskByIds(Long[] ids); /** * 新增宣教任务 * * @param ivrTaskVO 单一任务 * @return 结果 */ public Map insertOrUpdateTask(ServiceTaskVO ivrTaskVO); /* * ------------------------------------------------------------------ * 电话相关的 7 个方法(phoneCallBack / phoneCallBackYQ / getFirstQues / * processResust / taskPull / saveQuestionAnswerPhone / recordAccept) * 已随电话模块化整体搬进 ruoyi-phone: * 接口 -> com.ruoyi.phone.service.IPhoneService * 实现 -> com.ruoyi.phone.service.impl.PhoneServiceImpl * 对外 -> com.ruoyi.phone.api.PhoneFacade(其它模块从这里调电话能力) * URL 保持不变,线上电话平台无需改动。 * ------------------------------------------------------------------ */ /** * 获取随访、复诊量 * * @param serviceSubtaskCountReq * @return */ public List getSfFzInfoEveryMonth(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getSpecialSfStatistics(ServiceSubtaskCountReq serviceSubtaskCountReq); //导出随访 public List getSfStatisticsExport(ServiceSubtaskCountReq serviceSubtaskCountReq); //导出随访-异常 public List getSfStatisticsIsAbnormalExport(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getSfStatisticsJoy(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getSfStatisticsJoydetails(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getSfStatisticsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq); public List getServiceStatistics(ServiceStatisticsRequest request); public List getSfStatisticsScript(ServiceSubtaskCountReq serviceSubtaskCountReq); public Map getSfStatisticsScriptDetails(ServiceSubtaskCountReq serviceSubtaskCountReq); /** * 问题选项数字下钻:查询选择了指定选项的 service_subtask 列表 * * @param serviceSubtaskCountReq 统计维度、科室/病区、任务、题目及选项条件 * @return service_subtask 列表 */ public List getSfStatisticsScriptDetailsHyperlink(ServiceSubtaskCountReq serviceSubtaskCountReq); public List sendMsgTemplate(List patArchiveSrmVOS); public List convertToDiagnameList(List subtaskList); /** * 统计任务各种状态的数量 -【随访工作台】 * * @param entity 查询条件(科室/病区权限、soonTimeoutHours 即将超时小时数等) * @return 含 pendingVisitCount、failedVisitCount、abnormalVisitCount、warnningVisitCount、 * allVisitCount、soonTimeoutCount 的统计结果 */ public Map getCurrentUserServiceSubtaskCount(ServiceSubtaskEntity entity); /** * 当前登录人待处理随访任务,按出院年月分组统计(出院随访、门诊随访分开计数) *

* 口径:出院随访 service_type='2'、门诊随访 service_type='3' * + 待随访状态(sendstate in 1,2,3,5,7) * + 出院满 7 天(含「7 天前那一天」出院的患者),且只看最近 4 个出院月份(含当月)。 * * @param entity 查询条件(orgid、科室、病区) * @return { total: 总数量, months: [{ month: 'yyyy-MM', dischargeCount: 出院随访数量, outpatientCount: 门诊随访数量 }] } * 只返回有数据的月份,没有数据的月份由前端补 0 */ public Map getPendingManualTaskMonthStats(ServiceSubtaskEntity entity); /** * 按病区或科室统计延续护理数量 * 都不传时同时按病区和科室各统计一遍 * * @param vo 查询条件(leavehospitaldistrictcodes 与 deptcodes 互斥) * @return noContinueCount、ContinueCount 及 detail 列表 */ Map getContinueNurseCount(ServiceSubtaskCotinueCountVO vo); /** * 设置失败任务默认值,并将失败任务重新置为成功 *

* *@param failDay (失败天数:距离当前日期失败天数) * * @return */ public void setFailSubTaskDefalutVal(Long failDay); /** * 微信公众号已领取未填写:按题目默认选项补齐当前子任务,并将当前子任务完成。 *

* 仅处理传入的当前子任务(subid),只允许: * 问卷类型(type=2)、当前发送方式为公众号(5)、子任务已领取(1)、未提交(submit!=1)、 * 当前公众号发送方式为已发送(2)/已领取(3) 的数据。 * 其他任务、其他发送方式、其他子任务均不受影响。 * * @param serviceSubtask 当前子任务 * @return true=已按默认选项完成;false=不满足条件或没有可填充的默认选项 */ public Boolean completeWechatClaimedByDefault(ServiceSubtask serviceSubtask); public Map getHeLibraryCount(@RequestBody HeLibraryCountVO heLibraryCountVO); public List gethelibraryCountHyperlink(@RequestBody HeLibraryCountVO heLibraryCountVO); Map smsSubTask(Long subid); /** * 丽水中医院微信公众号发送:master 新增的对外入口(实现类同名方法)。 *

* 与 {@link #smsSubTask(Long)} 的区别:短信请走 ruoyi-message 的 SmsSenderFactory, * 该入口只做丽水微信特有的链路,供需要直发公众号的调用方使用。 */ Map weChatSubTask(Long subid); public String scanGenerateSubtask(ServiceTask serviceTaskVo); /** * AI 选项匹配(把 options 序列化后 POST 到外部 AI 服务)。 *

* ⚠️ 入参改成泛型 {@code List}(原为 {@code List}): * 那个类型已随模板模块化搬进 {@code ruoyi-template},而本方法要经 * {@code SubtaskOptionMatchApiBridge} 向模板模块暴露(接口在 ruoyi-common)。 * 泛型让模板模块不必知道 {@code T} 是什么,同时保持 smartor 内部 4 处调用点形状不变。 *

* 语义无变化:方法体只做 {@code jsonObject.put("options", options)} 后整体序列化, * 从不读 {@code T} 的字段。 */ public Integer matchOptionIndex(String url, String questionText, String voiceText, List options, String uuid); }