package com.ruoyi.inhospvisit.api; import com.ruoyi.common.core.service.dto.VisitAgainSubtaskDto; import com.ruoyi.inhospvisit.service.InhospVisitTaskService; import com.ruoyi.inhospvisit.service.TaskGroupCycleRoller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * {@link InhospVisitApi} 的唯一内部实现(常驻 Bean)。 * *
⚠️ 调用方不要直接注入本类,应注入常驻门面 {@link InhospVisitFacade} * —— 门面负责开关判断与降级,本类只做转发。 * *
⚠️ 刻意不加 {@code @ConditionalOnProperty}:该注解只在启动时求值一次, * 无法支持"改完 {@code sys_config} 参数即时生效";开关判断统一由门面在运行时做。 * *
| 方法 | 状态 |
|---|---|
| {@link #dealOutHospInfo(String)} | *✅ 已接入 {@link InhospVisitTaskService}(第 10 步切换) |
| {@link #rollTaskGroupCycle()} | *✅ 已接入 {@link TaskGroupCycleRoller}(第 9 步搬迁) |
| {@link #dealOutHospInfoBySchedule(String)} | *⏸ 未接入:该方法本次不搬(含手术分支与任务组 builder,属第二批 * {@code ruoyi-othervisit} 范围),仍由 smartor 的实现承接。 * {@code RyTask} 在本步不改这一处。 |
| {@link #buildAgainVisitDraft} | *⏸ 未接入:「随访超时→再次随访」链路;原实现调 * {@code boxedServiceSubtask},需把 {@code pat_med_operation_item} 维度也考虑进来。 * 本次保持现状(返回空结果 = 不生成),并在 {@code RyTask} 侧暂不改这一处。 |
| {@link #generatePublicitySubtask} | *✅ 已接入(宣教模块回调本模块建子任务) |
* 该方法本身未搬迁(含手术分支与任务组 builder,属第二批 {@code ruoyi-othervisit}), * 但端点已迁进本模块,所以这里只做转发 —— 行为与原 Controller 直接调 * {@code iPatMedInhospService.dealOutHospInfoBySchedule(config)} 完全一致。 */ @Override public int dealOutHospInfoBySchedule(String config) { com.ruoyi.common.core.service.OtherVisitApi api = otherVisitApi(); if (api == null) { log.warn("【出入院随访】OtherVisitApi 不可用,dealOutHospInfoBySchedule 跳过。config={}", config); return 0; } return api.dealOutHospInfoBySchedule(config); } /** * ✅ 已接入:转发到 {@code com.ruoyi.common.core.service.OtherVisitApi}(smartor 过渡实现)。 *
* 手术随访本次未搬(属第二批 {@code ruoyi-othervisit}),端点已迁进本模块,故此处只转发。 */ @Override public int addOperationSubTask(String config) { com.ruoyi.common.core.service.OtherVisitApi api = otherVisitApi(); if (api == null) { log.warn("【出入院随访】OtherVisitApi 不可用,addOperationSubTask 跳过。config={}", config); return 0; } return api.addOperationSubTask(config); } /** * ✅ 已接入:转发到 {@code com.ruoyi.common.core.service.OuthospVisitApi}(smartor 过渡实现)。 *
* 门诊随访属第二批 {@code ruoyi-outpatientvisit},本次只接转发。 * 站点判断({@code active != "xh"})在 Controller 里,与原实现位置一致。 */ @Override public int dealOutpatientInfo() { com.ruoyi.common.core.service.OuthospVisitApi api = outhospVisitApi(); if (api == null) { log.warn("【出入院随访】OuthospVisitApi 不可用(门诊随访模块未装配),dealOutpatientInfo 跳过。"); return 0; } return api.dealOutpatientInfo(); } @Override public int rollTaskGroupCycle() { return taskGroupCycleRoller.rollCycleTasks(); } /** * ⏸ 未接入(见类注释):返回"未找到出入院记录",调用方会跳过该条(与原实现的 continue 语义一致, * 但不会因为"模块未接入"而误生成子任务)。 */ @Override public VisitAgainSubtaskDto buildAgainVisitDraft(String orgid, Long inhospid, Long newTaskId, Long sendstate) { log.warn("【出入院随访】buildAgainVisitDraft 本次未接入(随访超时→再次随访链路属后续范围)," + "返回空结果。orgid={}, inhospid={}", orgid, inhospid); return InhospVisitFacade.emptyAgainDraft("本次未接入(后续范围)"); } /** * 宣教模块回调:为某患者生成一条宣教类子任务(type=0/4/5)。 *
* 逐行对应原 {@code dealOutHospInfo} 里那两段宣教的最终动作 * —— 即 {@code writeInSubTask(taskId, true, patMedInhosp, patArchive, type, config)}。 * 这里按 inhospid 重新加载出入院记录与患者档案,然后委托给 * {@link com.ruoyi.inhospvisit.service.InhospSubtaskWriter}(boxed 的 type=0/4/5 分支全仓只有一份)。 */ @Override public boolean generatePublicitySubtask(Long taskid, Long patid, Long inhospid, int type, String config) { if (inhospid == null) { log.warn("【出入院随访】generatePublicitySubtask 缺少 inhospid,跳过。taskid={}, patid={}, type={}", taskid, patid, type); return false; } com.ruoyi.inhospvisit.domain.row.VisitInhospRow inhosp = inhospMapper.selectByInhospid(inhospid); if (inhosp == null) { log.warn("【出入院随访】generatePublicitySubtask 查不到出入院记录,跳过。inhospid={}", inhospid); return false; } // 患者档案:原实现传 patMedInhosp.patid(不是宣教模块传来的 patid),这里保持一致 com.ruoyi.common.core.service.dto.VisitArchiveRow archive = archiveMapper.selectByPatid(inhosp.getPatid()); if (archive == null) { log.warn("【出入院随访】generatePublicitySubtask 查不到患者档案,跳过。patid={}", inhosp.getPatid()); return false; } // check=true:让 writeInSubTask 内部做去重/再入院校验(原实现两段宣教都是 true) inhospSubtaskWriter.writeInSubTask(taskid, true, inhosp, archive, type, config); return true; } }