| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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")); |
| | | } |
| | | |
| | | } |