liyong
5 天以前 be5783c8a7e13bbc76d33c95643d75779cce21db
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/listener/ErpSaleOrderStatusListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
package cn.iocoder.yudao.module.erp.service.sale.listener;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.yudao.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.sale.ErpSaleOrderMapper;
import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
import cn.iocoder.yudao.module.mes.api.mps.MesProMpsApi;
import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsCreateReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
 * é”€å”®è®¢å•审批状态监听器
 *
 * ç›‘听 BPM æµç¨‹å®žä¾‹çŠ¶æ€å˜æ›´äº‹ä»¶ï¼Œå®¡æ ¸é€šè¿‡æ—¶è‡ªåŠ¨åˆ›å»º MPS
 *
 * @author èŠ‹é“æºç 
 */
@Component
@Slf4j
public class ErpSaleOrderStatusListener extends cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEventListener {
    /**
     * é”€å”®è®¢å•审批流程定义 Key
     */
    private static final String PROCESS_DEFINITION_KEY = "sale_order_approve";
    @Resource
    private ErpSaleOrderMapper saleOrderMapper;
    @Resource
    private ErpSaleOrderItemMapper saleOrderItemMapper;
    @Resource
    private MesProMpsApi mpsApi;
    @Resource
    private MdmItemApi mdmItemApi;
    @Override
    protected String getProcessDefinitionKey() {
        return PROCESS_DEFINITION_KEY;
    }
    @Override
    protected void onEvent(BpmProcessInstanceStatusEvent event) {
        Long orderId;
        try {
            orderId = Long.parseLong(event.getBusinessKey());
        } catch (NumberFormatException e) {
            log.warn("[onEvent] businessKey({}) ä¸æ˜¯æœ‰æ•ˆçš„销售订单编号", event.getBusinessKey());
            return;
        }
        log.info("[onEvent] æ”¶åˆ° BPM å®¡æ‰¹äº‹ä»¶ï¼ŒorderId={}, status={}", orderId, event.getStatus());
        // åªæœ‰å®¡æ‰¹é€šè¿‡æ‰åˆ›å»º MPS
        if (!BpmTaskStatusEnum.APPROVE.getStatus().equals(event.getStatus())) {
            return;
        }
        try {
            // 1. èŽ·å–é”€å”®è®¢å•
            ErpSaleOrderDO saleOrder = saleOrderMapper.selectById(orderId);
            if (saleOrder == null) {
                log.warn("[onEvent] é”€å”®è®¢å•不存在,orderId={}", orderId);
                return;
            }
            // 2. èŽ·å–é”€å”®è®¢å•æ˜Žç»†
            List<ErpSaleOrderItemDO> items = saleOrderItemMapper.selectListByOrderId(orderId);
            if (CollUtil.isEmpty(items)) {
                log.info("[onEvent] é”€å”®è®¢å•({}) æ²¡æœ‰æ˜Žç»†ï¼Œæ— éœ€åˆ›å»º MPS", orderId);
                return;
            }
            // 3. æ›´æ–°è®¢å•状态为已审核
            saleOrderMapper.updateById(new ErpSaleOrderDO()
                    .setId(orderId)
                    .setStatus(ErpAuditStatus.APPROVE.getStatus()));
            // 4. éåŽ†æ˜Žç»†ï¼Œä¸ºéœ€è¦ç”Ÿäº§çš„æ˜Žç»†åˆ›å»º MPS
            int mpsCount = 0;
            for (ErpSaleOrderItemDO item : items) {
                if (item.getNeedProduction() == null || item.getNeedProduction() != 1) {
                    continue;
                }
                try {
                    Long mpsId = createMpsForSaleOrderItem(saleOrder, item);
                    if (mpsId != null) {
                        mpsCount++;
                        // æ›´æ–°é”€å”®è®¢å•明细的 MPS å…³è”
                        saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
                                .setId(item.getId())
                                .setMpsId(mpsId));
                    }
                } catch (Exception e) {
                    log.error("[onEvent] åˆ›å»º MPS å¤±è´¥ï¼ŒsaleOrderItemId={}", item.getId(), e);
                }
            }
            log.info("[onEvent] é”€å”®è®¢å•({}) å®¡æ‰¹å®Œæˆï¼Œåˆ›å»º MPS {} æ¡", orderId, mpsCount);
        } catch (Exception e) {
            log.error("[onEvent] å¤„理销售订单审批事件失败,orderId={}", orderId, e);
        }
    }
    /**
     * ä¸ºé”€å”®è®¢å•明细创建 MPS
     *
     * æ³¨æ„ï¼šé”€å”®è®¢å•明细的 productId æ˜¯ MDM ç‰©æ–™ ID,需要映射到 MES äº§å“
     */
    private Long createMpsForSaleOrderItem(ErpSaleOrderDO saleOrder, ErpSaleOrderItemDO item) {
        // èŽ·å– MDM ç‰©æ–™ä¿¡æ¯ï¼ˆç”¨äºŽèŽ·å–äº§å“åç§°ï¼‰
        String productName = null;
        try {
            MdmItemRespDTO mdmItem = mdmItemApi.getItem(item.getProductId()).getCheckedData();
            if (mdmItem != null) {
                productName = mdmItem.getName();
            }
        } catch (Exception e) {
            log.warn("[createMpsForSaleOrderItem] èŽ·å– MDM ç‰©æ–™ä¿¡æ¯å¤±è´¥ï¼ŒproductId={}", item.getProductId(), e);
        }
        MesProMpsCreateReqDTO createReqDTO = new MesProMpsCreateReqDTO();
        createReqDTO.setSaleOrderId(saleOrder.getId());
        createReqDTO.setSaleOrderNo(saleOrder.getNo());
        createReqDTO.setSaleOrderItemId(item.getId());
        createReqDTO.setMdmItemId(item.getProductId()); // é”€å”®è®¢å•明细的 productId æ˜¯ MDM ç‰©æ–™ ID
        createReqDTO.setProductName(productName); // äº§å“åç§°ç”¨äºŽé”™è¯¯æç¤º
        createReqDTO.setQuantity(item.getCount());
        createReqDTO.setClientId(saleOrder.getCustomerId());
        createReqDTO.setRequestDate(formatRequestDate(saleOrder.getOrderTime()));
        createReqDTO.setRemark("自动生成,来自销售订单:" + saleOrder.getNo());
        Long mpsId = mpsApi.createMps(createReqDTO);
        log.info("[createMpsForSaleOrderItem] MPS åˆ›å»ºæˆåŠŸï¼ŒmpsId={}, saleOrderItemId={}", mpsId, item.getId());
        return mpsId;
    }
    /**
     * æ ¼å¼åŒ–需求日期
     */
    private String formatRequestDate(LocalDateTime dateTime) {
        if (dateTime == null) {
            return null;
        }
        return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}