工单暂存和提交接口修改

This commit is contained in:
funny 2026-05-13 09:01:26 +08:00
parent 1181b5de02
commit fa73c7d21a
4 changed files with 134 additions and 66 deletions

View File

@ -1661,11 +1661,13 @@ public class QmsIssueTicketControllerService {
.map(QmsPdiInspectionResults::getId)
.collect(Collectors.toSet());
// 收集有效分派的不合格项ID仅非驳回记录approvalStatus为null待处理 0已通过
// 收集有效分派的不合格项ID排除处理人/审批人驳回的记录
Set<Long> effectivelyDispatched = new HashSet<>();
for (QmsIssueTicketProcess p : processes) {
if (StrUtil.isBlank(p.getTaskResultIds())) continue;
if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) continue; // 被驳回的不算有效覆盖
// 处理人/审批人驳回的不算有效覆盖需要创建人重新分派
if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) continue;
// 领导驳回不影响分派权限由处理人重新提交处理
Arrays.stream(p.getTaskResultIds().split(","))
.filter(StrUtil::isNotBlank).map(String::trim).map(Long::valueOf)
.forEach(effectivelyDispatched::add);

View File

@ -121,14 +121,23 @@ public class QmsIssueTicketProcessControllerService {
String currentUserName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 1. 查询处理记录
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在");
// 2. 查询工单获取source_type
QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId());
// 1. 查询工单request.getId()现在是工单ID
QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
// 2. 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, request.getId())
.and(w -> w
.eq(QmsIssueTicketProcess::getHandlerUserId, currentUserId)
.or()
.eq(QmsIssueTicketProcess::getApprovalUserId, currentUserId)
.or()
.eq(QmsIssueTicketProcess::getLeaderUserId, currentUserId))
.last("LIMIT 1")
.one();
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("未找到当前用户的工单处理记录");
Short sourceType = ticket.getSourceType();
Long handlerUserId = process.getHandlerUserId();
@ -152,7 +161,7 @@ public class QmsIssueTicketProcessControllerService {
// 写入审批时间
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, process.getId())
.set(QmsIssueTicketProcess::getApprovalTime, now)
.update();
@ -189,9 +198,11 @@ public class QmsIssueTicketProcessControllerService {
VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus()))
.throwMessage("提交时审批状态不能为空");
Long processId = process.getId();
// 2. 保存数据前端传入approvalStatus/approvalOpinion数据库填入leaderApprovalResult/leaderApprovalOpinion
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion())
.set(request.getApprovalStatus() != null,
@ -251,12 +262,14 @@ public class QmsIssueTicketProcessControllerService {
VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus()))
.throwMessage("提交时审批状态不能为空");
Long processId = process.getId();
// 2. 保存数据
issueTicketProcessMeasureControllerService.draft(request);
// 3. 写入审批时间并重置领导审批结果允许领导重新审批
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(QmsIssueTicketProcess::getApprovalTime, now)
.set(QmsIssueTicketProcess::getLeaderApprovalResult, null)
.set(QmsIssueTicketProcess::getLeaderApprovalOpinion, null)

View File

