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