liu
2026-10-23 5421b8af862890dcf187c2ad5ece55423959ba85
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
@@ -5,6 +5,9 @@
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;
@@ -62,8 +65,16 @@
     */
    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;
@@ -219,6 +230,50 @@
        // 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