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;
|
}
|
|
}
|