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 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 pointIds = quchongId(quyangdianIds); if (pointIds.isEmpty()) { return result; } Set validPointIds = new LinkedHashSet<>(); for (LimsSxtQushiQuyangdianVo point : result.getQuyangdianList()) { validPointIds.add(point.getId()); } pointIds.retainAll(validPointIds); if (pointIds.isEmpty()) { return result; } Map 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 qingqiuXiangmuIds = quchongId(param.getJianyanXiangmuIds()); LimsSxtQushiDataVo result = new LimsSxtQushiDataVo(); if (qingqiuXiangmuIds.isEmpty()) { return result; } Map xiangmuMap = chaxunKeYongXiangmu( tenantId, param.getYangpinLeixingId(), param.getChejianId(), param.getQuyangdianIds()); List xiangmuIds = baoliuShouquanId(qingqiuXiangmuIds, xiangmuMap.keySet()); if (xiangmuIds.isEmpty()) { return result; } Map renwuMap = chaxunYishengchengRenwu( tenantId, param.getYangpinLeixingId(), param.getChejianId(), param.getQuyangdianIds()); if (renwuMap.isEmpty()) { return result; } List jianyanXiangList = chaxunYishenheJianyanXiang( tenantId, renwuMap.keySet(), kaishiRiqi, jieshuRiqi); Map kuaizhaoMap = chaxunJianyanKuaizhao( tenantId, renwuMap.keySet(), jianyanXiangList); Map biaozhunMap = new LinkedHashMap<>(); List 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 chaxunKeYongXiangmu(String tenantId, String yangpinLeixingId, String chejianId, List quyangdianIds) { Map result = new LinkedHashMap<>(); List 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 chaxunYishengchengRenwu(String tenantId, String yangpinLeixingId, String chejianId, List quyangdianIds) { LambdaQueryWrapper 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 pointIds = quchongId(quyangdianIds); if (!pointIds.isEmpty()) { wrapper.in(LimsSxtQuyangJihuaRenwuEntity::getQuyangdianId, pointIds); } Map result = new LinkedHashMap<>(); for (LimsSxtQuyangJihuaRenwuEntity renwu : renwuMapper.selectList(wrapper)) { result.put(renwu.getId(), renwu); } return result; } private List chaxunYishenheJianyanXiang(String tenantId, Set 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 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 chaxunJianyanKuaizhao( String tenantId, Set renwuIds, List jianyanXiangList) { Set kuaizhaoIds = new LinkedHashSet<>(); for (LimsJianyanXiangEntity jianyanXiang : jianyanXiangList) { if (StringUtils.hasText(jianyanXiang.getRenwuJianyanXiangKuaizhaoId())) { kuaizhaoIds.add(jianyanXiang.getRenwuJianyanXiangKuaizhaoId()); } } Map result = new LinkedHashMap<>(); if (kuaizhaoIds.isEmpty()) { return result; } LambdaQueryWrapper 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 quchongId(List ids) { Set result = new LinkedHashSet<>(); if (ids != null) { for (String id : ids) { if (StringUtils.hasText(id)) { result.add(id.trim()); } } } return new ArrayList<>(result); } private List baoliuShouquanId(List ids, Set keYongIds) { List 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(); } }