@ -10,6 +10,7 @@ import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.QmsIssueTicket;
import com.nflg.wms.repository.entity.QmsIssueTicketProcess;
import com.nflg.wms.repository.entity.QmsIssueTicketProcessMeasure;
import com.nflg.wms.repository.service.IDictionaryItemService;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessMeasureService;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
@ -19,6 +20,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
/**
@ -36,45 +38,38 @@ public class QmsIssueTicketProcessMeasureControllerService {
@Resource
private IQmsIssueTicketService issueTicketService;
@Resource
private IDictionaryItemService dictionaryItemService;
/**
* 暂存工单处理更新工单处理记录有措施内容则新增一条措施记录
* 暂存工单处理更新工单处理记录有措施内容则新增措施记录
*/
@Transactional(rollbackFor = Exception.class)
public void draft(@Valid QmsIssueTicketProcessDraftQO request) {
// 校验工单处理记录存在
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在");
Long currentUserId = UserUtil.getUserId();
// 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId);
// 校验领导已同意时不允许修改
if (process.getLeaderApprovalResult() != null && process.getLeaderApprovalResult() == 1) {
throw new NflgException(STATE.BusinessError, "领导已审批同意,不允许修改");
}
Long processId = process.getId();
// 更新工单处理记录
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause())
.set(request.getApprovalStatus() != null, QmsIssueTicketProcess::getApprovalStatus, request.getApprovalStatus())
.set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicketProcess::getApprovalUserId, UserUtil.getUserId())
.set(QmsIssueTicketProcess::getApprovalUserId, currentUserId)
.set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName())
.update();
// 有措施列表则批量新增措施记录
if (CollectionUtil.isNotEmpty(request.getMeasures())) {
for (QmsIssueTicketProcessDraftQO.MeasureItem item : request.getMeasures()) {
if (StrUtil.isBlank(item.getMeasureContent())) continue;
QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure()
.setIssueTicketProcessId(request.getId())
.setMeasureContent(item.getMeasureContent())
.setMeasureTypeId(item.getMeasureTypeId())
.setChargeUser(UserUtil.getUserName())
.setPlanDate(item.getPlanDate())
.setConfirmDate(item.getConfirmDate())
.setRemark(item.getRemark());
issueTicketProcessMeasureService.save(measure);
}
}
// 保存措施记录临时措施 + 永久措施
saveMeasures(processId, request.getTemporaryMeasures(), request.getPermanentMeasures());
}
/**
@ -82,17 +77,21 @@ public class QmsIssueTicketProcessMeasureControllerService {
*/
@Transactional(rollbackFor = Exception.class)
public void leaderDraft(@Valid QmsIssueTicketProcessDraftQO request) {
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在");
Long currentUserId = UserUtil.getUserId();
// 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId);
Long processId = process.getId();
// 前端传入approvalOpinion/approvalStatus数据库填入leaderApprovalOpinion/leaderApprovalResult
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion())
.set(request.getApprovalStatus() != null,
QmsIssueTicketProcess::getLeaderApprovalResult, request.getApprovalStatus())
.set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId())
.set(QmsIssueTicketProcess::getLeaderUserId, currentUserId)
.set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName())
.set(QmsIssueTicketProcess::getLeaderApprovalTime, LocalDateTime.now())
.update();
@ -105,12 +104,12 @@ public class QmsIssueTicketProcessMeasureControllerService {
public void draftUnified(@Valid QmsIssueTicketProcessDraftQO request) {
Long currentUserId = UserUtil.getUserId();
// 1. 查询处理记录
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在");
// 1. 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId);
Long processId = process.getId();
// 2. 查询工单获取source_type
QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId());
QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
Short sourceType = ticket.getSourceType();
@ -133,31 +132,18 @@ public class QmsIssueTicketProcessMeasureControllerService {
if (isHandler) {
// 处理人处理只填根本原因和措施不填审批状态
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause())
.set(QmsIssueTicketProcess::getApprovalUserId, currentUserId)
.set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName())
.update();
// 有措施列表则批量新增
if (CollectionUtil.isNotEmpty(request.getMeasures())) {
for (QmsIssueTicketProcessDraftQO.MeasureItem item : request.getMeasures()) {
if (StrUtil.isBlank(item.getMeasureContent())) continue;
QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure()
.setIssueTicketProcessId(request.getId())
.setMeasureContent(item.getMeasureContent())
.setMeasureTypeId(item.getMeasureTypeId())
.setChargeUser(UserUtil.getUserName())
.setPlanDate(item.getPlanDate())
.setConfirmDate(item.getConfirmDate())
.setRemark(item.getRemark());
issueTicketProcessMeasureService.save(measure);
}
}
// 保存措施记录临时措施 + 永久措施
saveMeasures(processId, request.getTemporaryMeasures(), request.getPermanentMeasures());
} else {
// 领导审批前端传入approvalStatus/approvalOpinion数据库填入leaderApprovalResult/leaderApprovalOpinion
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, request.getId())
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion())
.set(request.getApprovalStatus() != null,
@ -171,4 +157,71 @@ public class QmsIssueTicketProcessMeasureControllerService {
throw new NflgException(STATE.BusinessError, "不支持的工单类型");
}
}
/**
* 通过工单ID + 用户ID查找处理记录
*/
private QmsIssueTicketProcess findProcessByTicketAndUser(Long ticketId, Long userId) {
QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, ticketId)
.and(w -> w
.eq(QmsIssueTicketProcess::getHandlerUserId, userId)
.or()
.eq(QmsIssueTicketProcess::getApprovalUserId, userId)
.or()
.eq(QmsIssueTicketProcess::getLeaderUserId, userId))
.last("LIMIT 1")
.one();
if (process == null) {
throw new NflgException(STATE.BusinessError, "未找到当前用户的工单处理记录");
}
return process;
}
/**
* 保存措施记录先删除旧数据再分别插入临时措施和永久措施
*/
private void saveMeasures(Long processId, List<QmsIssueTicketProcessDraftQO.MeasureItem> temporaryMeasures,
List<QmsIssueTicketProcessDraftQO.MeasureItem> permanentMeasures) {
// 先删除该处理记录下的旧措施
issueTicketProcessMeasureService.lambdaUpdate()
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, processId)
.remove();
String currentUserName = UserUtil.getUserName();
// 保存临时措施
if (CollectionUtil.isNotEmpty(temporaryMeasures)) {
Long tempTypeId = dictionaryItemService.getIdByCode("MeasureType", "TemporaryCorrectiveMeasures");
for (QmsIssueTicketProcessDraftQO.MeasureItem item : temporaryMeasures) {
if (StrUtil.isBlank(item.getMeasureContent())) continue;
QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure()
.setIssueTicketProcessId(processId)
.setMeasureTypeId(tempTypeId)
.setMeasureContent(item.getMeasureContent())
.setChargeUser(currentUserName)
.setPlanDate(item.getPlanDate())
.setConfirmDate(item.getConfirmDate())
.setRemark(item.getRemark());
issueTicketProcessMeasureService.save(measure);
}
}
// 保存永久措施
if (CollectionUtil.isNotEmpty(permanentMeasures)) {
Long permTypeId = dictionaryItemService.getIdByCode("MeasureType", "PermanentCorrectiveMeasures");
for (QmsIssueTicketProcessDraftQO.MeasureItem item : permanentMeasures) {
if (StrUtil.isBlank(item.getMeasureContent())) continue;
QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure()
.setIssueTicketProcessId(processId)
.setMeasureTypeId(permTypeId)
.setMeasureContent(item.getMeasureContent())
.setChargeUser(currentUserName)
.setPlanDate(item.getPlanDate())
.setConfirmDate(item.getConfirmDate())
.setRemark(item.getRemark());
issueTicketProcessMeasureService.save(measure);
}
}
}
}

View File

@ -13,9 +13,9 @@ import java.util.List;
public class QmsIssueTicketProcessDraftQO {
/**
* 工单处理IDQmsIssueTicketProcess.ID
* 工单IDQmsIssueTicket.ID
*/
@NotNull(message = "工单处理ID不能为空")
@NotNull(message = "工单ID不能为空")
private Long id;
/**
@ -34,9 +34,14 @@ public class QmsIssueTicketProcessDraftQO {
private String approvalOpinion;
/**
* 措施列表可选每项对应一条 QmsIssueTicketProcessMeasure 记录
* 临时措施列表可选measureTypeId由后端根据字典值TemporaryCorrectiveMeasures自动赋值
*/
private List<MeasureItem> measures;
private List<MeasureItem> temporaryMeasures;
/**
* 永久措施列表可选measureTypeId由后端根据字典值PermanentCorrectiveMeasures自动赋值
*/
private List<MeasureItem> permanentMeasures;
/**
* 措施项
@ -44,11 +49,6 @@ public class QmsIssueTicketProcessDraftQO {
@Data
public static class MeasureItem {
/**
* 措施类型ID关联字典项表
*/
private Long measureTypeId;
/**
* 措施内容
*/