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();
|
}
|
}
|