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