From 5099dfcf8e015c35a2f81986101e08e93a7d7944 Mon Sep 17 00:00:00 2001 From: L <L@123> Date: 星期一, 13 十月 2025 17:09:01 +0800 Subject: [PATCH] * --- src/main/java/com/zy/asrs/utils/GroupedLockerOptimizerUtils.java | 84 ++++---- src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java | 25 ++ src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java | 10 src/main/java/com/zy/asrs/utils/OptimizedLockerPackingUtils.java | 442 ++++++++++++++++++++++++++++++++++++++++++++ src/main/java/com/zy/asrs/utils/ToSortLineUtils.java | 30 ++ 5 files changed, 543 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java b/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java index 092ced5..c01130e 100644 --- a/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java +++ b/src/main/java/com/zy/asrs/task/OrderToSortLineScheduler.java @@ -13,6 +13,7 @@ import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OrderToLineHandler; import com.zy.asrs.utils.GroupedLockerOptimizerUtils; +import com.zy.asrs.utils.OptimizedLockerPackingUtils; import com.zy.asrs.utils.ToSortLineUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -50,7 +51,8 @@ for (String orderNo : orderNos) { try{ List<OrderDetl> orderDetls = orderDetlService.selectByOrderNo(orderNo); - List<GroupedLockerOptimizerUtils.Item> items = new ArrayList<>(); +// List<GroupedLockerOptimizerUtils.Item> items = new ArrayList<>(); + List<OptimizedLockerPackingUtils.Item> items = new ArrayList<>(); for (OrderDetl orderDetl:orderDetls){ Integer number = basArmRulesService.getNumber(orderDetl.getWeight(),orderDetl.getVolume(),orderDetl.getManLength(),orderDetl.getWidth(),orderDetl.getHeight()); if (number == null) { @@ -67,13 +69,15 @@ String name = ToSortLineUtils.MergerParameter(orderDetl.getMatnr(),orderDetl.getStandby1(),orderDetl.getStandby2()); int maxCapacity = number; int stock = orderDetl.getAnfme().intValue(); - items.add(new GroupedLockerOptimizerUtils.Item(name, maxCapacity, stock)); +// items.add(new GroupedLockerOptimizerUtils.Item(name, maxCapacity, stock)); + items.add(new OptimizedLockerPackingUtils.Item(name, maxCapacity, stock)); } OrderToLine orderToLine = new OrderToLine(); orderToLine.setOrderNo(orderNo); //鍗曟嵁缂栧彿 orderToLine.setCreateTime(System.currentTimeMillis()); //鍒涘缓鏃堕棿 - OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLine(items, orderToLine); +// OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLineGro(items, orderToLine); + OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLineOpt(items, orderToLine); try{ ReturnT<String> returnT = orderToLineHandler.start(orderToLineR); diff --git a/src/main/java/com/zy/asrs/utils/GroupedLockerOptimizerUtils.java b/src/main/java/com/zy/asrs/utils/GroupedLockerOptimizerUtils.java index 0512ba1..e09d705 100644 --- a/src/main/java/com/zy/asrs/utils/GroupedLockerOptimizerUtils.java +++ b/src/main/java/com/zy/asrs/utils/GroupedLockerOptimizerUtils.java @@ -28,6 +28,7 @@ static class Locker { int id; double remainingSpace; + long bindingTags; Map<String, Integer> contents; Set<String> itemTypes; // 褰撳墠鍌ㄧ墿鏌滀腑鐨勭墿鍝佺绫� @@ -36,6 +37,7 @@ this.remainingSpace = 1.0; this.contents = new HashMap<>(); this.itemTypes = new HashSet<>(); + this.bindingTags = System.currentTimeMillis(); } public boolean canAdd(Item item, int quantity) { @@ -122,60 +124,60 @@ } } -// public static void main(String[] args) { -// Scanner scanner = new Scanner(System.in); -// -// System.out.println("璇疯緭鍏ョ墿鍝佺绫绘暟閲�:"); -// int itemTypes = scanner.nextInt(); -// scanner.nextLine(); -// -// List<Item> items = new ArrayList<>(); -// -// for (int i = 0; i < itemTypes; i++) { -// System.out.println("\n璇疯緭鍏ョ" + (i + 1) + "绉嶇墿鍝佺殑淇℃伅:"); -// System.out.print("鐗╁搧鍚嶇О: "); -// String name = scanner.nextLine(); -// -// System.out.print("鍗曠瀛樻斁鏈�澶ф暟閲�: "); -// int maxCapacity = scanner.nextInt(); -// -// System.out.print("搴撳瓨鏁伴噺: "); -// int stock = scanner.nextInt(); -// scanner.nextLine(); -// -// items.add(new Item(name, maxCapacity, stock)); -// } -// -// // 浣跨敤鍒嗙粍浼樺厛绠楁硶 -// PackingSolution solution = packItemsWithGrouping(items); -// -// System.out.println("\n" + solution); -// -// scanner.close(); -// } public static void main(String[] args) { - int itemTypes = 5; + Scanner scanner = new Scanner(System.in); + + System.out.println("璇疯緭鍏ョ墿鍝佺绫绘暟閲�:"); + int itemTypes = scanner.nextInt(); + scanner.nextLine(); List<Item> items = new ArrayList<>(); for (int i = 0; i < itemTypes; i++) { - String name = i+"a"; - int maxCapacity = i*10; - int stock = i*11; + System.out.println("\n璇疯緭鍏ョ" + (i + 1) + "绉嶇墿鍝佺殑淇℃伅:"); + System.out.print("鐗╁搧鍚嶇О: "); + String name = scanner.nextLine(); + + System.out.print("鍗曠瀛樻斁鏈�澶ф暟閲�: "); + int maxCapacity = scanner.nextInt(); + + System.out.print("搴撳瓨鏁伴噺: "); + int stock = scanner.nextInt(); + scanner.nextLine(); + items.add(new Item(name, maxCapacity, stock)); } // 浣跨敤鍒嗙粍浼樺厛绠楁硶 PackingSolution solution = packItemsWithGrouping(items); - for (Locker locker:solution.lockers) { - for (String mantnr : locker.contents.keySet()){ - System.out.println(mantnr+"<===>"+locker.contents.get(mantnr)); - } - } + System.out.println("\n" + solution); -// scanner.close(); + scanner.close(); } +// public static void main(String[] args) { +// int itemTypes = 5; +// +// List<Item> items = new ArrayList<>(); +// +// for (int i = 0; i < itemTypes; i++) { +// String name = i+"a"; +// int maxCapacity = i*10; +// int stock = i*11; +// items.add(new Item(name, maxCapacity, stock)); +// } +// +// // 浣跨敤鍒嗙粍浼樺厛绠楁硶 +// PackingSolution solution = packItemsWithGrouping(items); +// for (Locker locker:solution.lockers) { +// for (String mantnr : locker.contents.keySet()){ +// System.out.println(mantnr+"<===>"+locker.contents.get(mantnr)); +// } +// } +// System.out.println("\n" + solution); +// +//// scanner.close(); +// } /** * 鍒嗙粍浼樺厛瑁呯绠楁硶 diff --git a/src/main/java/com/zy/asrs/utils/OptimizedLockerPackingUtils.java b/src/main/java/com/zy/asrs/utils/OptimizedLockerPackingUtils.java new file mode 100644 index 0000000..806fd5d --- /dev/null +++ b/src/main/java/com/zy/asrs/utils/OptimizedLockerPackingUtils.java @@ -0,0 +1,442 @@ +package com.zy.asrs.utils; + +import java.util.*; + +public class OptimizedLockerPackingUtils { + + public static class Item { + String name; + double unitSpace; + int maxCapacity; + int stock; + int remaining; + + public Item(String name, int maxCapacity, int stock) { + this.name = name; + this.maxCapacity = maxCapacity; + this.unitSpace = 1.0 / maxCapacity; + this.stock = stock; + this.remaining = stock; + } + + @Override + public String toString() { + return name + "(鍗曟斁" + maxCapacity + "涓�, 搴撳瓨" + stock + "涓�)"; + } + } + + static class Locker { + int id; + double remainingSpace; + long bindingTags; + Map<String, Integer> contents; + Set<String> itemTypes; + + public Locker(int id) { + this.id = id; + this.remainingSpace = 1.0; + this.contents = new HashMap<>(); + this.itemTypes = new HashSet<>(); + this.bindingTags = System.currentTimeMillis(); + + } + + public boolean canAdd(Item item, int quantity) { + return remainingSpace >= quantity * item.unitSpace; + } + + public void addItem(Item item, int quantity) { + double spaceUsed = quantity * item.unitSpace; + remainingSpace -= spaceUsed; + contents.put(item.name, contents.getOrDefault(item.name, 0) + quantity); + itemTypes.add(item.name); + item.remaining -= quantity; + } + + public boolean containsItemType(String itemName) { + return itemTypes.contains(itemName); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("鍌ㄧ墿鏌�").append(id).append(": "); + sb.append(String.format("鍓╀綑绌洪棿%.4f", remainingSpace)).append("\n"); + for (Map.Entry<String, Integer> entry : contents.entrySet()) { + sb.append(" ").append(entry.getKey()).append(": ").append(entry.getValue()).append("涓猏n"); + } + return sb.toString(); + } + } + + static class PackingSolution { + List<Locker> lockers; + int totalLockersUsed; + double overallUtilization; + int itemTypeChanges; + int pureLockers; // 绾绫诲偍鐗╂煖鏁伴噺 + + public PackingSolution() { + this.lockers = new ArrayList<>(); + } + + public void addLocker(Locker locker) { + lockers.add(locker); + totalLockersUsed = lockers.size(); + } + + public void calculateMetrics() { + double totalUsedSpace = 0; + itemTypeChanges = 0; + pureLockers = 0; + String lastItemType = null; + + for (Locker locker : lockers) { + totalUsedSpace += (1.0 - locker.remainingSpace); + + // 缁熻绾绫诲偍鐗╂煖 + if (locker.itemTypes.size() == 1) { + pureLockers++; + } + + for (String itemType : locker.itemTypes) { + if (lastItemType != null && !lastItemType.equals(itemType)) { + itemTypeChanges++; + } + lastItemType = itemType; + } + } + + overallUtilization = totalUsedSpace / totalLockersUsed; + } + + @Override + public String toString() { + calculateMetrics(); + StringBuilder sb = new StringBuilder(); + sb.append("=== 浼樺寲鎽嗘斁鏂规 ===\n"); + sb.append("浣跨敤鐨勫偍鐗╂煖鏁伴噺: ").append(totalLockersUsed).append("涓猏n"); + sb.append("绾绫诲偍鐗╂煖: ").append(pureLockers).append("涓猏n"); + sb.append("骞冲潎绌洪棿鍒╃敤鐜�: ").append(String.format("%.2f", overallUtilization * 100)).append("%\n"); + sb.append("鐗╁搧绉嶇被鍒囨崲娆℃暟: ").append(itemTypeChanges).append("娆n\n"); + + // 鍏堟樉绀虹函绉嶇被鍌ㄧ墿鏌滐紝鍐嶆樉绀烘贩鍚堝偍鐗╂煖 + List<Locker> pureLockersList = new ArrayList<>(); + List<Locker> mixedLockersList = new ArrayList<>(); + + for (Locker locker : lockers) { + if (locker.itemTypes.size() == 1) { + pureLockersList.add(locker); + } else { + mixedLockersList.add(locker); + } + } + + sb.append("銆愮函绉嶇被鍌ㄧ墿鏌溿��:\n"); + for (Locker locker : pureLockersList) { + sb.append(locker.toString()).append("\n"); + } + + sb.append("銆愭贩鍚堝偍鐗╂煖銆�:\n"); + for (Locker locker : mixedLockersList) { + sb.append(locker.toString()).append("\n"); + } + + return sb.toString(); + } + } + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("璇疯緭鍏ョ墿鍝佺绫绘暟閲�:"); + int itemTypes = scanner.nextInt(); + scanner.nextLine(); + + List<Item> items = new ArrayList<>(); + + for (int i = 0; i < itemTypes; i++) { + System.out.println("\n璇疯緭鍏ョ" + (i + 1) + "绉嶇墿鍝佺殑淇℃伅:"); + System.out.print("鐗╁搧鍚嶇О: "); + String name = scanner.nextLine(); + + System.out.print("鍗曠瀛樻斁鏈�澶ф暟閲�: "); + int maxCapacity = scanner.nextInt(); + + System.out.print("搴撳瓨鏁伴噺: "); + int stock = scanner.nextInt(); + scanner.nextLine(); + + items.add(new Item(name, maxCapacity, stock)); + } + + PackingSolution solution = optimizedPacking(items); + System.out.println("\n" + solution); + + scanner.close(); + } + + /** + * 浼樺寲瑁呯绠楁硶锛氬厛闆嗕腑澶勭悊鍚岀鐗╁搧锛屾渶鍚庡鐞嗕綑鏂� + */ + public static PackingSolution optimizedPacking(List<Item> items) { + List<Item> itemsToPack = new ArrayList<>(); + for (Item item : items) { + itemsToPack.add(new Item(item.name, item.maxCapacity, item.stock)); + } + + PackingSolution solution = new PackingSolution(); + int lockerId = 1; + + // 绗竴闃舵锛氬姣忕鐗╁搧杩涜闆嗕腑澶勭悊 + for (Item item : itemsToPack) { + if (item.remaining == 0) continue; + + // 璁$畻杩欑鐗╁搧闇�瑕佸灏戜釜瀹屾暣鐨勫偍鐗╂煖 + int fullLockersNeeded = item.remaining / item.maxCapacity; + int remainder = item.remaining % item.maxCapacity; + + // 鍒嗛厤瀹屾暣鍌ㄧ墿鏌� + for (int i = 0; i < fullLockersNeeded; i++) { + Locker locker = new Locker(lockerId++); + locker.addItem(item, item.maxCapacity); + solution.addLocker(locker); + } + + // 濡傛灉鏈変綑鏂欙紝鏆傛椂淇濈暀锛堢浜岄樁娈靛鐞嗭級 + } + + // 绗簩闃舵锛氭敹闆嗘墍鏈変綑鏂� + List<Item> remainingItems = new ArrayList<>(); + for (Item item : itemsToPack) { + if (item.remaining > 0) { + remainingItems.add(item); + } + } + + // 濡傛灉杩樻湁浣欐枡锛岀敤鏈�浣抽�傚簲绠楁硶澶勭悊 + if (!remainingItems.isEmpty()) { + processRemainingItems(remainingItems, solution, lockerId); + } + + return solution; + } + + /** + * 澶勭悊鍓╀綑鐗╁搧锛堜綑鏂欙級 + */ + private static void processRemainingItems(List<Item> remainingItems, PackingSolution solution, int startLockerId) { + int lockerId = startLockerId; + + // 鎸夌┖闂村崰鐢ㄤ粠澶у埌灏忔帓搴忥紙浼樺厛澶勭悊澶х墿鍝侊級 + remainingItems.sort((a, b) -> Double.compare(b.unitSpace, a.unitSpace)); + + for (Item item : remainingItems) { + while (item.remaining > 0) { + // 浼樺厛灏濊瘯鏀惧叆宸叉湁鍚岀鐗╁搧鐨勫偍鐗╂煖 + Locker sameTypeLocker = findSameTypeLocker(solution, item); + if (sameTypeLocker != null) { + int maxCanAdd = (int) Math.floor(sameTypeLocker.remainingSpace / item.unitSpace); + int actualAdd = Math.min(item.remaining, maxCanAdd); + sameTypeLocker.addItem(item, actualAdd); + continue; + } + + // 鍏舵灏濊瘯鏀惧叆鐜版湁鍌ㄧ墿鏌滐紙鏈�浣抽�傚簲锛� + Locker bestLocker = findBestLocker(solution, item); + if (bestLocker != null) { + int maxCanAdd = (int) Math.floor(bestLocker.remainingSpace / item.unitSpace); + int actualAdd = Math.min(item.remaining, maxCanAdd); + bestLocker.addItem(item, actualAdd); + continue; + } + + // 鏈�鍚庡垱寤烘柊鍌ㄧ墿鏌� + Locker newLocker = new Locker(lockerId++); + int maxCanAdd = (int) Math.floor(1.0 / item.unitSpace); + int actualAdd = Math.min(item.remaining, maxCanAdd); + newLocker.addItem(item, actualAdd); + solution.addLocker(newLocker); + } + } + } + + /** + * 瀵绘壘宸叉湁鍚岀鐗╁搧鐨勫偍鐗╂煖 + */ + private static Locker findSameTypeLocker(PackingSolution solution, Item item) { + Locker bestLocker = null; + double bestRemaining = -1; + + for (Locker locker : solution.lockers) { + if (locker.containsItemType(item.name) && locker.canAdd(item, 1)) { + if (locker.remainingSpace > bestRemaining) { + bestLocker = locker; + bestRemaining = locker.remainingSpace; + } + } + } + + return bestLocker; + } + + /** + * 瀵绘壘鏈�浣抽�傚簲鐨勫偍鐗╂煖 + */ + private static Locker findBestLocker(PackingSolution solution, Item item) { + Locker bestLocker = null; + double bestRemaining = Double.MAX_VALUE; + + for (Locker locker : solution.lockers) { + if (locker.canAdd(item, 1) && locker.remainingSpace < bestRemaining) { + bestLocker = locker; + bestRemaining = locker.remainingSpace; + } + } + + return bestLocker; + } + + /** + * 楂樼骇浼樺寲锛氭櫤鑳戒綑鏂欏垎閰� + */ + public static PackingSolution advancedOptimizedPacking(List<Item> items) { + List<Item> itemsToPack = new ArrayList<>(); + for (Item item : items) { + itemsToPack.add(new Item(item.name, item.maxCapacity, item.stock)); + } + + PackingSolution solution = new PackingSolution(); + int lockerId = 1; + + // 绗竴闃舵锛氶泦涓鐞嗘瘡绉嶇墿鍝� + Map<String, Integer> remainders = new HashMap<>(); + + for (Item item : itemsToPack) { + if (item.remaining == 0) continue; + + int fullLockers = item.remaining / item.maxCapacity; + int remainder = item.remaining % item.maxCapacity; + + for (int i = 0; i < fullLockers; i++) { + Locker locker = new Locker(lockerId++); + locker.addItem(item, item.maxCapacity); + solution.addLocker(locker); + } + + if (remainder > 0) { + remainders.put(item.name, remainder); + } + } + + // 绗簩闃舵锛氭櫤鑳戒綑鏂欏垎閰� + if (!remainders.isEmpty()) { + smartRemainderProcessing(remainders, itemsToPack, solution, lockerId); + } + + return solution; + } + + /** + * 鏅鸿兘浣欐枡澶勭悊锛氬皾璇曞皢浣欐枡缁勫悎鎴愬畬鏁村偍鐗╂煖 + */ + private static void smartRemainderProcessing(Map<String, Integer> remainders, + List<Item> items, + PackingSolution solution, + int startLockerId) { + int lockerId = startLockerId; + + // 灏濊瘯鎵惧埌鍙互瀹岀編缁勫悎鐨勪綑鏂� + boolean foundCombination; + do { + foundCombination = false; + + // 瀵绘壘鍙互濉弧涓�涓偍鐗╂煖鐨勪綑鏂欑粍鍚� + for (Item item1 : items) { + if (remainders.getOrDefault(item1.name, 0) == 0) continue; + + for (Item item2 : items) { + if (item1.name.equals(item2.name) || remainders.getOrDefault(item2.name, 0) == 0) continue; + + double spaceNeeded = remainders.get(item1.name) * item1.unitSpace + + remainders.get(item2.name) * item2.unitSpace; + + if (spaceNeeded <= 1.0 + 1e-6) { // 鑰冭檻娴偣璇樊 + Locker locker = new Locker(lockerId++); + locker.addItem(item1, remainders.get(item1.name)); + locker.addItem(item2, remainders.get(item2.name)); + solution.addLocker(locker); + + remainders.put(item1.name, 0); + remainders.put(item2.name, 0); + foundCombination = true; + break; + } + } + if (foundCombination) break; + } + } while (foundCombination); + + // 澶勭悊鍓╀綑鐨勯浂鏁d綑鏂� + for (Item item : items) { + int remainder = remainders.getOrDefault(item.name, 0); + if (remainder > 0) { + Locker bestLocker = findBestLockerForRemainder(solution, item, remainder); + if (bestLocker != null) { + bestLocker.addItem(item, remainder); + } else { + Locker newLocker = new Locker(lockerId++); + newLocker.addItem(item, remainder); + solution.addLocker(newLocker); + } + } + } + } + + private static Locker findBestLockerForRemainder(PackingSolution solution, Item item, int quantity) { + Locker bestLocker = null; + double bestFit = Double.MAX_VALUE; + + for (Locker locker : solution.lockers) { + if (locker.canAdd(item, quantity)) { + double remainingAfterAdd = locker.remainingSpace - quantity * item.unitSpace; + if (remainingAfterAdd < bestFit) { + bestLocker = locker; + bestFit = remainingAfterAdd; + } + } + } + + return bestLocker; + } + + /** + * 鎬ц兘娴嬭瘯鍜屾瘮杈� + */ + public static void performanceTest() { + System.out.println("=== 鎬ц兘娴嬭瘯 ==="); + + // 娴嬭瘯鏁版嵁 + List<Item> testItems = Arrays.asList( + new Item("X", 20, 87), + new Item("Y", 15, 63), + new Item("Z", 34, 125), + new Item("T", 25, 48), + new Item("U", 40, 92) + ); + + System.out.println("娴嬭瘯鐗╁搧鏁伴噺: " + testItems.size()); + int totalItems = testItems.stream().mapToInt(item -> item.stock).sum(); + System.out.println("鎬荤墿鍝佹暟閲�: " + totalItems); + + long startTime = System.currentTimeMillis(); + PackingSolution solution = optimizedPacking(testItems); + long endTime = System.currentTimeMillis(); + + System.out.println("\n浼樺寲绠楁硶缁撴灉:"); + System.out.println("澶勭悊鏃堕棿: " + (endTime - startTime) + "ms"); + System.out.println("鍌ㄧ墿鏌滄暟閲�: " + solution.totalLockersUsed); + System.out.println("绾绫诲偍鐗╂煖: " + solution.pureLockers); + System.out.println("绌洪棿鍒╃敤鐜�: " + String.format("%.2f", solution.overallUtilization * 100) + "%"); + } +} \ No newline at end of file diff --git a/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java b/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java index 19ee586..7195635 100644 --- a/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java +++ b/src/main/java/com/zy/asrs/utils/ToSortLineUtils.java @@ -36,8 +36,7 @@ return sku+sign_F+po+sign_F+upc; } - public static OrderToLine GetOrderToLine(List<GroupedLockerOptimizerUtils.Item> items,OrderToLine orderToLine){ - Long bindingTag = System.currentTimeMillis();//娣锋惌鏍囪 + public static OrderToLine GetOrderToLineGro(List<GroupedLockerOptimizerUtils.Item> items,OrderToLine orderToLine){ List<OrderToLine.MatList> matLists = new ArrayList<>(); // 浣跨敤鍒嗙粍浼樺厛绠楁硶 GroupedLockerOptimizerUtils.PackingSolution solution = GroupedLockerOptimizerUtils.packItemsWithGrouping(items); @@ -52,11 +51,34 @@ split[2], //barcode -> upc -> s2 1, null, //origin -> supplier 璐ф簮 - bindingTag + locker.bindingTags ); matLists.add(mat); } - bindingTag++; + } + orderToLine.setMatList(matLists); + return orderToLine; + } + + public static OrderToLine GetOrderToLineOpt(List<OptimizedLockerPackingUtils.Item> items,OrderToLine orderToLine){ + List<OrderToLine.MatList> matLists = new ArrayList<>(); + // 浣跨敤鍒嗙粍浼樺厛绠楁硶 + OptimizedLockerPackingUtils.PackingSolution packingSolution = OptimizedLockerPackingUtils.optimizedPacking(items); + for (OptimizedLockerPackingUtils.Locker locker:packingSolution.lockers) { + for (String mantnr : locker.contents.keySet()){ + System.out.println(mantnr+"<===>"+locker.contents.get(mantnr)); + String[] split = mantnr.split(Pattern.quote(sign_F)); + OrderToLine.MatList mat = new OrderToLine.MatList( + split[0], // matnr -> sku + split[1], // supp -> po -> s1 + locker.contents.get(mantnr).doubleValue(), //鏁存枡 + split[2], //barcode -> upc -> s2 + 1, + null, //origin -> supplier 璐ф簮 + locker.bindingTags + ); + matLists.add(mat); + } } orderToLine.setMatList(matLists); return orderToLine; diff --git a/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java b/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java new file mode 100644 index 0000000..4ca44df --- /dev/null +++ b/src/main/java/com/zy/asrs/utils/param/ItemUtilParam.java @@ -0,0 +1,25 @@ +package com.zy.asrs.utils.param; + +import lombok.Data; + +@Data +public class ItemUtilParam { + String name; + double unitSpace; + int maxCapacity; + int stock; + int remaining; + + public ItemUtilParam(String name, int maxCapacity, int stock) { + this.name = name; + this.maxCapacity = maxCapacity; + this.unitSpace = 1.0 / maxCapacity; + this.stock = stock; + this.remaining = stock; + } + + @Override + public String toString() { + return name + "(鍗曟斁" + maxCapacity + "涓�, 搴撳瓨" + stock + "涓�)"; + } +} -- Gitblit v1.9.1