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/LimsSxtQushiServiceImpl.java |  294 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 294 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsSxtQushiServiceImpl.java b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsSxtQushiServiceImpl.java
new file mode 100644
index 0000000..ff5d09a
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/LimsSxtQushiServiceImpl.java
@@ -0,0 +1,294 @@
+package jnpf.limsService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jnpf.base.UserInfo;
+import jnpf.limsEntity.JianyanStatus;
+import jnpf.limsEntity.LimsJianyanXiangEntity;
+import jnpf.limsEntity.LimsSxtQushiDataVo;
+import jnpf.limsEntity.LimsSxtQushiJianyanXiangmuVo;
+import jnpf.limsEntity.LimsSxtQushiOptionsVo;
+import jnpf.limsEntity.LimsSxtQushiParam;
+import jnpf.limsEntity.LimsSxtQushiQuyangdianVo;
+import jnpf.limsEntity.LimsSxtQushiRecordVo;
+import jnpf.limsEntity.LimsSxtQushiStandardVo;
+import jnpf.limsEntity.LimsSxtQuyangJihuaRenwuEntity;
+import jnpf.limsEntity.LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity;
+import jnpf.limsMapper.LimsJianyanXiangMapper;
+import jnpf.limsMapper.LimsSxtQushiMapper;
+import jnpf.limsMapper.LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoMapper;
+import jnpf.limsMapper.LimsSxtQuyangJihuaRenwuMapper;
+import jnpf.limsService.LimsSxtQushiService;
+import jnpf.limsService.support.LimsSxtQushiTrendSupport;
+import jnpf.limsService.support.LimsSxtQuyangJihuaRenwuStatus;
+import jnpf.util.UserProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 瓒嬪娍缁撴灉涓庨檺鍊煎潎浠庢楠岄」鍏宠仈鐨� Renwu 蹇収璇诲彇锛屼笉鍙嶆煡褰撳墠璐ㄩ噺鏍囧噯鎴栧彇鏍风偣銆�
+ */
+@Service
+public class LimsSxtQushiServiceImpl implements LimsSxtQushiService {
+
+    private static final String SXT_BIZ_TYPE = "SXT";
+    private static final ZoneId SXT_SHIQU = ZoneId.of("Asia/Shanghai");
+
+    @Autowired
+    private LimsJianyanXiangMapper jianyanXiangMapper;
+    @Autowired
+    private LimsSxtQushiMapper qushiMapper;
+    @Autowired
+    private LimsSxtQuyangJihuaRenwuMapper renwuMapper;
+    @Autowired
+    private LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoMapper jianyanKuaizhaoMapper;
+
+    @Override
+    public LimsSxtQushiOptionsVo listOptions(String yangpinLeixingId, String chejianId, List<String> quyangdianIds) {
+        String tenantId = dangqianZuhuId();
+        LimsSxtQushiOptionsVo result = new LimsSxtQushiOptionsVo();
+        result.setYangpinLeixingList(qushiMapper.selectSampleTypes(tenantId));
+        if (!StringUtils.hasText(yangpinLeixingId)) {
+            return result;
+        }
+        result.setChejianList(qushiMapper.selectWorkshops(tenantId, yangpinLeixingId));
+        if (!StringUtils.hasText(chejianId)) {
+            return result;
+        }
+        result.setQuyangdianList(qushiMapper.selectSamplingPoints(tenantId, yangpinLeixingId, chejianId));
+        List<String> pointIds = quchongId(quyangdianIds);
+        if (pointIds.isEmpty()) {
+            return result;
+        }
+        Set<String> validPointIds = new LinkedHashSet<>();
+        for (LimsSxtQushiQuyangdianVo point : result.getQuyangdianList()) {
+            validPointIds.add(point.getId());
+        }
+        pointIds.retainAll(validPointIds);
+        if (pointIds.isEmpty()) {
+            return result;
+        }
+        Map<String, LimsSxtQushiJianyanXiangmuVo> xiangmuMap = new LinkedHashMap<>();
+        for (LimsSxtQushiJianyanXiangmuVo xiangmu : qushiMapper.selectInspectionItems(
+                tenantId, yangpinLeixingId)) {
+            xiangmu.setTrendEnabled(LimsSxtQushiTrendSupport.isTrendEnabled(xiangmu.getName(), xiangmu.getShujuLeixing()));
+            xiangmuMap.putIfAbsent(xiangmu.getId(), xiangmu);
+        }
+        result.setJianyanXiangmuList(new ArrayList<>(xiangmuMap.values()));
+        return result;
+    }
+
+    @Override
+    public LimsSxtQushiDataVo listData(LimsSxtQushiParam param, LocalDate kaishiRiqi, LocalDate jieshuRiqi) {
+        String tenantId = dangqianZuhuId();
+        List<String> qingqiuXiangmuIds = quchongId(param.getJianyanXiangmuIds());
+        LimsSxtQushiDataVo result = new LimsSxtQushiDataVo();
+        if (qingqiuXiangmuIds.isEmpty()) {
+            return result;
+        }
+
+        Map<String, LimsSxtQushiJianyanXiangmuVo> xiangmuMap = chaxunKeYongXiangmu(
+                tenantId, param.getYangpinLeixingId(), param.getChejianId(), param.getQuyangdianIds());
+        List<String> xiangmuIds = baoliuShouquanId(qingqiuXiangmuIds, xiangmuMap.keySet());
+        if (xiangmuIds.isEmpty()) {
+            return result;
+        }
+
+        Map<String, LimsSxtQuyangJihuaRenwuEntity> renwuMap = chaxunYishengchengRenwu(
+                tenantId, param.getYangpinLeixingId(), param.getChejianId(), param.getQuyangdianIds());
+        if (renwuMap.isEmpty()) {
+            return result;
+        }
+
+        List<LimsJianyanXiangEntity> jianyanXiangList = chaxunYishenheJianyanXiang(
+                tenantId, renwuMap.keySet(), kaishiRiqi, jieshuRiqi);
+        Map<String, LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity> kuaizhaoMap = chaxunJianyanKuaizhao(
+                tenantId, renwuMap.keySet(), jianyanXiangList);
+        Map<String, LimsSxtQushiStandardVo> biaozhunMap = new LinkedHashMap<>();
+        List<LimsSxtQushiRecordVo> jiluList = new ArrayList<>();
+        for (LimsJianyanXiangEntity jianyanXiang : jianyanXiangList) {
+            LimsSxtQuyangJihuaRenwuEntity renwu = renwuMap.get(jianyanXiang.getLaiyuanRenwuId());
+            LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity kuaizhao =
+                    kuaizhaoMap.get(jianyanXiang.getRenwuJianyanXiangKuaizhaoId());
+            if (renwu == null || kuaizhao == null || !xiangmuIds.contains(kuaizhao.getJianyanXiangmuId())) {
+                continue;
+            }
+            jiluList.add(buildJilu(jianyanXiang, renwu, kuaizhao));
+            biaozhunMap.putIfAbsent(kuaizhao.getId(), buildBiaozhun(kuaizhao, xiangmuMap.get(kuaizhao.getJianyanXiangmuId())));
+        }
+        result.setRecords(jiluList);
+        result.setStandards(new ArrayList<>(biaozhunMap.values()));
+        return result;
+    }
+
+    private Map<String, LimsSxtQushiJianyanXiangmuVo> chaxunKeYongXiangmu(String tenantId,
+                                                                            String yangpinLeixingId,
+                                                                            String chejianId,
+                                                                            List<String> quyangdianIds) {
+        Map<String, LimsSxtQushiJianyanXiangmuVo> result = new LinkedHashMap<>();
+        List<String> pointIds = quchongId(quyangdianIds);
+        if (pointIds.isEmpty()) {
+            return result;
+        }
+        for (LimsSxtQushiJianyanXiangmuVo xiangmu : qushiMapper.selectInspectionItems(
+                tenantId, yangpinLeixingId)) {
+            xiangmu.setTrendEnabled(LimsSxtQushiTrendSupport.isTrendEnabled(xiangmu.getName(), xiangmu.getShujuLeixing()));
+            result.putIfAbsent(xiangmu.getId(), xiangmu);
+        }
+        return result;
+    }
+
+    private Map<String, LimsSxtQuyangJihuaRenwuEntity> chaxunYishengchengRenwu(String tenantId,
+                                                                                  String yangpinLeixingId,
+                                                                                  String chejianId,
+                                                                                  List<String> quyangdianIds) {
+        LambdaQueryWrapper<LimsSxtQuyangJihuaRenwuEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(LimsSxtQuyangJihuaRenwuEntity::getFTenantId, tenantId)
+                .eq(LimsSxtQuyangJihuaRenwuEntity::getYangpinLeixing, yangpinLeixingId)
+                .eq(LimsSxtQuyangJihuaRenwuEntity::getRenwuZhuangtai, LimsSxtQuyangJihuaRenwuStatus.GENERATED)
+                .eq(StringUtils.hasText(chejianId), LimsSxtQuyangJihuaRenwuEntity::getSuoshuChejianId, chejianId)
+                .and(item -> item.isNull(LimsSxtQuyangJihuaRenwuEntity::getFDeleteMark)
+                        .or().ne(LimsSxtQuyangJihuaRenwuEntity::getFDeleteMark, 1));
+        List<String> pointIds = quchongId(quyangdianIds);
+        if (!pointIds.isEmpty()) {
+            wrapper.in(LimsSxtQuyangJihuaRenwuEntity::getQuyangdianId, pointIds);
+        }
+        Map<String, LimsSxtQuyangJihuaRenwuEntity> result = new LinkedHashMap<>();
+        for (LimsSxtQuyangJihuaRenwuEntity renwu : renwuMapper.selectList(wrapper)) {
+            result.put(renwu.getId(), renwu);
+        }
+        return result;
+    }
+
+    private List<LimsJianyanXiangEntity> chaxunYishenheJianyanXiang(String tenantId,
+                                                                       Set<String> renwuIds,
+                                                                       LocalDate kaishiRiqi,
+                                                                       LocalDate jieshuRiqi) {
+        Date kaishiShijian = Date.from(kaishiRiqi.atStartOfDay(SXT_SHIQU).toInstant());
+        Date jieshuShijian = Date.from(jieshuRiqi.atTime(LocalTime.MAX).atZone(SXT_SHIQU).toInstant());
+        LambdaQueryWrapper<LimsJianyanXiangEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(
+                        LimsJianyanXiangEntity::getId,
+                        LimsJianyanXiangEntity::getLaiyuanRenwuId,
+                        LimsJianyanXiangEntity::getRenwuJianyanXiangKuaizhaoId,
+                        LimsJianyanXiangEntity::getJianyanJieguo,
+                        LimsJianyanXiangEntity::getWanchengRiqi)
+                .eq(LimsJianyanXiangEntity::getTenantId, tenantId)
+                .eq(LimsJianyanXiangEntity::getBizType, SXT_BIZ_TYPE)
+                .in(LimsJianyanXiangEntity::getLaiyuanRenwuId, renwuIds)
+                .eq(LimsJianyanXiangEntity::getJianyanZhuangtai, JianyanStatus.AUDITED.getCode())
+                .ge(LimsJianyanXiangEntity::getWanchengRiqi, kaishiShijian)
+                .le(LimsJianyanXiangEntity::getWanchengRiqi, jieshuShijian)
+                .and(item -> item.isNull(LimsJianyanXiangEntity::getDeleteMark)
+                        .or().ne(LimsJianyanXiangEntity::getDeleteMark, 1))
+                .orderByAsc(LimsJianyanXiangEntity::getWanchengRiqi,
+                        LimsJianyanXiangEntity::getId,
+                        LimsJianyanXiangEntity::getRenwuJianyanXiangKuaizhaoId);
+        return jianyanXiangMapper.selectList(wrapper);
+    }
+
+    private Map<String, LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity> chaxunJianyanKuaizhao(
+            String tenantId, Set<String> renwuIds, List<LimsJianyanXiangEntity> jianyanXiangList) {
+        Set<String> kuaizhaoIds = new LinkedHashSet<>();
+        for (LimsJianyanXiangEntity jianyanXiang : jianyanXiangList) {
+            if (StringUtils.hasText(jianyanXiang.getRenwuJianyanXiangKuaizhaoId())) {
+                kuaizhaoIds.add(jianyanXiang.getRenwuJianyanXiangKuaizhaoId());
+            }
+        }
+        Map<String, LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity> result = new LinkedHashMap<>();
+        if (kuaizhaoIds.isEmpty()) {
+            return result;
+        }
+        LambdaQueryWrapper<LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity::getId, kuaizhaoIds)
+                .eq(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity::getFTenantId, tenantId)
+                .in(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity::getRenwuId, renwuIds)
+                .and(item -> item.eq(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity::getFDeleteMark, 0)
+                        .or().isNull(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity::getFDeleteMark));
+        for (LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity kuaizhao : jianyanKuaizhaoMapper.selectList(wrapper)) {
+            if (kuaizhao.getFDeleteMark() == null || kuaizhao.getFDeleteMark() != 1) {
+                result.put(kuaizhao.getId(), kuaizhao);
+            }
+        }
+        return result;
+    }
+
+    private LimsSxtQushiRecordVo buildJilu(LimsJianyanXiangEntity jianyanXiang,
+                                             LimsSxtQuyangJihuaRenwuEntity renwu,
+                                             LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity kuaizhao) {
+        LimsSxtQushiRecordVo jilu = new LimsSxtQushiRecordVo();
+        jilu.setCeshiJieguo(LimsSxtQushiTrendSupport.toNumericOrNull(jianyanXiang.getJianyanJieguo()));
+        jilu.setJianyanRiqi(jianyanXiang.getWanchengRiqi());
+        jilu.setJianyanXiangId(jianyanXiang.getId());
+        jilu.setJianyanXiangmuId(kuaizhao.getJianyanXiangmuId());
+        jilu.setRenwuJianyanXiangKuaizhaoId(kuaizhao.getId());
+        jilu.setQuyangdianId(renwu.getQuyangdianId());
+        jilu.setQuyangdianMingcheng(pointName(renwu));
+        return jilu;
+    }
+
+    private LimsSxtQushiStandardVo buildBiaozhun(LimsSxtQuyangJihuaRenwuJianyanXiangKuaizhaoEntity kuaizhao,
+                                                   LimsSxtQushiJianyanXiangmuVo xiangmu) {
+        LimsSxtQushiStandardVo biaozhun = new LimsSxtQushiStandardVo();
+        biaozhun.setJianyanXiangmuId(kuaizhao.getJianyanXiangmuId());
+        biaozhun.setRenwuJianyanXiangKuaizhaoId(kuaizhao.getId());
+        biaozhun.setBiaozhunBianhao(kuaizhao.getBiaozhunBianhao());
+        biaozhun.setBiaozhunBanben(kuaizhao.getBiaozhunBanben());
+        biaozhun.setRawBiaozhunShangxian(kuaizhao.getBiaozhunShangxian());
+        biaozhun.setRawBiaozhunXiaxian(kuaizhao.getBiaozhunXiaxian());
+        biaozhun.setBiaozhunShangxian(LimsSxtQushiTrendSupport.toNumericOrNull(kuaizhao.getBiaozhunShangxian()));
+        biaozhun.setBiaozhunXiaxian(LimsSxtQushiTrendSupport.toNumericOrNull(kuaizhao.getBiaozhunXiaxian()));
+        biaozhun.setUnit(StringUtils.hasText(kuaizhao.getJianyanDanwei())
+                ? kuaizhao.getJianyanDanwei() : kuaizhao.getJianyanXiangmuMorenDanwei());
+        biaozhun.setTrendEnabled(xiangmu != null && xiangmu.isTrendEnabled());
+        return biaozhun;
+    }
+
+    private List<String> quchongId(List<String> ids) {
+        Set<String> result = new LinkedHashSet<>();
+        if (ids != null) {
+            for (String id : ids) {
+                if (StringUtils.hasText(id)) {
+                    result.add(id.trim());
+                }
+            }
+        }
+        return new ArrayList<>(result);
+    }
+
+    private List<String> baoliuShouquanId(List<String> ids, Set<String> keYongIds) {
+        List<String> result = new ArrayList<>();
+        for (String id : ids) {
+            if (keYongIds.contains(id)) {
+                result.add(id);
+            }
+        }
+        return result;
+    }
+
+    private String pointName(LimsSxtQuyangJihuaRenwuEntity renwu) {
+        if (StringUtils.hasText(renwu.getQuyangdianBianhao())) {
+            return renwu.getQuyangdianBianhao();
+        }
+        if (StringUtils.hasText(renwu.getQuyangDidian())) {
+            return renwu.getQuyangDidian();
+        }
+        return renwu.getQuyangdianId();
+    }
+
+    private String dangqianZuhuId() {
+        UserInfo user = UserProvider.getUser();
+        return user == null || !StringUtils.hasText(user.getTenantId()) ? "0" : user.getTenantId();
+    }
+}

--
Gitblit v1.8.0