package com.ruoyi.othervisit.service; import com.ruoyi.common.core.service.ArchiveReadApi; import com.ruoyi.common.core.service.ServiceTaskMatchApi; import com.ruoyi.common.core.service.VisitTaskCreateApi; import com.ruoyi.common.core.service.dto.ServiceTaskMatchDto; import com.ruoyi.common.core.service.dto.VisitArchiveRow; import com.ruoyi.common.core.service.dto.VisitLongTaskDto; import com.ruoyi.common.core.service.dto.VisitSubtaskDraft; import com.ruoyi.othervisit.domain.PatMedOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 手术随访编排:扫描未处理的手术记录 → 按手术编码匹配长期任务 → 写子任务。 * *
| 本类方法 | 原实现 |
|---|---|
| {@link #dealOperationInfo()} | *{@code PatMedOperationServiceImpl#dealOperationInfo} L107-149(42 行) |
| {@link #writeInSubTask} | *同文件 L152-187(36 行) |
| {@link #boxedServiceSubtask} | *同文件 L191-238(48 行,29 个 setter) |
| {@link #addDays} | 同文件 L240-248 |
* 逐行对应原 {@code dealOperationInfo}(L107-149): *
* PatMedOperation q = new PatMedOperation();
* q.setCheckFlag("0"); // 未处理
* List<PatMedOperation> list = selectPatMedOperationList(q);
* log.error("dealOperationInfo需要处理的手术信息:{}", list); // ⚠️ 原实现是 error 级
* for (每条记录) {
* 查档案;
* try {
* 按 opcode 查 longtask=1 的任务;
* 为空 -> checkFlag="2" + "该手术编码,未配置长期任务;" + update + continue
* 多个 -> longTaskReason="该手术编码,有多个随访长期任务:"+taskIds + update,只留第一个
* writeInSubTask(第一个任务ID, true, 记录, 档案);
* } catch (Exception e) { e.printStackTrace(); log.error("人员处理出异常了:{}", e.getMessage()); }
* }
* return 1; // 固定值
*
*
* @return 固定 {@code 1}(与原实现一致,不是处理条数)
*/
public Integer dealOperationInfo() {
ServiceTaskMatchApi matchApi = matchApi();
VisitTaskCreateApi taskApi = taskApi();
ArchiveReadApi archiveApi = archiveApi();
if (matchApi == null || taskApi == null) {
log.warn("【手术随访】跨模块契约不可用(ServiceTaskMatchApi={}, VisitTaskCreateApi={}),跳过本次手术随访。",
matchApi != null, taskApi != null);
return 1;
}
PatMedOperation query = new PatMedOperation();
// 获取需要出院随访,未处理的数据
query.setCheckFlag("0");
List* 逐行对应原 {@code PatMedOperationServiceImpl#writeInSubTask}(L152-187)。 * *
* 逐字段对应原 {@code boxedServiceSubtask}(L191-238,29 个 setter)。 * *
* ⚠️ 这是一个已登记的、与门诊版完全相同的口径限制: * 那 18 个"靠拷贝带进子任务"的字段里,{@code VisitLongTaskDto} 只承载 * {@code taskName}/{@code type}/{@code preachformDesc}/{@code createBy} 等已列出的几个, * 其余({@code guid}/{@code pid}/{@code sendType}/{@code isupload}/…) * 需要由将来的「随访任务创建模块」在实现 {@code insertSubtask} 时补齐。 * 本模块不自己补,也不把它们加到 {@code VisitSubtaskDraft} 上 —— * 那会让出入院/门诊两条已验收的链路多写列。 * 落地方式与门诊侧({@code OuthospVisitTaskService#boxedServiceSubtask})一致。 * *
* 逐行对应原 {@code PatMedOperationServiceImpl#addDays}(L240-248)。
* ⚠️ 与出入院侧的 {@code minusDay} 不是同一个方法(那个硬编码减 2 天并忽略入参)。
*/
private Date addDays(Date date, Integer days) {
if (days == null) {
days = 1;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, days);
return calendar.getTime();
}
// ==========================================================================
// 契约取用(与门诊/出入院模块同一写法:ObjectProvider + stream,取不到就降级)
// ==========================================================================
private ServiceTaskMatchApi matchApi() {
return providerGet(matchApiProvider, "ServiceTaskMatchApi");
}
private ArchiveReadApi archiveApi() {
return providerGet(archiveApiProvider, "ArchiveReadApi");
}
private VisitTaskCreateApi taskApi() {
return providerGet(taskApiProvider, "VisitTaskCreateApi");
}
private