Compare commits
2 Commits
049ff61c24
...
9542751147
| Author | SHA1 | Date |
|---|---|---|
|
|
9542751147 | |
|
|
0da38080ca |
|
|
@ -5,6 +5,7 @@ import com.nflg.qms.admin.service.QmsIssueTicketProcessMeasureControllerService;
|
||||||
import com.nflg.wms.common.pojo.ApiResult;
|
import com.nflg.wms.common.pojo.ApiResult;
|
||||||
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO;
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO;
|
||||||
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessLeaderDraftQO;
|
||||||
import com.nflg.wms.starter.BaseController;
|
import com.nflg.wms.starter.BaseController;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
@ -52,4 +53,22 @@ public class QmsIssueTicketProcessController extends BaseController {
|
||||||
issueTicketProcessControllerService.submit(request);
|
issueTicketProcessControllerService.submit(request);
|
||||||
return ApiResult.success();
|
return ApiResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导暂存工单处理
|
||||||
|
*/
|
||||||
|
@PostMapping("leaderDraft")
|
||||||
|
public ApiResult<Void> leaderDraft(@Valid @RequestBody QmsIssueTicketProcessLeaderDraftQO request) {
|
||||||
|
issueTicketProcessMeasureControllerService.leaderDraft(request);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导提交工单处理
|
||||||
|
*/
|
||||||
|
@PostMapping("leaderSubmit")
|
||||||
|
public ApiResult<Void> leaderSubmit(@Valid @RequestBody QmsIssueTicketProcessLeaderDraftQO request) {
|
||||||
|
issueTicketProcessControllerService.leaderSubmit(request);
|
||||||
|
return ApiResult.success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,26 +208,13 @@ public class QmsIssueTicketControllerService {
|
||||||
|
|
||||||
issueTicketService.save(entity);
|
issueTicketService.save(entity);
|
||||||
|
|
||||||
// 异步新增工单处理记录
|
// 异步新增工单处理记录并推送待办
|
||||||
issueTicketProcessControllerService.addAsync(
|
issueTicketProcessControllerService.addAsync(
|
||||||
entity.getId(),
|
entity.getId(),
|
||||||
request.getHandlerUserId(),
|
request.getHandlerUserId(),
|
||||||
request.getInspectionResultIds()
|
request.getInspectionResultIds(),
|
||||||
|
ticketNo
|
||||||
);
|
);
|
||||||
|
|
||||||
// 推送待办消息
|
|
||||||
Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "PDIDefectiveProductHandling");
|
|
||||||
VUtil.trueThrowBusinessError(Objects.isNull(sourceTypeId)).throwMessage("消息类型不存在");
|
|
||||||
User handlerUser = userService.getById(request.getHandlerUserId());
|
|
||||||
QmsTodoItem todoItem = new QmsTodoItem()
|
|
||||||
.setCode(ticketNo)
|
|
||||||
.setIsRead(false)
|
|
||||||
.setSourceTypeId(sourceTypeId)
|
|
||||||
.setSourceId(entity.getId())
|
|
||||||
.setCreateUserId(request.getHandlerUserId())
|
|
||||||
.setCreateUserName(handlerUser != null ? handlerUser.getUserName() : userName)
|
|
||||||
.setCreateTime(now);
|
|
||||||
todoItemService.save(todoItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,16 @@ import com.nflg.wms.common.constant.STATE;
|
||||||
import com.nflg.wms.common.exception.NflgException;
|
import com.nflg.wms.common.exception.NflgException;
|
||||||
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO;
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO;
|
||||||
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessLeaderDraftQO;
|
||||||
|
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.QmsIssueTicketProcess;
|
||||||
|
import com.nflg.wms.repository.entity.QmsTodoItem;
|
||||||
import com.nflg.wms.repository.entity.User;
|
import com.nflg.wms.repository.entity.User;
|
||||||
|
import com.nflg.wms.repository.service.IDictionaryItemService;
|
||||||
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
|
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
|
||||||
|
import com.nflg.wms.repository.service.IQmsIssueTicketService;
|
||||||
|
import com.nflg.wms.repository.service.IQmsTodoItemService;
|
||||||
import com.nflg.wms.repository.service.IUserService;
|
import com.nflg.wms.repository.service.IUserService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
@ -14,7 +21,9 @@ import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -32,6 +41,15 @@ public class QmsIssueTicketProcessControllerService {
|
||||||
@Resource
|
@Resource
|
||||||
private QmsIssueTicketProcessMeasureControllerService issueTicketProcessMeasureControllerService;
|
private QmsIssueTicketProcessMeasureControllerService issueTicketProcessMeasureControllerService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IQmsIssueTicketService issueTicketService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IQmsTodoItemService todoItemService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IDictionaryItemService dictionaryItemService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增工单处理(同步,供 Controller 直接调用)
|
* 新增工单处理(同步,供 Controller 直接调用)
|
||||||
*/
|
*/
|
||||||
|
|
@ -40,14 +58,27 @@ public class QmsIssueTicketProcessControllerService {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异步新增工单处理(供内部服务调用)
|
* 异步新增工单处理并推送待办(供内部服务调用)
|
||||||
*/
|
*/
|
||||||
@Async("ticketTaskExecutor")
|
@Async("ticketTaskExecutor")
|
||||||
public void addAsync(Long issueTicketId, Long handlerUserId, List<Long> taskResultIds) {
|
public void addAsync(Long issueTicketId, Long handlerUserId, List<Long> taskResultIds, String ticketNo) {
|
||||||
doAdd(issueTicketId, handlerUserId, taskResultIds);
|
Long processId = doAdd(issueTicketId, handlerUserId, taskResultIds);
|
||||||
|
|
||||||
|
// 推送待办消息
|
||||||
|
Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "PDIDefectiveProductHandling");
|
||||||
|
User handlerUser = userService.getById(handlerUserId);
|
||||||
|
QmsTodoItem todoItem = new QmsTodoItem()
|
||||||
|
.setCode(ticketNo)
|
||||||
|
.setIsRead(false)
|
||||||
|
.setSourceTypeId(sourceTypeId)
|
||||||
|
.setSourceId(processId)
|
||||||
|
.setCreateUserId(handlerUserId)
|
||||||
|
.setCreateUserName(handlerUser != null ? handlerUser.getUserName() : null)
|
||||||
|
.setCreateTime(LocalDateTime.now());
|
||||||
|
todoItemService.save(todoItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doAdd(Long issueTicketId, Long handlerUserId, List<Long> taskResultIds) {
|
private Long doAdd(Long issueTicketId, Long handlerUserId, List<Long> taskResultIds) {
|
||||||
User user = userService.getById(handlerUserId);
|
User user = userService.getById(handlerUserId);
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw new NflgException(STATE.BusinessError, "处理人用户不存在");
|
throw new NflgException(STATE.BusinessError, "处理人用户不存在");
|
||||||
|
|
@ -62,14 +93,120 @@ public class QmsIssueTicketProcessControllerService {
|
||||||
.collect(Collectors.joining(",")));
|
.collect(Collectors.joining(",")));
|
||||||
|
|
||||||
issueTicketProcessService.save(entity);
|
issueTicketProcessService.save(entity);
|
||||||
|
return entity.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提交工单处理:更新工单处理记录,有措施内容则新增一条措施记录
|
* 提交工单处理:
|
||||||
* TODO: 后续补充推送到下一级的逻辑
|
* 1. 校验 approvalStatus 必传
|
||||||
|
* 2. 执行保存逻辑(复用 draft)
|
||||||
|
* 3. approvalStatus=1(驳回):推送待办给工单创建人
|
||||||
|
* 4. approvalStatus=0(通过):推送给当前用户所在部门负责人(TODO: 部门负责人字段暂无,后续补充)
|
||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void submit(@Valid QmsIssueTicketProcessDraftQO request) {
|
public void submit(@Valid QmsIssueTicketProcessDraftQO request) {
|
||||||
|
// 1. 校验审批状态必传
|
||||||
|
VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus()))
|
||||||
|
.throwMessage("提交时审批状态不能为空");
|
||||||
|
|
||||||
|
// 2. 保存数据
|
||||||
issueTicketProcessMeasureControllerService.draft(request);
|
issueTicketProcessMeasureControllerService.draft(request);
|
||||||
|
|
||||||
|
// 3. 查询工单处理记录,获取关联的工单
|
||||||
|
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
|
||||||
|
QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId());
|
||||||
|
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在");
|
||||||
|
|
||||||
|
Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "RejectedPDIDefectiveProductHandling");
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
|
||||||
|
if (request.getApprovalStatus() == 1) {
|
||||||
|
// 驳回:推送待办给工单创建人(分配任务的user)
|
||||||
|
User creator = userService.getById(ticket.getCreateUserId());
|
||||||
|
QmsTodoItem todoItem = new QmsTodoItem()
|
||||||
|
.setCode(ticket.getTicketNo())
|
||||||
|
.setIsRead(false)
|
||||||
|
.setSourceTypeId(sourceTypeId)
|
||||||
|
.setSourceId(process.getId())
|
||||||
|
.setCreateUserId(ticket.getCreateUserId())
|
||||||
|
.setCreateUserName(creator != null ? creator.getUserName() : null)
|
||||||
|
.setCreateTime(now);
|
||||||
|
todoItemService.save(todoItem);
|
||||||
|
} else if (request.getApprovalStatus() == 0) {
|
||||||
|
// 通过:推送给当前用户所在部门负责人
|
||||||
|
// TODO: Department 表暂无负责人字段,后续补充
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导提交工单处理:
|
||||||
|
* 1. 校验 leaderApprovalResult 必传
|
||||||
|
* 2. 执行保存逻辑(复用 leaderDraft)+ 写入审批时间
|
||||||
|
* 3. leaderApprovalResult=0(驳回):推送待办给处理人
|
||||||
|
* 4. leaderApprovalResult=1(同意):结束流程
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void leaderSubmit(@Valid QmsIssueTicketProcessLeaderDraftQO request) {
|
||||||
|
// 1. 校验领导审批结果必传
|
||||||
|
VUtil.trueThrowBusinessError(Objects.isNull(request.getLeaderApprovalResult()))
|
||||||
|
.throwMessage("提交时领导审批结果不能为空");
|
||||||
|
|
||||||
|
// 2. 保存数据
|
||||||
|
issueTicketProcessMeasureControllerService.leaderDraft(request);
|
||||||
|
|
||||||
|
// 3. 写入领导审批时间
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
issueTicketProcessService.lambdaUpdate()
|
||||||
|
.eq(QmsIssueTicketProcess::getId, request.getId())
|
||||||
|
.set(QmsIssueTicketProcess::getLeaderApprovalTime, now)
|
||||||
|
.update();
|
||||||
|
|
||||||
|
if (request.getLeaderApprovalResult() == 0) {
|
||||||
|
// 驳回:推送待办给处理人
|
||||||
|
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
|
||||||
|
QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId());
|
||||||
|
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在");
|
||||||
|
|
||||||
|
Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "RejectedPDIDefectiveProductHandling");
|
||||||
|
User handler = userService.getById(process.getHandlerUserId());
|
||||||
|
QmsTodoItem todoItem = new QmsTodoItem()
|
||||||
|
.setCode(ticket.getTicketNo())
|
||||||
|
.setIsRead(false)
|
||||||
|
.setSourceTypeId(sourceTypeId)
|
||||||
|
.setSourceId(process.getId())
|
||||||
|
.setCreateUserId(process.getHandlerUserId())
|
||||||
|
.setCreateUserName(handler != null ? handler.getUserName() : null)
|
||||||
|
.setCreateTime(now);
|
||||||
|
todoItemService.save(todoItem);
|
||||||
|
} else if (request.getLeaderApprovalResult() == 1) {
|
||||||
|
// 同意:检查同一工单下所有处理记录是否都已完成
|
||||||
|
QmsIssueTicketProcess current = issueTicketProcessService.getById(request.getId());
|
||||||
|
Long issueTicketId = current.getIssueTicketId();
|
||||||
|
|
||||||
|
// 查询同一工单下是否存在未完成的记录
|
||||||
|
// 完成条件:leaderApprovalResult=1 或(leaderApprovalResult为空 且 approvalStatus=1)
|
||||||
|
// 未完成:不满足以上任一条件的记录
|
||||||
|
long notCompleted = issueTicketProcessService.lambdaQuery()
|
||||||
|
.eq(QmsIssueTicketProcess::getIssueTicketId, issueTicketId)
|
||||||
|
.and(w -> w
|
||||||
|
// 排除 leaderApprovalResult=1 的(已完成)
|
||||||
|
.ne(true, QmsIssueTicketProcess::getLeaderApprovalResult, (short) 1)
|
||||||
|
.or()
|
||||||
|
.isNull(QmsIssueTicketProcess::getLeaderApprovalResult))
|
||||||
|
// 在 leaderApprovalResult 不为1的记录中,排除 approvalStatus=1 的(处理人驳回,也算完成)
|
||||||
|
.and(w -> w
|
||||||
|
.ne(true, QmsIssueTicketProcess::getApprovalStatus, (short) 1)
|
||||||
|
.or()
|
||||||
|
.isNull(QmsIssueTicketProcess::getApprovalStatus))
|
||||||
|
.count();
|
||||||
|
|
||||||
|
if (notCompleted == 0) {
|
||||||
|
// 所有处理记录都已完成,更新工单状态为已完成(2)
|
||||||
|
issueTicketService.lambdaUpdate()
|
||||||
|
.eq(QmsIssueTicket::getId, issueTicketId)
|
||||||
|
.set(QmsIssueTicket::getStatus, (short) 2)
|
||||||
|
.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ package com.nflg.qms.admin.service;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO;
|
||||||
|
import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessLeaderDraftQO;
|
||||||
|
import com.nflg.wms.common.util.UserUtil;
|
||||||
import com.nflg.wms.common.util.VUtil;
|
import com.nflg.wms.common.util.VUtil;
|
||||||
import com.nflg.wms.repository.entity.QmsIssueTicketProcess;
|
import com.nflg.wms.repository.entity.QmsIssueTicketProcess;
|
||||||
import com.nflg.wms.repository.entity.QmsIssueTicketProcessMeasure;
|
import com.nflg.wms.repository.entity.QmsIssueTicketProcessMeasure;
|
||||||
|
|
@ -51,4 +53,23 @@ public class QmsIssueTicketProcessMeasureControllerService {
|
||||||
issueTicketProcessMeasureService.save(measure);
|
issueTicketProcessMeasureService.save(measure);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导暂存:更新领导审批意见、审批结果,写入领导信息
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void leaderDraft(@Valid QmsIssueTicketProcessLeaderDraftQO request) {
|
||||||
|
QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId());
|
||||||
|
VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在");
|
||||||
|
|
||||||
|
issueTicketProcessService.lambdaUpdate()
|
||||||
|
.eq(QmsIssueTicketProcess::getId, request.getId())
|
||||||
|
.set(request.getLeaderApprovalOpinion() != null,
|
||||||
|
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getLeaderApprovalOpinion())
|
||||||
|
.set(request.getLeaderApprovalResult() != null,
|
||||||
|
QmsIssueTicketProcess::getLeaderApprovalResult, request.getLeaderApprovalResult())
|
||||||
|
.set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId())
|
||||||
|
.set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName())
|
||||||
|
.update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,10 +192,13 @@ public class QmsPdiInspectionResultsControllerService {
|
||||||
request.getOverallResult() != null && request.getOverallResult())
|
request.getOverallResult() != null && request.getOverallResult())
|
||||||
.update();
|
.update();
|
||||||
|
|
||||||
// 5. 设置检测完成时间,状态改为已完成
|
// 5. 设置检测完成时间、是否延期、状态改为已完成
|
||||||
|
boolean overdue = taskRecord.getRequiredCompletionTime() != null
|
||||||
|
&& now.isAfter(taskRecord.getRequiredCompletionTime());
|
||||||
taskRecordService.lambdaUpdate()
|
taskRecordService.lambdaUpdate()
|
||||||
.eq(QmsPdiTaskRecord::getId, taskRecord.getId())
|
.eq(QmsPdiTaskRecord::getId, taskRecord.getId())
|
||||||
.set(QmsPdiTaskRecord::getDetectionCompletionTime, now)
|
.set(QmsPdiTaskRecord::getDetectionCompletionTime, now)
|
||||||
|
.set(QmsPdiTaskRecord::getOverdue, overdue)
|
||||||
.set(QmsPdiTaskRecord::getInspectionEnable, 2)
|
.set(QmsPdiTaskRecord::getInspectionEnable, 2)
|
||||||
.update();
|
.update();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.nflg.wms.common.pojo.qo;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 质量问题工单处理 领导暂存/提交参数
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class QmsIssueTicketProcessLeaderDraftQO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工单处理ID(QmsIssueTicketProcess.ID)
|
||||||
|
*/
|
||||||
|
@NotNull(message = "工单处理ID不能为空")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导审批意见(可选)
|
||||||
|
*/
|
||||||
|
private String leaderApprovalOpinion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 领导审批结果(可选):0=驳回,1=同意
|
||||||
|
*/
|
||||||
|
private Short leaderApprovalResult;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue