feat(issue-ticket): 优化PDI工单创建及查询逻辑

- 只创建工单主表,不创建处理明细,避免重复插入
- 查询任务记录及检测规则,校验数据完整性
- 判断是否已存在工单,避免重复创建并抛出异常提示
- 根据检测类型生成工单标题,提升信息准确性
- 汇总所有不合格项生成事件描述,便于问题追踪
- 统计不合格项数量赋值工单主表字段
- 调用编号生成服务生成唯一工单编号
- 异步新增工单处理记录并推送待办任务
- 返回工单ID、工单编号及不合格检测项列表
This commit is contained in:
funny 2026-05-09 14:24:00 +08:00
parent c9b7b45653
commit ace2827b6a
1 changed files with 104 additions and 28 deletions

View File

@ -88,46 +88,106 @@ public class QmsIssueTicketControllerService {
/**
* PDI新建工单并返回不合格检测项
* 1. 创建工单
* 1. 创建工单只创建工单主表不创建处理明细
* 2. 查询任务的不合格检测项
* 3. 返回工单ID和不合格检测项列表
*/
@Transactional(rollbackFor = Exception.class)
public QmsPdiCreateTicketResultVO createAndQueryPdiTicket(@Valid QmsPdiCreateAndQueryTicketQO request) {
// 1. 创建工单
QmsIssueTicketPdiAddQO addQO = new QmsIssueTicketPdiAddQO();
addQO.setTaskRecordId(request.getTaskRecordId());
addQO.setIncidentType(request.getIncidentType());
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
List<QmsIssueTicketPdiAddQO.HandlerItem> handlerItems = request.getHandlers().stream()
.map(h -> {
QmsIssueTicketPdiAddQO.HandlerItem item = new QmsIssueTicketPdiAddQO.HandlerItem();
item.setTaskResultId(h.getTaskResultId());
item.setHandlerUserId(h.getHandlerUserId());
return item;
})
.collect(Collectors.toList());
addQO.setHandlers(handlerItems);
// 1. 查询任务记录
QmsPdiTaskRecord taskRecord = pdiTaskRecordService.getById(request.getTaskRecordId());
if (Objects.isNull(taskRecord)) {
throw new NflgException(STATE.BusinessError, "PDI检测任务记录不存在");
}
addPdiTicket(addQO);
// 2. 查询该任务的不合格检测项
List<QmsPdiInspectionResultVO> unqualifiedItems = initiatePdiTicket(request.getTaskRecordId());
// 3. 查询刚创建的工单
QmsIssueTicket ticket = issueTicketService.lambdaQuery()
// 2. 校验是否已存在工单
QmsIssueTicket existingTicket = issueTicketService.lambdaQuery()
.eq(QmsIssueTicket::getSourceType, (short) 1)
.eq(QmsIssueTicket::getSourceId, request.getTaskRecordId())
.orderByDesc(QmsIssueTicket::getCreateTime)
.last("LIMIT 1")
.one();
// 4. 构建返回结果
QmsPdiCreateTicketResultVO result = new QmsPdiCreateTicketResultVO();
if (ticket != null) {
result.setTicketId(ticket.getId());
result.setTicketNo(ticket.getTicketNo());
if (existingTicket != null) {
throw new NflgException(STATE.BusinessError, "该任务已存在工单(工单编号:" + existingTicket.getTicketNo() + "),请使用追加处理记录接口");
}
// 3. 查询检测规则
QmsPdiDetectionRules rules = pdiDetectionRulesService.getById(taskRecord.getDetectionRulesId());
if (Objects.isNull(rules)) {
throw new NflgException(STATE.BusinessError, "PDI检测规则不存在");
}
// 4. 生成工单标题
String ticketTitle;
if (Objects.equals(rules.getInspectionType(), 0)) {
ticketTitle = StrUtil.join("-", rules.getMachineNo(), taskRecord.getDeviceNo(),
taskRecord.getOrderNo(), "出厂检验", rules.getInspectionVersion());
} else {
ticketTitle = StrUtil.join("-", rules.getMachineNo(),
taskRecord.getOrderNo(), "库存检验", rules.getInspectionVersion());
}
// 5. 查询所有不合格项汇总生成incidentDescription
String incidentDescription = "";
List<QmsPdiInspectionResults> allUnqualifiedResults = pdiInspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, request.getTaskRecordId())
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.list();
if (CollectionUtil.isNotEmpty(allUnqualifiedResults)) {
StringBuilder descBuilder = new StringBuilder();
int index = 1;
for (QmsPdiInspectionResults result : allUnqualifiedResults) {
if (index > 1) {
descBuilder.append("");
}
descBuilder.append(index).append(". ");
descBuilder.append(result.getRemark() != null ? result.getRemark() : "");
index++;
}
incidentDescription = descBuilder.toString();
}
// 6. 统计不合格检测项数量
long unqualifiedCount = pdiInspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, request.getTaskRecordId())
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.count();
// 7. 生成工单编号
String ticketNo = basdeSerialNumberControllerService.generateSerialNumber(38);
// 8. 创建工单主表
QmsIssueTicket entity = new QmsIssueTicket()
.setSourceType((short) 1)
.setSourceId(request.getTaskRecordId())
.setTicketNo(ticketNo)
.setTicketTitle(ticketTitle)
.setProjectNo(taskRecord.getTaskNo())
.setIncidentType(request.getIncidentType())
.setIncidentDescription(incidentDescription)
.setUnqualifiedQty((int) unqualifiedCount)
.setApprovalStatus((short) 0)
.setStatus((short) 0)
.setCreateUserId(userId)
.setCreateUserName(userName)
.setCreateTime(now)
.setUpdateUserId(userId)
.setUpdateUserName(userName)
.setUpdateTime(now);
issueTicketService.save(entity);
// 9. 查询该任务的不合格检测项
List<QmsPdiInspectionResultVO> unqualifiedItems = initiatePdiTicket(request.getTaskRecordId());
// 10. 构建返回结果
QmsPdiCreateTicketResultVO result = new QmsPdiCreateTicketResultVO();
result.setTicketId(entity.getId());
result.setTicketNo(ticketNo);
result.setUnqualifiedItems(unqualifiedItems != null ? unqualifiedItems : List.of());
return result;
@ -385,6 +445,22 @@ public class QmsIssueTicketControllerService {
.setUpdateTime(now);
issueTicketService.save(entity);
// 按处理人分组异步新增工单处理记录并推送待办
Map<Long, List<Long>> handlerToResultsMap = request.getHandlers().stream()
.collect(Collectors.groupingBy(
QmsIssueTicketPdiAddQO.HandlerItem::getHandlerUserId,
Collectors.mapping(QmsIssueTicketPdiAddQO.HandlerItem::getTaskResultId, Collectors.toList())
));
for (Map.Entry<Long, List<Long>> entry : handlerToResultsMap.entrySet()) {
issueTicketProcessControllerService.addAsync(
entity.getId(),
entry.getKey(),
entry.getValue(),
ticketNo
);
}
}
/**