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 xiangRows = selectJianyanXiang(qingyandanId); Map 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 buildInspectionProgress( LimsJianyanJinduQingyandanRow row, List jyxRows, Map userMap) { List 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 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 buildProjectDetail( List rows, Map userMap) { List projects = new ArrayList<>(); for (LimsJianyanXiangEntity row : rows) { LimsJianyanJinduDetailVo.ProjectDetailItem project = new LimsJianyanJinduDetailVo.ProjectDetailItem(); project.setId(row.getId()); project.setName(row.getJianyanXiangmuMingcheng()); List 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 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 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 selectJianyanXiang(String qingyandanId) { LambdaQueryWrapper 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 loadUsers(List rows) { Set 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 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 userIds, String userId) { if (StringUtils.hasText(userId)) { userIds.add(userId); } } private String resolveUserName( String userId, Map 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; } }