1
1 天以前 8dfd55ef1c0eccf3adf105f0d4f5828bdbc3f86d
lsh#自动组托
1个文件已修改
75 ■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -1,14 +1,13 @@
package com.vincent.rsf.server.api.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.controller.erp.params.*;
@@ -17,34 +16,35 @@
import com.vincent.rsf.server.api.controller.erp.params.dto.WkOrderDto;
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.controller.dto.LocStockDto;
import com.vincent.rsf.server.manager.controller.params.PakinItem;
import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.service.impl.MatnrServiceImpl;
import com.vincent.rsf.server.manager.service.impl.WarehouseAreasItemServiceImpl;
import com.vincent.rsf.server.system.constant.DictTypeCode;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.entity.DictData;
import com.vincent.rsf.server.system.entity.DictType;
import com.vincent.rsf.server.system.entity.Fields;
import com.vincent.rsf.server.system.service.DictDataService;
import com.vincent.rsf.server.system.service.DictTypeService;
import com.vincent.rsf.server.system.service.FieldsService;
import com.vincent.rsf.server.system.service.impl.DictDataServiceImpl;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import com.vincent.rsf.server.api.service.ReceiveMsgService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static com.vincent.rsf.server.system.utils.SerialRuleUtils.objectToMap;
/**
 * @author Ryan
@@ -103,6 +103,10 @@
    private DictDataService dictDataService;
    @Autowired
    private DictTypeService dictTypeService;
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private WarehouseAreasItemServiceImpl warehouseAreasItemService;
    /**
@@ -458,12 +462,18 @@
                if (syncOrder.getType().equals(OrderType.ORDER_OUT.type)){
                    wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val);
                }
                if (!asnOrderService.save(wkOrder)) {
                    throw new CoolException("单据保存失败!!");
                }
                AtomicReference<String> palletId = new AtomicReference<>();
                syncOrder.getOrderItems().forEach(orderItem -> {
                    if (Cools.isEmpty(palletId.get())){
                        palletId.set(orderItem.getPalletId());
                    } else {
                        if (!palletId.get().equals(orderItem.getPalletId())){
                            throw new CoolException("同一个单据明细中的托盘码必须一致!!!");
                        }
                    }
                    Map<String, Object> map = new ObjectMapper().convertValue(orderItem, Map.class);
                    map.put("orderId", wkOrder.getId());
                    map.put("poId", wkOrder.getPoId());
@@ -490,11 +500,58 @@
                if (!asnOrderService.updateById(wkOrder)) {
                    throw new CoolException("计划收货数量修改失败!!");
                }
                // 立即触发异步任务,不等待结果
                if (!Cools.isEmpty(palletId.get()) && StringUtils.isNotBlank(syncOrder.getOrderNo()) && !Cools.isEmpty(syncOrder.getStationId())) {
                    //组托
                    WaitPakinParam pakinParam = new WaitPakinParam();
                    pakinParam.setBarcode(palletId.get());
                    CompletableFuture.runAsync(() -> {
                        try {
                            asyncMergeItemsWcs(pakinParam, syncOrder.getOrderNo(), loginUserId);
                        } catch (Exception e) {
                            log.warn("订单 {} 开始自动组托", syncOrder.getOrderNo());
                        }
                    });
                }
            });
        }
        return R.ok();
    }
    @Async
    public void asyncMergeItemsWcs(WaitPakinParam param, String orderNo, Long loginUserId) {
        try {
            int i = 0;
            while (true) {
                i++;
                if (i>5) return;
                Thread.sleep(3000);
                List<WarehouseAreasItem> list = warehouseAreasItemService.list(new LambdaQueryWrapper<WarehouseAreasItem>()
                        .eq(WarehouseAreasItem::getAsnCode, orderNo));
                if (list.isEmpty()) {
                    log.warn("订单 {} 没有找到库区项目,跳过组托", orderNo);
                    continue;
                }
                List<PakinItem> itemList = list.stream().map(item -> {
                    PakinItem pakinItem = new PakinItem();
                    pakinItem.setAsnCode(item.getAsnCode());
                    pakinItem.setId(item.getId());
                    pakinItem.setMatnrId(item.getMatnrId());
                    pakinItem.setReceiptQty(item.getAnfme());
                    return pakinItem;
                }).collect(Collectors.toList());
                param.setItems(itemList);
                break;
            }
            waitPakinService.mergeItemsWcs(param, loginUserId);
            log.info("订单 {} 自动组托完成,共处理 {} 个项目", orderNo, param.getItems().size());
        } catch (Exception e) {
            log.error("订单 {} 自动组托失败: {}", orderNo, e.getMessage(), e);
        }
    }
    /**
     * @author Ryan
     * @date 2025/8/19