| | |
| | | import cn.lihu.jh.framework.common.util.object.BeanUtils; |
| | | |
| | | import cn.lihu.jh.module.ecg.dal.mysql.jobrecord.JobRecordMapper; |
| | | import cn.lihu.jh.module.ecg.dal.mysql.queue.QueueMapper; |
| | | import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | |
| | | */ |
| | | @Service |
| | | @Validated |
| | | @Slf4j |
| | | public class JobRecordServiceImpl implements JobRecordService { |
| | | |
| | | @Resource |
| | | private JobRecordMapper jobRecordMapper; |
| | | |
| | | /** 【撤销标识】读当日队列状态,判断"完成是否被撤销过" */ |
| | | @Resource |
| | | private QueueMapper queueMapper; |
| | | |
| | | @Resource |
| | | private DevRentMapper devRentMapper; |
| | |
| | | } |
| | | // 需求1:回填患者信息(批量,避免 N+1) |
| | | fillPatientInfo(jobRecordDOList); |
| | | // 【撤销标识】标记"完成被撤销过、还没重新完成"的记录 |
| | | fillUndoneFlag(jobRecordDOList); |
| | | } |
| | | |
| | | return pageResult; |
| | | } |
| | | |
| | | /** |
| | | * 【撤销标识】给"已完成记录"补上 {@code undone}。 |
| | | * |
| | | * <p>撤销「检查完成」只是把队列行 40(已就诊) 改回 20(准备中),**不碰 job_record**; |
| | | * 因此判断规则是:该患者**今日**对应检查项目的队列行存在、且状态 ≠ 40 → 已被撤销。 |
| | | * 患者再次完成后队列行会回到 40 → 自动恢复成"已完成",无需写库、也不会漏清标记。 |
| | | * |
| | | * <p>一次批量查询解决整页(按 patId 取当日队列状态,再在内存里按 patId+checkType 匹配)。 |
| | | */ |
| | | private void fillUndoneFlag(List<JobRecordDO> jobRecordDOList) { |
| | | List<String> patIdList = jobRecordDOList.stream() |
| | | .map(JobRecordDO::getPatId) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .toList(); |
| | | if (patIdList.isEmpty()) { |
| | | return; |
| | | } |
| | | Map<String, Integer> statusMap = new HashMap<>(); |
| | | try { |
| | | for (Map<String, Object> row : queueMapper.selectTodayStatusByPatIds(patIdList)) { |
| | | Object patId = row.get("patId"); |
| | | Object checkType = row.get("checkType"); |
| | | Object status = row.get("status"); |
| | | if (null != patId && null != checkType && status instanceof Number) { |
| | | statusMap.put(patId + "#" + checkType, ((Number) status).intValue()); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.warn("[fillUndoneFlag] 读取当日队列状态失败,撤销标识按【未撤销】处理", e); |
| | | return; |
| | | } |
| | | for (JobRecordDO row : jobRecordDOList) { |
| | | if (null == row.getPatId() || null == row.getCheckType()) { |
| | | row.setUndone(false); |
| | | continue; |
| | | } |
| | | Integer status = statusMap.get(row.getPatId() + "#" + row.getCheckType()); |
| | | // 队列行不存在(历史记录/已清理)→ 视为未撤销;存在且不是 40 → 已撤销 |
| | | row.setUndone(null != status && QueueStatusEnum.FINISH.getStatus() != status); |
| | | } |
| | | } |
| | | |
| | | // ==================== 需求1:回填患者信息 18 项 ==================== |
| | | // 回填链路(三级): |
| | | // job_record.rentId → dev_rent.applyNo → appointment |