自动化立体仓库 - WMS系统
*
L
16 小时以前 d7586e563701a4cb65065be3c4c3e4e66220222d
src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java
@@ -1,17 +1,166 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
import com.zy.asrs.entity.BasArmRules;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.OrderToLine;
import com.zy.asrs.service.BasArmRulesService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.service.impl.OrderDetlServiceImpl;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.OrderToLineHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
//订单下发至分拣线
public class OrderToSortLineScheduler {
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private BasArmRulesService basArmRulesService;
    @Autowired
    private OrderToLineHandler orderToLineHandler;
//    @Scheduled(cron = "0/3 * * * * ? ")
    @Scheduled(cron = "0/3 * * * * ? ")
    private void orderToSortLine() {
        //获取未下发单据
        List<String> orderNos = orderService.AllStatusSatisfyOrder(0);
        if(orderNos == null || orderNos.isEmpty()) {
//            log.info("未有新订单");
            return;
        }
        //遍历单据
        for (String orderNo : orderNos) {
            List<OrderDetl> orderDetls = orderDetlService.selectByOrderNo(orderNo);
            OrderToLine orderToLine = new OrderToLine();
            orderToLine.setOrderNo(orderNo);  //单据编号
            orderToLine.setCreateTime(System.currentTimeMillis());  //创建时间
            Long bindingTag = System.currentTimeMillis();//混搭标记
            List<OrderToLine.MatList> matLists = new ArrayList<>();
            List<OrderToLine.MatList> matListsRemainder = new ArrayList<>();
            List<OrderDetl> orderDetlsRemainder = new ArrayList<>();
            for (OrderDetl orderDetl : orderDetls) {
                Integer number =  basArmRulesService.getNumber(orderDetl.getWeight(),orderDetl.getVolume(),orderDetl.getManLength(),orderDetl.getWidth(),orderDetl.getHeight());
                if (number == null) {
                    BasArmRules basArmRules = new BasArmRules();
                    basArmRules.setMaterialHeight(orderDetl.getHeight());
                    basArmRules.setMaterialWeight(orderDetl.getWeight());
                    basArmRules.setMaterialLength(orderDetl.getManLength());
                    basArmRules.setMaterialWidth(orderDetl.getWidth());
                    basArmRulesService.insert(basArmRules);
                    return;
                } else if (number == 0){
                    return;
                }
                Double anfme = orderDetl.getAnfme();
                Double remainder = anfme % number;  //取余   余数混搭
                if(remainder != 0){
                    // 组装物料信息
                    OrderToLine.MatList matMix = new OrderToLine.MatList(
                            orderDetl.getMatnr(),  // matnr -> sku
                            orderDetl.getSupp(),  //  supp -> po
                            orderDetl.getAnfme(),          //    余料 -> 剩余余料统一时间戳标记
                            orderDetl.getSku(),   //barcode -> upc 条码
                            1,
                            null,   //origin -> supplier 货源
                            bindingTag        //余料标记相同
                    );
//                    matListsRemainder.add(matMix);
//                    orderDetlsRemainder.add(orderDetl);
                    matLists.add(matMix);
                } else {
                    Double ctns = anfme - remainder;
                    // 组装物料信息
                    OrderToLine.MatList mat = new OrderToLine.MatList(
                            orderDetl.getMatnr(),  // matnr -> sku
                            orderDetl.getSupp(),  //  supp -> po
                            orderDetl.getAnfme(),   //整料
                            orderDetl.getSku(),   //barcode -> upc
                            1,
                            null,   //origin -> supplier 货源
                            System.currentTimeMillis()
                    );
                    matLists.add(mat);
                }
            }
//            // 智能分组余料
//            if (matListsRemainder.size() > 0) {
//                groupRemainders(orderDetlsRemainder, orderDetlsRemainder.size(), orderDetls.size(), matLists);
//            }
            orderToLine.setMatList(matLists);
            try{
                ReturnT<String> returnT = orderToLineHandler.start(orderToLine);
                if (!returnT.isSuccess()) {
                    log.error("下发单据失败===>"+ JSON.toJSON(orderToLine));
                }
            } catch (Exception e){
                log.error("下发单据异常===>"+e.getMessage());
            }
        }
    }
    private void groupRemainders(List<OrderDetl> sameMaterialList, double totalRemainder,
                                 int number, List<OrderToLine.MatList> matLists) {
        // 策略1: 如果余料总量较大,尝试分成多个合理大小的组
        if (totalRemainder > number * 0.6) {
            // 可以分成2组或更多组
            int suggestedGroups = (int) Math.ceil(totalRemainder / (number * 0.8));
            distributeRemainders(sameMaterialList, totalRemainder, suggestedGroups, matLists);
        } else {
            // 小余料单组处理
            Long bindingTag = System.currentTimeMillis();
            matLists.add(createMatListItem(sameMaterialList.get(0), totalRemainder, bindingTag, true));
        }
    }
    private void distributeRemainders(List<OrderDetl> sameMaterialList, double totalRemainder,
                                      int groupCount, List<OrderToLine.MatList> matLists) {
        double average = totalRemainder / groupCount;
        for (int i = 0; i < groupCount; i++) {
            double groupQuantity;
            if (i == groupCount - 1) {
                // 最后一组取剩余所有
                groupQuantity = totalRemainder - (average * (groupCount - 1));
            } else {
                groupQuantity = average;
            }
            // 为每组生成唯一标记
            Long groupTag = System.currentTimeMillis() + i;
            matLists.add(createMatListItem(sameMaterialList.get(0), groupQuantity, groupTag, true));
        }
    }
    private OrderToLine.MatList createMatListItem(OrderDetl orderDetl, Double quantity, Long bindingTag, boolean isRemainder) {
        return new OrderToLine.MatList(
                orderDetl.getMatnr(),
                orderDetl.getSupp(),
                quantity,
                orderDetl.getBarcode(),
                1,
                isRemainder ? null : orderDetl.getOrigin(),
                isRemainder ? bindingTag : System.currentTimeMillis()
        );
    }
}