昨天 eccad5a129106377a275be4f7cdc58e99e9b95d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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<WmsWarehouseApprovalConfigDO> 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<BpmProcessDefinitionInfoDO> getAvailableProcessList(Long warehouseId, String bizType) {
        WmsWarehouseApprovalConfigDO config = getApprovalConfig(warehouseId, bizType);
        String categoryCode = config != null && StrUtil.isNotBlank(config.getCategoryCode())
                ? config.getCategoryCode() : DEFAULT_CATEGORY_CODE;
 
        // 查询分类下的流程定义
        List<BpmProcessDefinitionInfoDO> 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;
    }
 
}