yxh
6 天以前 68ff33beff11310e830b0615b5a81f83fad0f683
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/jobrecord/JobRecordServiceImpl.java
@@ -19,6 +19,9 @@
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;
@@ -33,10 +36,15 @@
 */
@Service
@Validated
@Slf4j
public class JobRecordServiceImpl implements JobRecordService {
    @Resource
    private JobRecordMapper jobRecordMapper;
    /** 【撤销标识】读当日队列状态,判断"完成是否被撤销过" */
    @Resource
    private QueueMapper queueMapper;
    @Resource
    private DevRentMapper devRentMapper;
@@ -98,11 +106,56 @@
            }
            // 需求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