| | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; |
| | | import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; |
| | | import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; |
| | |
| | | */ |
| | | private static final String STOCK_TAKING_RESULT_APPROVE_BIZ_TYPE = "stock_taking_result_approve"; |
| | | |
| | | /** |
| | | * 盘点结果审批的 BPM 流程定义 Key |
| | | */ |
| | | private static final String STOCK_TAKING_RESULT_APPROVE_PROCESS_KEY = "stock_taking_result_approve"; |
| | | |
| | | @Resource |
| | | private MesWmStockTakingTaskMapper stockTakingTaskMapper; |
| | | |
| | | @Resource |
| | | private BpmProcessInstanceApi bpmProcessInstanceApi; |
| | | |
| | | @Resource |
| | | private MesWmMaterialStockService materialStockService; |
| | |
| | | |
| | | // 2. 记录提交时间并清空上一轮审核结果(任务保持盘点中,等待审核) |
| | | stockTakingTaskMapper.markResultApprovalSubmitted(id); |
| | | // 3. 创建 BPM 流程实例,businessKey 为盘点任务编号(审批结果回写的就是该任务) |
| | | bpmProcessInstanceApi.createProcessInstance(getLoginUserId(), |
| | | new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(STOCK_TAKING_RESULT_APPROVE_PROCESS_KEY) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateStockTakingResultAuditStatus(Long id, Integer bpmStatus, String reason) { |
| | | // 1. 校验任务存在 |
| | | MesWmStockTakingTaskDO task = stockTakingTaskMapper.selectById(id); |
| | | if (task == null) { |
| | | log.warn("[updateStockTakingResultAuditStatus] 盘点任务({}) 不存在,忽略 BPM 结果({})", id, bpmStatus); |
| | | return; |
| | | } |
| | | // 2. 仅处理「盘点中 + 结果审批待审核」的任务,避免重复 / 过期事件覆盖人工审核结果 |
| | | if (!MesWmStockTakingTaskStatusEnum.APPROVING.getStatus().equals(task.getStatus()) |
| | | || !isResultApprovalPending(task)) { |
| | | log.warn("[updateStockTakingResultAuditStatus] 盘点任务({}) 不处于结果审批中,忽略 BPM 结果({})", id, bpmStatus); |
| | | return; |
| | | } |
| | | if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) { |
| | | // 3.1 审批通过:置为已完成,再解冻库存并核销盘点差异(与 auditStockTakingResult 保持一致) |
| | | if (stockTakingTaskMapper.updateAuditStatusByBpm(id, |
| | | MesWmStockTakingTaskStatusEnum.FINISHED.getStatus(), reason) != 1) { |
| | | log.warn("[updateStockTakingResultAuditStatus] 盘点任务({}) 状态回写失败,忽略 BPM 结果({})", id, bpmStatus); |
| | | return; |
| | | } |
| | | if (Boolean.TRUE.equals(task.getFrozen())) { |
| | | updateMaterialStockFrozen(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id), false); |
| | | } |
| | | doProcessStockTakingDifference(task); |
| | | return; |
| | | } |
| | | if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus) |
| | | || BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) { |
| | | // 3.2 审批不通过 / 流程撤销:任务保持盘点中,清空提交标记以便重新提交结果审批 |
| | | if (stockTakingTaskMapper.resetResultApprovalByBpm(id, reason) != 1) { |
| | | log.warn("[updateStockTakingResultAuditStatus] 盘点任务({}) 状态回写失败,忽略 BPM 结果({})", id, bpmStatus); |
| | | } |
| | | return; |
| | | } |
| | | log.warn("[updateStockTakingResultAuditStatus] 忽略不支持的 BPM 状态({}),taskId={}", bpmStatus, id); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return task.getReviewerId() == null && task.getReviewTime() != null; |
| | | } |
| | | |
| | | @Override |
| | | public void validateResultApprovalNotPending(Long id) { |
| | | MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id); |
| | | if (isResultApprovalPending(task)) { |
| | | throw exception(WM_STOCK_TAKING_TASK_RESULT_APPROVAL_PENDING); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取用户昵称 |
| | | * |