自动化立体仓库 - WMS系统
*
L
12 小时以前 d7586e563701a4cb65065be3c4c3e4e66220222d
src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java
@@ -40,6 +40,7 @@
//            log.info("未有新订单");
            return;
        }
        //遍历单据
        for (String orderNo : orderNos) {
            List<OrderDetl> orderDetls = orderDetlService.selectByOrderNo(orderNo);
@@ -50,8 +51,22 @@
            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){
@@ -59,27 +74,34 @@
                    OrderToLine.MatList matMix = new OrderToLine.MatList(
                            orderDetl.getMatnr(),  // matnr -> sku
                            orderDetl.getSupp(),  //  supp -> po
                            remainder,          //    余料 -> 剩余余料统一时间戳标记
                            orderDetl.getBarcode(),   //barcode -> upc 条码
                            orderDetl.getAnfme(),          //    余料 -> 剩余余料统一时间戳标记
                            orderDetl.getSku(),   //barcode -> upc 条码
                            1,
                            orderDetl.getOrigin(),   //origin -> supplier 货源
                            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);
                }
                Double ctns = anfme - remainder;
                // 组装物料信息
                OrderToLine.MatList mat = new OrderToLine.MatList(
                        orderDetl.getMatnr(),  // matnr -> sku
                        orderDetl.getSupp(),  //  supp -> po
                        ctns,          //整料
                        orderDetl.getBarcode(),   //barcode -> upc
                        1,
                        orderDetl.getOrigin(),   //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);
@@ -94,4 +116,51 @@
    }
    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()
        );
    }
}