10 天以前 2e84a447af471fe5ada907c28849838a6bc3a340
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkOrderServiceImpl.java
@@ -4,8 +4,6 @@
import cn.hutool.core.util.ObjUtil;
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.mes.controller.admin.pro.workorder.vo.MesProWorkOrderPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
@@ -18,7 +16,6 @@
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -39,13 +36,7 @@
 */
@Service
@Validated
@Slf4j
public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
    /**
     * BPM 生产工单审批流程标识
     */
    public static final String BPM_PROCESS_DEFINITION_KEY = "mes-pro-work-order-audit";
    @Resource
    private MesProWorkOrderMapper workOrderMapper;
@@ -60,9 +51,6 @@
    private MesWmBarcodeService barcodeService;
    @Resource
    private MesProTaskService taskService;
    @Resource
    private BpmProcessInstanceApi bpmProcessInstanceApi;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -260,69 +248,6 @@
    @Override
    public Long getWorkOrderCountByVendorId(Long vendorId) {
        return workOrderMapper.selectCountByVendorId(vendorId);
    }
    // ==================== BPM 流程审批 ====================
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitWorkOrder(Long id, Long userId) {
        // 1. 校验工单处于草稿状态
        MesProWorkOrderDO workOrder = validateWorkOrderExists(id);
        if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) {
            throw exception(PRO_WORK_ORDER_SUBMIT_FAIL_NOT_PREPARE);
        }
        // 2. 创建生产工单审批流程实例
        String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
                .setProcessDefinitionKey(BPM_PROCESS_DEFINITION_KEY)
                .setBusinessKey(String.valueOf(id)));
        // 3. 更新工单工作流编号、状态为审批中
        workOrderMapper.updateById(new MesProWorkOrderDO()
                .setId(id)
                .setProcessInstanceId(processInstanceId)
                .setStatus(MesProWorkOrderStatusEnum.AUDITING.getStatus()));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateWorkOrderAuditStatus(Long id, Integer bpmResult) {
        // 1. 校验工单存在
        MesProWorkOrderDO workOrder = validateWorkOrderExists(id);
        // 2. 校验工单处于审批中
        if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.AUDITING.getStatus())) {
            log.error("[updateWorkOrderAuditStatus][workOrder({}) 不处于审批中,无法更新审批结果({})]",
                    workOrder.getId(), bpmResult);
            throw exception(PRO_WORK_ORDER_UPDATE_AUDIT_STATUS_FAIL_NOT_AUDITING);
        }
        // 3. 更新工单审批结果
        Integer auditStatus = convertBpmResultToWorkOrderStatus(bpmResult);
        workOrderMapper.updateById(new MesProWorkOrderDO()
                .setId(id)
                .setStatus(auditStatus));
    }
    /**
     * 将 BPM 审批结果转换为 MES 工单状态
     *
     * @param bpmResult BPM 审批结果
     * @return MES 工单状态
     */
    private Integer convertBpmResultToWorkOrderStatus(Integer bpmResult) {
        // BPM 审批结果:2=通过,3=不通过,4=已取消
        if (bpmResult == 2) {
            return MesProWorkOrderStatusEnum.CONFIRMED.getStatus();
        } else if (bpmResult == 3) {
            return MesProWorkOrderStatusEnum.REJECTED.getStatus();
        } else if (bpmResult == 4) {
            return MesProWorkOrderStatusEnum.PREPARE.getStatus();
        } else {
            log.warn("[convertBpmResultToWorkOrderStatus][未知的 BPM 审批结果({})]", bpmResult);
            return MesProWorkOrderStatusEnum.AUDITING.getStatus();
        }
    }
}