package cn.iocoder.yudao.module.mes.service.wms.approval; import cn.hutool.core.util.StrUtil; 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.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum; import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.mes.dal.dataobject.wms.approval.WmsWarehouseApprovalConfigDO; import cn.iocoder.yudao.module.mes.dal.mysql.wms.approval.WmsWarehouseApprovalConfigMapper; 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; import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * WMS 审批服务实现类 */ @Service @Validated @Slf4j public class WmsApprovalServiceImpl implements WmsApprovalService { /** * 默认BPM分类编码 */ private static final String DEFAULT_CATEGORY_CODE = "wms_approve"; @Resource private WmsWarehouseApprovalConfigMapper approvalConfigMapper; @Resource private BpmCategoryService bpmCategoryService; @Resource private BpmProcessDefinitionService bpmProcessDefinitionService; @Resource private BpmProcessInstanceApi bpmProcessInstanceApi; @Override public WmsWarehouseApprovalConfigDO getApprovalConfig(Long warehouseId, String bizType) { return approvalConfigMapper.selectByWarehouseIdAndBizType(warehouseId, bizType); } @Override public List getApprovalConfigList(Long warehouseId) { return approvalConfigMapper.selectListByWarehouseId(warehouseId); } @Override public void saveApprovalConfig(WmsWarehouseApprovalConfigDO config) { // 检查是否已存在 WmsWarehouseApprovalConfigDO existing = getApprovalConfig(config.getWarehouseId(), config.getBizType()); if (existing == null) { approvalConfigMapper.insert(config); } else { config.setId(existing.getId()); approvalConfigMapper.updateById(config); } } @Override public boolean needApproval(Long warehouseId, String bizType) { WmsWarehouseApprovalConfigDO config = getApprovalConfig(warehouseId, bizType); return config != null && Boolean.TRUE.equals(config.getApprovalEnabled()); } @Override @Transactional(rollbackFor = Exception.class) public String submitApproval(Long orderId, String orderType, String processDefinitionKey, Long userId) { log.info("[submitApproval] 提交审批,orderId={}, orderType={}", orderId, orderType); // 注意:此方法需要根据实际业务场景实现 // 1. 获取单据信息和仓库ID(仓库ID在明细行中,需先查询明细) // 2. 获取审批配置 // 3. 创建流程实例 // 4. 更新单据的流程实例ID和状态 // 当前为简化实现,实际使用时需要补充完整逻辑 throw exception(WMS_APPROVAL_ORDER_TYPE_NOT_SUPPORTED); } @Override public List getAvailableProcessList(Long warehouseId, String bizType) { WmsWarehouseApprovalConfigDO config = getApprovalConfig(warehouseId, bizType); String categoryCode = config != null && StrUtil.isNotBlank(config.getCategoryCode()) ? config.getCategoryCode() : DEFAULT_CATEGORY_CODE; // 查询分类下的流程定义 List definitions = bpmProcessDefinitionService .getProcessDefinitionInfoListByCategory(categoryCode); if (definitions == null) { return Collections.emptyList(); } return definitions; } @Override @Transactional(rollbackFor = Exception.class) public void updateAuditStatus(Long orderId, String orderType, Integer bpmStatus) { log.info("[updateAuditStatus] 更新审批状态,orderId={}, orderType={}, bpmStatus={}", orderId, orderType, bpmStatus); // 将BPM状态转换为业务状态 Integer businessStatus = convertBpmResultToBusinessStatus(bpmStatus, orderType); if (businessStatus == null) { log.warn("[updateAuditStatus] 未知的BPM状态,bpmStatus={}", bpmStatus); return; } // 注意:此方法需要根据实际业务场景实现 // 当前为简化实现,实际使用时需要补充完整逻辑 throw exception(WMS_APPROVAL_ORDER_TYPE_NOT_SUPPORTED); } /** * 将BPM审批结果转换为业务状态 */ private Integer convertBpmResultToBusinessStatus(Integer bpmStatus, String orderType) { // 根据BPM审批结果返回对应状态 // APPROVE -> 已审批状态 // REJECT -> 草稿状态(让用户可以重新提交) // CANCEL -> 已取消状态 if (BpmTaskStatusEnum.APPROVE.getStatus().equals(bpmStatus)) { return 20; // APPROVED 状态 } else if (BpmTaskStatusEnum.REJECT.getStatus().equals(bpmStatus)) { return 0; // PREPARE 状态 } else if (BpmTaskStatusEnum.CANCEL.getStatus().equals(bpmStatus)) { return 40; // CANCELED 状态 } return null; } }