From a2f27094c3e8b16d49732621c10020ccd646034f Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Mon, 13 Nov 2023 16:10:22 +0100 Subject: [PATCH] Create a new method for finding adequate tubes and a main to test for regression --- .../domain/job/AddPortraitTubeJob.java | 235 +++++++++++++++++- 1 file changed, 232 insertions(+), 3 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddPortraitTubeJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddPortraitTubeJob.java index 37553a4ac..b89caf958 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddPortraitTubeJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddPortraitTubeJob.java @@ -35,12 +35,13 @@ public class AddPortraitTubeJob implements Job { private static final List DEFAULT_SHOPS = Arrays.asList("JCH3", "JCH4", "JCH5"); private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; + private static final String TUBE_30_SKU_SINGLE_DOUBLE = "PJ95310032-WIA"; private static final String TUBE_40_SKU_SINGLE = "PJ95430032-WIA"; private static final String TUBE_40_SKU_MULTIPLE = "PJ95430040-WIA"; private static final String TUBE_50_SKU_SINGLE = "PJ95530032-WIA"; private static final String TUBE_50_SKU_MULTIPLE = "PJ95530040-WIA"; - private static final List TUBE_SKUS = Arrays.asList(TUBE_50_SKU_MULTIPLE, TUBE_50_SKU_SINGLE, - TUBE_40_SKU_MULTIPLE, TUBE_40_SKU_SINGLE); + private static final List TUBE_SKUS = Arrays.asList(TUBE_30_SKU_SINGLE_DOUBLE, TUBE_50_SKU_MULTIPLE, + TUBE_50_SKU_SINGLE, TUBE_40_SKU_MULTIPLE, TUBE_40_SKU_SINGLE); private static final String PREFIX_50_CANVAS = "JJ2501"; private static final String PREFIX_40_CANVAS = "JJ2500"; private static final String PREFIX_30_CANVAS = "JJ2502"; @@ -153,7 +154,7 @@ public class AddPortraitTubeJob implements Job { * @param orderItems List of order items * @return Set of pairs */ - private Pair>, HashSet>> findCurrentAndAdequateTubes(List orderItems) { + private static Pair>, HashSet>> findCurrentAndAdequateTubes(List orderItems) { int canvas40Count = 0; int canvas50Count = 0; HashSet> currentTubes = new HashSet<>(); @@ -208,4 +209,232 @@ public class AddPortraitTubeJob implements Job { } return Pair.of(currentTubes, adequateTubes); } + + private static Pair>, HashSet>> newFindCurrentAndAdequateTubes(List orderItems) { + int canvas30Count = 0; + int canvas40Count = 0; + int canvas50Count = 0; + HashSet> currentTubes = new HashSet<>(); + HashSet> adequateTubes = new HashSet<>(); + for (OrderItem orderItem : orderItems) { + String sku = orderItem.getErpCode(); + int quantity = orderItem.getQuantity(); + if (TUBE_SKUS.contains(sku)) { + currentTubes.add(Pair.of(sku, quantity)); + } else if (sku.startsWith(PREFIX_50_CANVAS)) { + canvas50Count += quantity; + } else if (sku.startsWith(PREFIX_40_CANVAS)) { + canvas40Count += quantity; + } else if (sku.startsWith(PREFIX_30_CANVAS)) { + canvas30Count += quantity; + } + } + + int canvas30RemainderCount = canvas30Count % MAXIMUM_CANVAS_IN_TUBE.intValue(); + int canvas40RemainderCount = canvas40Count % MAXIMUM_CANVAS_IN_TUBE.intValue(); + int canvas50RemainderCount = canvas50Count % MAXIMUM_CANVAS_IN_TUBE.intValue(); + int totalRemainderCount = canvas30RemainderCount + canvas40RemainderCount + canvas50RemainderCount; + int tube50SingleCount = 0; + int tube50MultipleCount = (int) Math.floor(canvas50Count / MAXIMUM_CANVAS_IN_TUBE); + int tube40SingleCount = 0; + int tube40MultipleCount = (int) Math.floor(canvas40Count / MAXIMUM_CANVAS_IN_TUBE); + int tube30SingleDoubleCount = 0; + // 3 canvas of 30cm also go into 40 multiple tubes + tube40MultipleCount += (int) Math.floor(canvas30Count / MAXIMUM_CANVAS_IN_TUBE); + // When remaining 1 to 3 canvases + if (totalRemainderCount > 0 && totalRemainderCount < 4) { + if (canvas50RemainderCount > 0) { + // It only takes one 50cm canvas with any other canvas to impose the use of 50cm multiple tube + if (totalRemainderCount > 1) { + tube50MultipleCount++; + } else { + tube50SingleCount++; + } + } else { + if (totalRemainderCount > 1) { + tube40MultipleCount++; + } else { + if (canvas40RemainderCount > 0) { + tube40SingleCount++; + } else if (canvas30RemainderCount > 0){ + tube30SingleDoubleCount++; + } + } + } + } else if (totalRemainderCount >= 4) { + // When remaining 4 to 6 canvases, one 50cm canvas imposes one 50cm multiple tube + if (canvas50RemainderCount > 0) { + tube50MultipleCount++; + // If we have two 50cm canvases and a total of 5 of 6 canvases, then we have to use 2 50cm multiple tubes + if (totalRemainderCount > 4) { + tube50MultipleCount++; + } else { + // There's one remaining canvas, an adequate single tube suffices + if (canvas50RemainderCount > 1) { + tube50SingleCount++; + } else if (canvas40RemainderCount > 0) { + tube40SingleCount++; + } else if (canvas30RemainderCount > 0){ + tube30SingleDoubleCount++; + } + } + } else { + // No 50cm canvases means only one combination possible: two 40cm canvases and two 30cm canvases + tube40MultipleCount++; + tube30SingleDoubleCount++; + } + } + + if (tube50SingleCount > 0) { + adequateTubes.add(Pair.of(TUBE_50_SKU_SINGLE, tube50SingleCount)); + } + if (tube50MultipleCount > 0) { + adequateTubes.add(Pair.of(TUBE_50_SKU_MULTIPLE, tube50MultipleCount)); + } + if (tube40SingleCount > 0) { + adequateTubes.add(Pair.of(TUBE_40_SKU_SINGLE, tube40SingleCount)); + } + if (tube40MultipleCount > 0) { + adequateTubes.add(Pair.of(TUBE_40_SKU_MULTIPLE, tube40MultipleCount)); + } + if (tube30SingleDoubleCount > 0) { + adequateTubes.add(Pair.of(TUBE_30_SKU_SINGLE_DOUBLE, tube30SingleDoubleCount)); + } + return Pair.of(currentTubes, adequateTubes); + } + + public static void main(String[] args) { + List orderItems = buildOrderItems(1, 0); + compare(orderItems); + + orderItems = buildOrderItems(0, 1); + compare(orderItems); + + orderItems = buildOrderItems(1, 1); + compare(orderItems); + + orderItems = buildOrderItems(2, 0); + compare(orderItems); + + orderItems = buildOrderItems(0, 2); + compare(orderItems); + + orderItems = buildOrderItems(2, 1); + compare(orderItems); + + orderItems = buildOrderItems(1, 2); + compare(orderItems); + + orderItems = buildOrderItems(2, 2); + compare(orderItems); + + orderItems = buildOrderItems(3, 0); + compare(orderItems); + + orderItems = buildOrderItems(0, 3); + compare(orderItems); + + orderItems = buildOrderItems(3, 1); + compare(orderItems); + + orderItems = buildOrderItems(1, 3); + compare(orderItems); + + orderItems = buildOrderItems(3, 2); + compare(orderItems); + + orderItems = buildOrderItems(2, 3); + compare(orderItems); + + orderItems = buildOrderItems(3, 3); + compare(orderItems); + + orderItems = buildOrderItems(4, 0); + compare(orderItems); + + orderItems = buildOrderItems(0, 4); + compare(orderItems); + + orderItems = buildOrderItems(4, 1); + compare(orderItems); + + orderItems = buildOrderItems(1, 4); + compare(orderItems); + + orderItems = buildOrderItems(4, 2); + compare(orderItems); + + orderItems = buildOrderItems(2, 4); + compare(orderItems); + + orderItems = buildOrderItems(4, 3); + compare(orderItems); + + orderItems = buildOrderItems(3, 4); + compare(orderItems); + + orderItems = buildOrderItems(4, 4); + compare(orderItems); + + orderItems = buildOrderItems(5, 0); + compare(orderItems); + + orderItems = buildOrderItems(0, 5); + compare(orderItems); + + orderItems = buildOrderItems(5, 1); + compare(orderItems); + + orderItems = buildOrderItems(1, 5); + compare(orderItems); + + orderItems = buildOrderItems(5, 2); + compare(orderItems); + + orderItems = buildOrderItems(2, 5); + compare(orderItems); + + orderItems = buildOrderItems(5, 3); + compare(orderItems); + + orderItems = buildOrderItems(3, 5); + compare(orderItems); + + orderItems = buildOrderItems(5, 4); + compare(orderItems); + + orderItems = buildOrderItems(4, 5); + compare(orderItems); + + orderItems = buildOrderItems(5, 5); + compare(orderItems); + + } + + private static void compare(List orderItems) { + HashSet> tubesOldWay = findCurrentAndAdequateTubes(orderItems).getRight(); + HashSet> tubesNewWay = newFindCurrentAndAdequateTubes(orderItems).getRight(); + System.out.println("old way : " + tubesOldWay); + System.out.println("new way : " + tubesNewWay); + System.out.println(tubesOldWay.containsAll(tubesNewWay) && tubesNewWay.containsAll(tubesOldWay) ? "we're good" : "shit"); + } + + private static List buildOrderItems(Integer canvas40q, Integer canvas50q) { + List orderItems = new ArrayList<>(); + if (canvas40q != null) { + orderItems.add(buildOrderItem(PREFIX_40_CANVAS, canvas40q)); + } + if (canvas50q != null) { + orderItems.add(buildOrderItem(PREFIX_50_CANVAS, canvas50q)); + } + return orderItems; + } + + private static OrderItem buildOrderItem(String erpCode, Integer quantity) { + OrderItem orderItem = new OrderItem(); + orderItem.setErpCode(erpCode); + orderItem.setQuantity(quantity); + return orderItem; + } + }