From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsJianyanJinduServiceImpl.java |  250 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 250 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsJianyanJinduServiceImpl.java b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsJianyanJinduServiceImpl.java
new file mode 100644
index 0000000..0dfdca9
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsJianyanJinduServiceImpl.java
@@ -0,0 +1,250 @@
+package jnpf.limsService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jnpf.limsEntity.LimsJianyanJinduDetailVo;
+import jnpf.limsEntity.LimsJianyanJinduQingyandanRow;
+import jnpf.limsEntity.LimsJianyanXiangEntity;
+import jnpf.limsMapper.LimsBaseUserMapper;
+import jnpf.limsMapper.LimsJianyanJinduMapper;
+import jnpf.limsMapper.LimsJianyanXiangMapper;
+import jnpf.limsService.LimsJianyanJinduService;
+import jnpf.permission.entity.UserEntity;
+import jnpf.util.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 妫�楠岃繘搴﹁鎯呮湇鍔″疄鐜般��
+ */
+@Service
+public class LimsJianyanJinduServiceImpl implements LimsJianyanJinduService {
+
+    private static final String DATE_PATTERN = "yyyy-MM-dd";
+
+    @Autowired
+    private LimsJianyanJinduMapper limsJianyanJinduMapper;
+
+    @Autowired
+    private LimsJianyanXiangMapper limsJianyanXiangMapper;
+
+    @Autowired
+    private LimsBaseUserMapper limsBaseUserMapper;
+
+    /**
+     * 鏌ヨ璇烽獙鍗曘�佹楠岄」鐩拰鐢ㄦ埛淇℃伅锛屽苟缁勮鍓嶇妫�楠岃繘搴﹁鎯呯粨鏋勩��
+     *
+     * @param qingyandanId 璇烽獙鍗� ID
+     * @return 妫�楠岃繘搴﹁鎯咃紱璇烽獙鍗曚笉瀛樺湪鏃惰繑鍥� null
+     */
+    @Override
+    public LimsJianyanJinduDetailVo getDetail(String qingyandanId) {
+        LimsJianyanJinduQingyandanRow qingyandan =
+                limsJianyanJinduMapper.selectQingyandan(qingyandanId);
+        if (qingyandan == null) {
+            return null;
+        }
+
+        List<LimsJianyanXiangEntity> xiangRows = selectJianyanXiang(qingyandanId);
+        Map<String, UserEntity> userMap = loadUsers(xiangRows);
+
+        LimsJianyanJinduDetailVo detail = new LimsJianyanJinduDetailVo();
+        detail.setSampleInfo(buildSampleInfo(qingyandan));
+        detail.setInspectionProgress(buildInspectionProgress(qingyandan, xiangRows, userMap));
+        detail.setProjectDetail(buildProjectDetail(xiangRows, userMap));
+        return detail;
+    }
+
+    /**
+     * 鏍峰搧淇℃伅
+     * @param row
+     * @return
+     */
+    private LimsJianyanJinduDetailVo.SampleInfo buildSampleInfo(
+            LimsJianyanJinduQingyandanRow row) {
+        LimsJianyanJinduDetailVo.SampleInfo sample = new LimsJianyanJinduDetailVo.SampleInfo();
+        sample.setId(row.getId());
+        sample.setName(row.getChanpinMingcheng());
+        sample.setCode(row.getChanpinBianma());
+        sample.setBatchNo(row.getPihao());
+        sample.setSpecification(row.getGuige());
+        return sample;
+    }
+
+    private List<LimsJianyanJinduDetailVo.InspectionProgressItem> buildInspectionProgress(
+            LimsJianyanJinduQingyandanRow row, List<LimsJianyanXiangEntity> jyxRows, Map<String, UserEntity> userMap) {
+        List<LimsJianyanJinduDetailVo.InspectionProgressItem> items = new ArrayList<>();
+        addInspectionProgress(items, row.getId(), "璇烽獙瀹℃牳", row.getQingyanRen(), row.getQingyanRiqi(), "");
+        addInspectionProgress(items, row.getId(), "鏍峰搧鍙栨牱", row.getQuyangren(), row.getQuyangRiqi(), "");
+        addInspectionProgress(items, row.getId(), "鏍峰搧鎺ユ敹", row.getJieshouren(), row.getJieshouRiqi(), "");
+        for (LimsJianyanXiangEntity jyx : jyxRows) {
+            if (StringUtils.hasText(jyx.getFenjianRen())) {
+                addInspectionProgress(items, jyx.getId(), "鐝粍鎺ユ敹", resolveUserName(jyx.getFenjianRen(), userMap), jyx.getFenjianRiqi(), jyx.getJianyanXiangmuMingcheng());
+            }
+            if (StringUtils.hasText(jyx.getJianchaRen())) {
+                addInspectionProgress(items, jyx.getId(), "妫�鏌ュ畨鎺�", resolveUserName(jyx.getJianchaRen(), userMap), jyx.getRenwuFenpeiShijian(), jyx.getJianyanXiangmuMingcheng());
+            }
+            if (jyx.getJieguoLuruRiqi() != null) {
+                addInspectionProgress(items, jyx.getId(), "缁撴灉褰曞叆", resolveUserName(jyx.getJianchaRen(), userMap), jyx.getJieguoLuruRiqi(), jyx.getJianyanXiangmuMingcheng());
+            }
+            if (StringUtils.hasText(jyx.getRenwuShenheren())) {
+                addInspectionProgress(items, jyx.getId(), "缁撴灉瀹℃牳", resolveUserName(jyx.getRenwuShenheren(), userMap), jyx. getRenwuShenherenShijian(), jyx.getJianyanXiangmuMingcheng());
+            }
+        }
+        addInspectionProgress(items, row.getId(), "鎶ュ憡鍒朵綔", row.getBaogaoRen(), row.getBaogaoRiqi(), "");
+        addInspectionProgress(items, row.getId(), "鎶ュ憡瀹℃牳", row.getBaogaoShenheRen(), row.getBaogaoShenheRiqi(), "");
+        addInspectionProgress(items, row.getId(), "鎶ュ憡鎵瑰噯", row.getBaogaoPizhunRen(), row.getBaogaoPizhunRiqi(), "");
+        items.sort(Comparator.comparing(
+                LimsJianyanJinduDetailVo.InspectionProgressItem::getOperatedAt,
+                Comparator.nullsLast(Comparator.naturalOrder())));
+        return items;
+    }
+
+    private void addInspectionProgress(
+            List<LimsJianyanJinduDetailVo.InspectionProgressItem> items,
+            String id, String title, String operator, Date operatedAt, String xiangmuMingcheng) {
+        if (!StringUtils.hasText(operator)) {
+            return;
+        }
+        LimsJianyanJinduDetailVo.InspectionProgressItem item =
+                new LimsJianyanJinduDetailVo.InspectionProgressItem();
+        item.setId(id);
+        item.setTitle(title);
+        item.setOperator(operator);
+        item.setDepartment("");
+        item.setOperatedAt(formatDate(operatedAt));
+        item.setStatus("completed");
+        item.setXiangmuMingcheng(xiangmuMingcheng);
+        items.add(item);
+    }
+
+    private List<LimsJianyanJinduDetailVo.ProjectDetailItem> buildProjectDetail(
+            List<LimsJianyanXiangEntity> rows,
+            Map<String, UserEntity> userMap) {
+        List<LimsJianyanJinduDetailVo.ProjectDetailItem> projects = new ArrayList<>();
+        for (LimsJianyanXiangEntity row : rows) {
+            LimsJianyanJinduDetailVo.ProjectDetailItem project =
+                    new LimsJianyanJinduDetailVo.ProjectDetailItem();
+            project.setId(row.getId());
+            project.setName(row.getJianyanXiangmuMingcheng());
+
+            List<LimsJianyanJinduDetailVo.ProjectStage> stages = new ArrayList<>();
+            stages.add(buildStage("浠诲姟瀹夋帓", row.getRenwuFenpeiren(), row.getRenwuFenpeiShijian(), userMap));
+            stages.add(buildStage("缁撴灉鐧昏", row.getJieguoLuruRiqi() != null ? row.getJianchaRen() : "", row.getJieguoLuruRiqi(), userMap));
+            stages.add(buildStage("缁撴灉瀹℃牳", row.getRenwuShenheren(), row.getRenwuShenherenShijian(), userMap));
+            markStageStatuses(stages);
+//            stages.sort(Comparator.comparing(
+//                    LimsJianyanJinduDetailVo.ProjectStage::getOperatedAt,
+//                    Comparator.nullsLast(Comparator.naturalOrder())));
+            project.setStages(stages);
+            projects.add(project);
+        }
+        projects.sort(Comparator.comparing(
+                LimsJianyanJinduDetailVo.ProjectDetailItem::getId,
+                Comparator.nullsLast(Comparator.naturalOrder())));
+        return projects;
+    }
+
+    private LimsJianyanJinduDetailVo.ProjectStage buildStage(
+            String title, String userId, Date operatedAt,
+            Map<String, UserEntity> userMap) {
+        LimsJianyanJinduDetailVo.ProjectStage stage = new LimsJianyanJinduDetailVo.ProjectStage();
+        stage.setTitle(title);
+        if (StringUtils.hasText(userId)) {
+            stage.setOperator(resolveUserName(userId, userMap));
+            stage.setOperatedAt(formatDate(operatedAt));
+        }
+        return stage;
+    }
+
+    private void markStageStatuses(List<LimsJianyanJinduDetailVo.ProjectStage> stages) {
+        boolean currentStageMarked = false;
+        for (LimsJianyanJinduDetailVo.ProjectStage stage : stages) {
+            if (StringUtils.hasText(stage.getOperatedAt())) {
+                stage.setStatus("finish");
+            } else if (!currentStageMarked) {
+                stage.setStatus("process");
+                currentStageMarked = true;
+            } else {
+                stage.setStatus("pending");
+            }
+        }
+    }
+
+    private List<LimsJianyanXiangEntity> selectJianyanXiang(String qingyandanId) {
+        LambdaQueryWrapper<LimsJianyanXiangEntity> query = new LambdaQueryWrapper<>();
+        query.select(
+                LimsJianyanXiangEntity::getId,
+                LimsJianyanXiangEntity::getJianyanXiangmuMingcheng,
+                LimsJianyanXiangEntity::getFenjianRen,
+                LimsJianyanXiangEntity::getFenjianRiqi,
+                LimsJianyanXiangEntity::getRenwuFenpeiren,
+                LimsJianyanXiangEntity::getRenwuFenpeiShijian,
+                LimsJianyanXiangEntity::getJianchaRen,
+                LimsJianyanXiangEntity::getJieguoLuruRiqi,
+                LimsJianyanXiangEntity::getRenwuShenheren,
+                LimsJianyanXiangEntity::getRenwuShenherenShijian);
+        query.eq(LimsJianyanXiangEntity::getQingyandanId, qingyandanId);
+        query.and(wrapper -> wrapper.isNull(LimsJianyanXiangEntity::getDeleteMark)
+                .or().ne(LimsJianyanXiangEntity::getDeleteMark, 1));
+        query.orderByAsc(LimsJianyanXiangEntity::getId);
+        return limsJianyanXiangMapper.selectList(query);
+    }
+
+    private Map<String, UserEntity> loadUsers(List<LimsJianyanXiangEntity> rows) {
+        Set<String> userIds = new LinkedHashSet<>();
+        for (LimsJianyanXiangEntity row : rows) {
+            addUserId(userIds, row.getFenjianRen());
+            addUserId(userIds, row.getRenwuFenpeiren());
+            addUserId(userIds, row.getJianchaRen());
+            addUserId(userIds, row.getRenwuShenheren());
+        }
+        if (userIds.isEmpty()) {
+            return java.util.Collections.emptyMap();
+        }
+        LambdaQueryWrapper<UserEntity> query = new LambdaQueryWrapper<>();
+        query.select(UserEntity::getId, UserEntity::getAccount, UserEntity::getRealName);
+        query.in(UserEntity::getId, userIds);
+        return limsBaseUserMapper.selectList(query).stream()
+                .collect(Collectors.toMap(
+                        UserEntity::getId,
+                        Function.identity(),
+                        (left, right) -> left));
+    }
+
+    private void addUserId(Set<String> userIds, String userId) {
+        if (StringUtils.hasText(userId)) {
+            userIds.add(userId);
+        }
+    }
+
+    private String resolveUserName(
+            String userId, Map<String, UserEntity> userMap) {
+        if (!StringUtils.hasText(userId)) {
+            return "";
+        }
+        UserEntity user = userMap.get(userId);
+        if (user == null) {
+            return userId;
+        }
+        return nullToEmpty(user.getAccount()) + "/" + nullToEmpty(user.getRealName());
+    }
+
+    private String formatDate(Date date) {
+        return date == null ? null : DateUtil.dateToString(date, DATE_PATTERN);
+    }
+
+    private String nullToEmpty(String value) {
+        return value == null ? "" : value;
+    }
+}

--
Gitblit v1.8.0