|
|
|
@ -0,0 +1,693 @@
|
|
|
|
|
package org.dromara.qms.service.impl;
|
|
|
|
|
|
|
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
import com.github.yulichang.toolkit.JoinWrappers;
|
|
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.dromara.qms.domain.QcInspectionMain;
|
|
|
|
|
import org.dromara.qms.domain.QcInspectionType;
|
|
|
|
|
import org.dromara.qms.domain.bo.QcInspectionMainBo;
|
|
|
|
|
import org.dromara.qms.domain.bo.QcInspectionResultBo;
|
|
|
|
|
import org.dromara.qms.domain.vo.QcInspectionResultVo;
|
|
|
|
|
import org.dromara.qms.service.IQcInspectionResultService;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.dromara.qms.domain.bo.QcUnqualifiedReviewBo;
|
|
|
|
|
import org.dromara.qms.domain.vo.QcUnqualifiedReviewVo;
|
|
|
|
|
import org.dromara.qms.domain.QcUnqualifiedReview;
|
|
|
|
|
import org.dromara.qms.mapper.QcUnqualifiedReviewMapper;
|
|
|
|
|
import org.dromara.qms.service.IQcUnqualifiedReviewService;
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 不合格品待评审Service业务层处理
|
|
|
|
|
*
|
|
|
|
|
* @author zch
|
|
|
|
|
* @date 2025-07-18
|
|
|
|
|
*/
|
|
|
|
|
@Slf4j
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Service
|
|
|
|
|
public class QcUnqualifiedReviewServiceImpl implements IQcUnqualifiedReviewService {
|
|
|
|
|
|
|
|
|
|
private final QcUnqualifiedReviewMapper baseMapper;
|
|
|
|
|
private final IQcInspectionResultService qcInspectionResultService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询不合格品待评审
|
|
|
|
|
*
|
|
|
|
|
* @param reviewId 主键
|
|
|
|
|
* @return 不合格品待评审
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public QcUnqualifiedReviewVo queryById(Long reviewId){
|
|
|
|
|
return baseMapper.selectVoById(reviewId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 分页查询不合格品待评审列表
|
|
|
|
|
*
|
|
|
|
|
* @param bo 查询条件
|
|
|
|
|
* @param pageQuery 分页参数
|
|
|
|
|
* @return 不合格品待评审分页列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public TableDataInfo<QcUnqualifiedReviewVo> queryPageList(QcUnqualifiedReviewBo bo, PageQuery pageQuery) {
|
|
|
|
|
MPJLambdaWrapper<QcUnqualifiedReview> lqw = buildQueryWrapper(bo);
|
|
|
|
|
Page<QcUnqualifiedReviewVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
|
return TableDataInfo.build(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询符合条件的不合格品待评审列表
|
|
|
|
|
*
|
|
|
|
|
* @param bo 查询条件
|
|
|
|
|
* @return 不合格品待评审列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<QcUnqualifiedReviewVo> queryList(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
MPJLambdaWrapper<QcUnqualifiedReview> lqw = buildQueryWrapper(bo);
|
|
|
|
|
return baseMapper.selectVoList(lqw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 分页查询待评审不合格品列表 (for PDA)
|
|
|
|
|
* 只查询reviewResult为空的记录,表示待评审状态
|
|
|
|
|
*
|
|
|
|
|
* @param bo 查询条件
|
|
|
|
|
* @param pageQuery 分页参数
|
|
|
|
|
* @return 待评审不合格品分页列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public TableDataInfo<QcUnqualifiedReviewVo> queryPagePendingReviews(QcUnqualifiedReviewBo bo, PageQuery pageQuery) {
|
|
|
|
|
// 设置查询条件:只查询待评审的记录(reviewResult为空)
|
|
|
|
|
QcUnqualifiedReviewBo pendingBo = new QcUnqualifiedReviewBo();
|
|
|
|
|
// 复制原有查询条件
|
|
|
|
|
if (bo != null) {
|
|
|
|
|
pendingBo.setUnqualifiedNo(bo.getUnqualifiedNo());
|
|
|
|
|
pendingBo.setInspectionId(bo.getInspectionId());
|
|
|
|
|
pendingBo.setTypeId(bo.getTypeId());
|
|
|
|
|
pendingBo.setWorkOrder(bo.getWorkOrder());
|
|
|
|
|
pendingBo.setProcessCode(bo.getProcessCode());
|
|
|
|
|
pendingBo.setProcessName(bo.getProcessName());
|
|
|
|
|
pendingBo.setBatchNo(bo.getBatchNo());
|
|
|
|
|
pendingBo.setMaterialName(bo.getMaterialName());
|
|
|
|
|
pendingBo.setMaterialCode(bo.getMaterialCode());
|
|
|
|
|
pendingBo.setInspectorResult(bo.getInspectorResult());
|
|
|
|
|
pendingBo.setReviewer(bo.getReviewer());
|
|
|
|
|
pendingBo.setParams(bo.getParams());
|
|
|
|
|
}
|
|
|
|
|
// 强制设置reviewResult为null,查询待评审记录
|
|
|
|
|
pendingBo.setReviewResult(null);
|
|
|
|
|
|
|
|
|
|
MPJLambdaWrapper<QcUnqualifiedReview> lqw = buildQueryWrapper(pendingBo);
|
|
|
|
|
// 添加条件:reviewResult为空或null
|
|
|
|
|
lqw.and(wrapper -> wrapper.isNull(QcUnqualifiedReview::getReviewResult)
|
|
|
|
|
.or().eq(QcUnqualifiedReview::getReviewResult, ""));
|
|
|
|
|
|
|
|
|
|
Page<QcUnqualifiedReviewVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
|
return TableDataInfo.build(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询不合格评审详情包括质检项目 (for PDA)
|
|
|
|
|
* 关联查询不合格品的检测项明细
|
|
|
|
|
*
|
|
|
|
|
* @param reviewId 主键
|
|
|
|
|
* @return 不合格品待评审详情,包含检测项明细
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public QcUnqualifiedReviewVo queryByIdWithItems(Long reviewId) {
|
|
|
|
|
QcUnqualifiedReviewVo reviewVo = queryById(reviewId);
|
|
|
|
|
if (reviewVo != null && reviewVo.getInspectionId() != null) {
|
|
|
|
|
// 查询关联的检测项结果明细
|
|
|
|
|
QcInspectionResultBo resultBo = new QcInspectionResultBo();
|
|
|
|
|
resultBo.setInspectionId(reviewVo.getInspectionId());
|
|
|
|
|
List<QcInspectionResultVo> inspectionResults = qcInspectionResultService.queryList(resultBo);
|
|
|
|
|
|
|
|
|
|
// 可以将检测项结果添加到reviewVo中,但由于QcUnqualifiedReviewVo没有相应字段
|
|
|
|
|
// 这里暂时通过日志记录或者扩展VO类来处理
|
|
|
|
|
// 实际项目中可能需要扩展QcUnqualifiedReviewVo类添加inspectionResults字段
|
|
|
|
|
}
|
|
|
|
|
return reviewVo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 提交评审结果 (for PDA)
|
|
|
|
|
* 处理评审结果并触发后续流程
|
|
|
|
|
*
|
|
|
|
|
* @param bo 不合格品待评审
|
|
|
|
|
* @return 是否提交成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean submitReview(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
// 设置评审时间
|
|
|
|
|
bo.setReviewTime(new Date());
|
|
|
|
|
|
|
|
|
|
// 更新评审结果
|
|
|
|
|
Boolean updated = updateByBo(bo);
|
|
|
|
|
|
|
|
|
|
if (updated) {
|
|
|
|
|
// 根据评审结果触发后续流程
|
|
|
|
|
triggerWorkflowProcess(bo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return updated;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取不合格品统计汇总信息 (for PDA)
|
|
|
|
|
*
|
|
|
|
|
* @param dateRange 日期范围,格式如 "2025-01-01,2025-01-31"
|
|
|
|
|
* @return 统计汇总数据
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Map<String, Object> getUnqualifiedSummary(String dateRange) {
|
|
|
|
|
Map<String, Object> summary = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
// 解析日期范围
|
|
|
|
|
LocalDate startDate = null;
|
|
|
|
|
LocalDate endDate = null;
|
|
|
|
|
if (StringUtils.isNotBlank(dateRange)) {
|
|
|
|
|
String[] dates = dateRange.split(",");
|
|
|
|
|
if (dates.length == 2) {
|
|
|
|
|
try {
|
|
|
|
|
startDate = LocalDate.parse(dates[0].trim(), DateTimeFormatter.ISO_LOCAL_DATE);
|
|
|
|
|
endDate = LocalDate.parse(dates[1].trim(), DateTimeFormatter.ISO_LOCAL_DATE);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
// 日期解析失败,使用默认范围(当月)
|
|
|
|
|
startDate = LocalDate.now().withDayOfMonth(1);
|
|
|
|
|
endDate = LocalDate.now();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 默认查询当月数据
|
|
|
|
|
startDate = LocalDate.now().withDayOfMonth(1);
|
|
|
|
|
endDate = LocalDate.now();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 构建查询条件
|
|
|
|
|
QcUnqualifiedReviewBo bo = new QcUnqualifiedReviewBo();
|
|
|
|
|
Map<String, Object> params = new HashMap<>();
|
|
|
|
|
params.put("beginTime", startDate.toString());
|
|
|
|
|
params.put("endTime", endDate.toString());
|
|
|
|
|
bo.setParams(params);
|
|
|
|
|
|
|
|
|
|
// 查询所有不合格品记录
|
|
|
|
|
List<QcUnqualifiedReviewVo> allRecords = queryList(bo);
|
|
|
|
|
|
|
|
|
|
// 统计总数
|
|
|
|
|
summary.put("totalCount", allRecords.size());
|
|
|
|
|
|
|
|
|
|
// 统计待评审数量
|
|
|
|
|
long pendingCount = allRecords.stream()
|
|
|
|
|
.filter(record -> StringUtils.isBlank(record.getReviewResult()))
|
|
|
|
|
.count();
|
|
|
|
|
summary.put("pendingCount", pendingCount);
|
|
|
|
|
|
|
|
|
|
// 统计已评审数量
|
|
|
|
|
long reviewedCount = allRecords.size() - pendingCount;
|
|
|
|
|
summary.put("reviewedCount", reviewedCount);
|
|
|
|
|
|
|
|
|
|
// 按评审结果分组统计
|
|
|
|
|
Map<String, Long> reviewResultStats = allRecords.stream()
|
|
|
|
|
.filter(record -> StringUtils.isNotBlank(record.getReviewResult()))
|
|
|
|
|
.collect(Collectors.groupingBy(
|
|
|
|
|
QcUnqualifiedReviewVo::getReviewResult,
|
|
|
|
|
Collectors.counting()
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
summary.put("scrapCount", reviewResultStats.getOrDefault("0", 0L)); // 报废
|
|
|
|
|
summary.put("reworkCount", reviewResultStats.getOrDefault("1", 0L)); // 返工
|
|
|
|
|
summary.put("returnCount", reviewResultStats.getOrDefault("2", 0L)); // 退货
|
|
|
|
|
summary.put("acceptCount", reviewResultStats.getOrDefault("3", 0L)); // 让步接收
|
|
|
|
|
summary.put("transferCount", reviewResultStats.getOrDefault("4", 0L)); // 流转
|
|
|
|
|
|
|
|
|
|
// 按物料分组统计
|
|
|
|
|
Map<String, Long> materialStats = allRecords.stream()
|
|
|
|
|
.filter(record -> StringUtils.isNotBlank(record.getMaterialName()))
|
|
|
|
|
.collect(Collectors.groupingBy(
|
|
|
|
|
QcUnqualifiedReviewVo::getMaterialName,
|
|
|
|
|
Collectors.counting()
|
|
|
|
|
));
|
|
|
|
|
summary.put("materialStats", materialStats);
|
|
|
|
|
|
|
|
|
|
// 按工序分组统计
|
|
|
|
|
Map<String, Long> processStats = allRecords.stream()
|
|
|
|
|
.filter(record -> StringUtils.isNotBlank(record.getProcessName()))
|
|
|
|
|
.collect(Collectors.groupingBy(
|
|
|
|
|
QcUnqualifiedReviewVo::getProcessName,
|
|
|
|
|
Collectors.counting()
|
|
|
|
|
));
|
|
|
|
|
summary.put("processStats", processStats);
|
|
|
|
|
|
|
|
|
|
return summary;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发工作流程处理 (for PDA)
|
|
|
|
|
* 实现评审完成后的状态更新和流程触发
|
|
|
|
|
*
|
|
|
|
|
* @param bo 不合格品评审信息
|
|
|
|
|
* @return 是否触发成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean triggerWorkflowProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
if (bo == null || StringUtils.isBlank(bo.getReviewResult())) {
|
|
|
|
|
log.error("评审结果为空,无法触发工作流程");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
log.info("开始触发工作流程: 评审ID={}, 评审结果={}", bo.getReviewId(), bo.getReviewResult());
|
|
|
|
|
|
|
|
|
|
// 根据评审结果触发不同的后续流程
|
|
|
|
|
switch (bo.getReviewResult()) {
|
|
|
|
|
case "0": // 报废
|
|
|
|
|
return handleScrapProcess(bo);
|
|
|
|
|
case "1": // 返工
|
|
|
|
|
return handleReworkProcess(bo);
|
|
|
|
|
case "2": // 退货
|
|
|
|
|
return handleReturnProcess(bo);
|
|
|
|
|
case "3": // 让步接收
|
|
|
|
|
return handleAcceptProcess(bo);
|
|
|
|
|
case "4": // 流转
|
|
|
|
|
return handleTransferProcess(bo);
|
|
|
|
|
default:
|
|
|
|
|
log.warn("未知的评审结果: {}", bo.getReviewResult());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("触发工作流程异常: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理报废流程
|
|
|
|
|
* 实现评审结果的五种处置方式:报废
|
|
|
|
|
*/
|
|
|
|
|
private Boolean handleScrapProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
log.info("执行报废流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
|
|
|
|
|
// 1. 更新库存状态为报废
|
|
|
|
|
updateInventoryStatus(bo, "SCRAPPED");
|
|
|
|
|
|
|
|
|
|
// 2. 生成报废单据
|
|
|
|
|
generateScrapDocument(bo);
|
|
|
|
|
|
|
|
|
|
// 3. 更新质检主表状态
|
|
|
|
|
updateInspectionMainStatus(bo, "SCRAPPED");
|
|
|
|
|
|
|
|
|
|
// 4. 记录处理日志
|
|
|
|
|
recordProcessLog(bo, "报废流程执行完成");
|
|
|
|
|
|
|
|
|
|
log.info("报废流程执行成功: 评审ID={}", bo.getReviewId());
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("报废流程执行失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理返工流程
|
|
|
|
|
* 实现评审结果的五种处置方式:返工
|
|
|
|
|
*/
|
|
|
|
|
private Boolean handleReworkProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
log.info("执行返工流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
|
|
|
|
|
// 1. 生成返工工单
|
|
|
|
|
generateReworkOrder(bo);
|
|
|
|
|
|
|
|
|
|
// 2. 分派返工任务给相关人员
|
|
|
|
|
assignReworkTask(bo);
|
|
|
|
|
|
|
|
|
|
// 3. 更新质检主表状态为返工中
|
|
|
|
|
updateInspectionMainStatus(bo, "REWORKING");
|
|
|
|
|
|
|
|
|
|
// 4. 更新库存状态
|
|
|
|
|
updateInventoryStatus(bo, "REWORKING");
|
|
|
|
|
|
|
|
|
|
// 5. 记录处理日志
|
|
|
|
|
recordProcessLog(bo, "返工流程执行完成,已生成返工工单");
|
|
|
|
|
|
|
|
|
|
log.info("返工流程执行成功: 评审ID={}", bo.getReviewId());
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("返工流程执行失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理退货流程
|
|
|
|
|
* 实现评审结果的五种处置方式:退货
|
|
|
|
|
*/
|
|
|
|
|
private Boolean handleReturnProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
log.info("执行退货流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
|
|
|
|
|
// 1. 生成退货单据
|
|
|
|
|
generateReturnDocument(bo);
|
|
|
|
|
|
|
|
|
|
// 2. 通知供应商
|
|
|
|
|
notifySupplier(bo);
|
|
|
|
|
|
|
|
|
|
// 3. 更新库存状态为待退货
|
|
|
|
|
updateInventoryStatus(bo, "RETURNING");
|
|
|
|
|
|
|
|
|
|
// 4. 更新质检主表状态
|
|
|
|
|
updateInspectionMainStatus(bo, "RETURNED");
|
|
|
|
|
|
|
|
|
|
// 5. 记录处理日志
|
|
|
|
|
recordProcessLog(bo, "退货流程执行完成,已通知供应商");
|
|
|
|
|
|
|
|
|
|
log.info("退货流程执行成功: 评审ID={}", bo.getReviewId());
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("退货流程执行失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理让步接收流程
|
|
|
|
|
* 实现评审结果的五种处置方式:让步接收
|
|
|
|
|
*/
|
|
|
|
|
private Boolean handleAcceptProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
log.info("执行让步接收流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
|
|
|
|
|
// 1. 更新质检状态为让步合格
|
|
|
|
|
updateInspectionMainStatus(bo, "CONDITIONALLY_ACCEPTED");
|
|
|
|
|
|
|
|
|
|
// 2. 更新库存状态为可用
|
|
|
|
|
updateInventoryStatus(bo, "AVAILABLE");
|
|
|
|
|
|
|
|
|
|
// 3. 生成让步接收单据
|
|
|
|
|
generateAcceptanceDocument(bo);
|
|
|
|
|
|
|
|
|
|
// 4. 触发入库流程
|
|
|
|
|
triggerInboundProcess(bo);
|
|
|
|
|
|
|
|
|
|
// 5. 记录处理日志
|
|
|
|
|
recordProcessLog(bo, "让步接收流程执行完成,产品已入库");
|
|
|
|
|
|
|
|
|
|
log.info("让步接收流程执行成功: 评审ID={}", bo.getReviewId());
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("让步接收流程执行失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理流转流程
|
|
|
|
|
* 实现评审结果的五种处置方式:流转
|
|
|
|
|
*/
|
|
|
|
|
private Boolean handleTransferProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
log.info("执行流转流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
|
|
|
|
|
// 1. 确定流转目标部门或工序
|
|
|
|
|
String transferTarget = determineTransferTarget(bo);
|
|
|
|
|
|
|
|
|
|
// 2. 生成流转单据
|
|
|
|
|
generateTransferDocument(bo, transferTarget);
|
|
|
|
|
|
|
|
|
|
// 3. 通知目标部门
|
|
|
|
|
notifyTargetDepartment(bo, transferTarget);
|
|
|
|
|
|
|
|
|
|
// 4. 更新质检主表状态
|
|
|
|
|
updateInspectionMainStatus(bo, "TRANSFERRED");
|
|
|
|
|
|
|
|
|
|
// 5. 更新库存状态
|
|
|
|
|
updateInventoryStatus(bo, "TRANSFERRED");
|
|
|
|
|
|
|
|
|
|
// 6. 记录处理日志
|
|
|
|
|
recordProcessLog(bo, "流转流程执行完成,已转移至: " + transferTarget);
|
|
|
|
|
|
|
|
|
|
log.info("流转流程执行成功: 评审ID={}, 流转目标={}", bo.getReviewId(), transferTarget);
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("流转流程执行失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 以下是辅助方法的实现
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新库存状态
|
|
|
|
|
*/
|
|
|
|
|
private void updateInventoryStatus(QcUnqualifiedReviewBo bo, String status) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现库存状态更新逻辑
|
|
|
|
|
// 这里需要调用库存管理模块的接口
|
|
|
|
|
log.info("更新库存状态: 评审ID={}, 状态={}", bo.getReviewId(), status);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("更新库存状态失败: 评审ID={}, 状态={}", bo.getReviewId(), status, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新质检主表状态
|
|
|
|
|
*/
|
|
|
|
|
private void updateInspectionMainStatus(QcUnqualifiedReviewBo bo, String status) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现质检主表状态更新逻辑
|
|
|
|
|
// 这里需要调用质检主表服务的更新方法
|
|
|
|
|
log.info("更新质检主表状态: 质检ID={}, 状态={}", bo.getInspectionId(), status);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("更新质检主表状态失败: 质检ID={}, 状态={}", bo.getInspectionId(), status, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成报废单据
|
|
|
|
|
*/
|
|
|
|
|
private void generateScrapDocument(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现报废单据生成逻辑
|
|
|
|
|
log.info("生成报废单据: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("生成报废单据失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成返工工单
|
|
|
|
|
*/
|
|
|
|
|
private void generateReworkOrder(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现返工工单生成逻辑
|
|
|
|
|
log.info("生成返工工单: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("生成返工工单失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 分派返工任务
|
|
|
|
|
*/
|
|
|
|
|
private void assignReworkTask(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现返工任务分派逻辑
|
|
|
|
|
log.info("分派返工任务: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("分派返工任务失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成退货单据
|
|
|
|
|
*/
|
|
|
|
|
private void generateReturnDocument(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现退货单据生成逻辑
|
|
|
|
|
log.info("生成退货单据: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("生成退货单据失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 通知供应商
|
|
|
|
|
*/
|
|
|
|
|
private void notifySupplier(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现供应商通知逻辑
|
|
|
|
|
log.info("通知供应商: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("通知供应商失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成让步接收单据
|
|
|
|
|
*/
|
|
|
|
|
private void generateAcceptanceDocument(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现让步接收单据生成逻辑
|
|
|
|
|
log.info("生成让步接收单据: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("生成让步接收单据失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发入库流程
|
|
|
|
|
*/
|
|
|
|
|
private void triggerInboundProcess(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现入库流程触发逻辑
|
|
|
|
|
log.info("触发入库流程: 评审ID={}", bo.getReviewId());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("触发入库流程失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 确定流转目标
|
|
|
|
|
*/
|
|
|
|
|
private String determineTransferTarget(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现流转目标确定逻辑
|
|
|
|
|
// 这里可以根据业务规则或配置来确定流转目标
|
|
|
|
|
return "质量管理部"; // 默认流转目标
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("确定流转目标失败: 评审ID={}", bo.getReviewId(), e);
|
|
|
|
|
return "质量管理部";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成流转单据
|
|
|
|
|
*/
|
|
|
|
|
private void generateTransferDocument(QcUnqualifiedReviewBo bo, String transferTarget) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现流转单据生成逻辑
|
|
|
|
|
log.info("生成流转单据: 评审ID={}, 目标={}", bo.getReviewId(), transferTarget);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("生成流转单据失败: 评审ID={}, 目标={}", bo.getReviewId(), transferTarget, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 通知目标部门
|
|
|
|
|
*/
|
|
|
|
|
private void notifyTargetDepartment(QcUnqualifiedReviewBo bo, String transferTarget) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现目标部门通知逻辑
|
|
|
|
|
log.info("通知目标部门: 评审ID={}, 目标={}", bo.getReviewId(), transferTarget);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("通知目标部门失败: 评审ID={}, 目标={}", bo.getReviewId(), transferTarget, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 记录处理日志
|
|
|
|
|
*/
|
|
|
|
|
private void recordProcessLog(QcUnqualifiedReviewBo bo, String message) {
|
|
|
|
|
try {
|
|
|
|
|
// TODO: 实现处理日志记录逻辑
|
|
|
|
|
log.info("记录处理日志: 评审ID={}, 消息={}", bo.getReviewId(), message);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("记录处理日志失败: 评审ID={}, 消息={}", bo.getReviewId(), message, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MPJLambdaWrapper<QcUnqualifiedReview> buildQueryWrapper(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
Map<String, Object> params = bo.getParams();
|
|
|
|
|
MPJLambdaWrapper<QcUnqualifiedReview> lqw = JoinWrappers.lambda(QcUnqualifiedReview.class)
|
|
|
|
|
.selectAll(QcUnqualifiedReview.class)
|
|
|
|
|
|
|
|
|
|
//关联质检主表
|
|
|
|
|
.select(QcInspectionMain::getInspectionNo)
|
|
|
|
|
.leftJoin(QcInspectionMain.class, QcInspectionMain::getInspectionId, QcUnqualifiedReview::getInspectionId)
|
|
|
|
|
//关联检测类型
|
|
|
|
|
.select(QcInspectionType::getTypeName, QcInspectionType::getQcInspectionType, QcInspectionType::getTypeCode, QcInspectionType::getQcInspectionType)
|
|
|
|
|
.leftJoin(QcInspectionType.class, QcInspectionType::getTypeId, QcInspectionMain::getTypeId)
|
|
|
|
|
|
|
|
|
|
.eq(bo.getReviewId() != null, QcUnqualifiedReview::getReviewId, bo.getReviewId())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getUnqualifiedNo()), QcUnqualifiedReview::getUnqualifiedNo, bo.getUnqualifiedNo())
|
|
|
|
|
.eq(bo.getInspectionId() != null, QcUnqualifiedReview::getInspectionId, bo.getInspectionId())
|
|
|
|
|
.eq(bo.getTypeId() != null, QcUnqualifiedReview::getTypeId, bo.getTypeId())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getWorkOrder()), QcUnqualifiedReview::getWorkOrder, bo.getWorkOrder())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getProcessCode()), QcUnqualifiedReview::getProcessCode, bo.getProcessCode())
|
|
|
|
|
.like(StringUtils.isNotBlank(bo.getProcessName()), QcUnqualifiedReview::getProcessName, bo.getProcessName())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getBatchNo()), QcUnqualifiedReview::getBatchNo, bo.getBatchNo())
|
|
|
|
|
.like(StringUtils.isNotBlank(bo.getMaterialName()), QcUnqualifiedReview::getMaterialName, bo.getMaterialName())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getMaterialCode()), QcUnqualifiedReview::getMaterialCode, bo.getMaterialCode())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getInspectorResult()), QcUnqualifiedReview::getInspectorResult, bo.getInspectorResult())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getReviewResult()), QcUnqualifiedReview::getReviewResult, bo.getReviewResult())
|
|
|
|
|
.eq(StringUtils.isNotBlank(bo.getReviewer()), QcUnqualifiedReview::getReviewer, bo.getReviewer())
|
|
|
|
|
.eq(bo.getReviewTime() != null, QcUnqualifiedReview::getReviewTime, bo.getReviewTime())
|
|
|
|
|
.orderByDesc(QcUnqualifiedReview::getCreateTime);
|
|
|
|
|
return lqw;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 新增不合格品待评审
|
|
|
|
|
*
|
|
|
|
|
* @param bo 不合格品待评审
|
|
|
|
|
* @return 是否新增成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean insertByBo(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
QcUnqualifiedReview add = MapstructUtils.convert(bo, QcUnqualifiedReview.class);
|
|
|
|
|
validEntityBeforeSave(add);
|
|
|
|
|
boolean flag = baseMapper.insert(add) > 0;
|
|
|
|
|
if (flag) {
|
|
|
|
|
bo.setReviewId(add.getReviewId());
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改不合格品待评审
|
|
|
|
|
*
|
|
|
|
|
* @param bo 不合格品待评审
|
|
|
|
|
* @return 是否修改成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean updateByBo(QcUnqualifiedReviewBo bo) {
|
|
|
|
|
QcUnqualifiedReview update = MapstructUtils.convert(bo, QcUnqualifiedReview.class);
|
|
|
|
|
validEntityBeforeSave(update);
|
|
|
|
|
return baseMapper.updateById(update) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 保存前的数据校验
|
|
|
|
|
*/
|
|
|
|
|
private void validEntityBeforeSave(QcUnqualifiedReview entity){
|
|
|
|
|
//TODO 做一些数据校验,如唯一约束
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 校验并批量删除不合格品待评审信息
|
|
|
|
|
*
|
|
|
|
|
* @param ids 待删除的主键集合
|
|
|
|
|
* @param isValid 是否进行有效性校验
|
|
|
|
|
* @return 是否删除成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
|
|
if(isValid){
|
|
|
|
|
//TODO 做一些业务上的校验,判断是否需要校验
|
|
|
|
|
}
|
|
|
|
|
return baseMapper.deleteByIds(ids) > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|