package com.ruoyi.datacollection.service.impl; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.core.service.HisGatherApi; import com.ruoyi.common.core.service.dto.InhospPositionRecord; import com.ruoyi.common.core.service.dto.SltdGatherReq; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.datacollection.service.IInhospDeptRefreshService; import com.ruoyi.inhospvisit.api.InhospVisitFacade; import com.ruoyi.inhospvisit.domain.PatMedInhosp; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; /** * 在院患者"科室 / 病区 / 床位"每日刷新 —— 编排与"改不改"的判定都在本类。 * *
* pat_med_inhosp.deptcode <- String.valueOf(deptId) * pat_med_inhosp.deptname <- deptName * pat_med_inhosp.hospitaldistrictcode <- String.valueOf(areaId) * pat_med_inhosp.hospitaldistrictid <- String.valueOf(areaId) * pat_med_inhosp.hospitaldistrictname <- areaName * pat_med_inhosp.bed_no <- bedNumber(为空则清空) ** *
* 正常只会返回 1 条;这里仍做一层防御:只接受状态为在院的记录,
* 一条都不匹配则返回 {@code null}(按"已不在院"处理),
* 绝不拿一条状态不明的记录去覆盖库内位置。
*/
private InhospPositionRecord pickInHospRecord(List
* Redis 不可用时退化为无锁执行:每天一次的数据刷新不该因为缓存故障整体不跑,
* 最坏情况是手工触发与定时任务叠着跑 —— 而本功能是幂等比对,叠跑只会多打几条日志。
*/
private boolean tryLock() {
try {
if (Boolean.TRUE.equals(redisCache.hasKey(RUN_LOCK_KEY))) {
return false;
}
redisCache.setCacheObject(RUN_LOCK_KEY, String.valueOf(System.currentTimeMillis()),
RUN_LOCK_MINUTES, TimeUnit.MINUTES);
return true;
} catch (Exception e) {
log.warn("【在院信息刷新】Redis 运行锁不可用({}),本轮无锁执行", e.getMessage());
return true;
}
}
private void unlock() {
try {
redisCache.deleteObject(RUN_LOCK_KEY);
} catch (Exception e) {
log.warn("【在院信息刷新】释放运行锁失败:{}", e.getMessage());
}
}
/**
* 单条患者的处置结果
*/
private enum Outcome {
/**
* 位置有变化并已写回
*/
CHANGED,
/**
* 与库内一致,未改动
*/
UNCHANGED,
/**
* HIS 里该患者已不在"入院"状态(接口返回为空),库内位置保持不动
*/
NOT_IN_HOSP,
/**
* 拿不到可用信息(无流水号 / 返回记录状态不对)
*/
SKIPPED
}
}