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