From 36c0df4e3d76a7a0487343578c08d26495bfff09 Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Wed, 4 Sep 2024 17:08:31 +0200 Subject: [PATCH 1/5] Create model and service for GiftRules --- .../modules/business/entity/GiftRule.java | 15 ++++++++ .../business/mapper/GiftRulesMapper.java | 19 +++++++++++ .../business/mapper/xml/GiftRulesMapper.xml | 16 +++++++++ .../business/service/IGiftRulesService.java | 17 ++++++++++ .../service/impl/GiftRulesServiceImpl.java | 34 +++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/GiftRule.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/GiftRulesMapper.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/GiftRulesMapper.xml create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IGiftRulesService.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/GiftRulesServiceImpl.java diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/GiftRule.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/GiftRule.java new file mode 100644 index 000000000..f714c41c1 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/GiftRule.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.business.entity; + +import lombok.Data; + +@Data +public class GiftRule { + + private final String shopCode; + + private final String sku; + + private final String regex; + + private final Boolean matchQuantity; +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/GiftRulesMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/GiftRulesMapper.java new file mode 100644 index 000000000..f44920581 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/GiftRulesMapper.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.business.entity.GiftRule; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Description: 添加赠品规则 + * @Author: jeecg-boot + * @Date: 2024-09-02 + * @Version: V1.0 + */ +@Repository +public interface GiftRulesMapper extends BaseMapper { + + List findByShop(List shopCodes); +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/GiftRulesMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/GiftRulesMapper.xml new file mode 100644 index 000000000..9ced8b0f4 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/GiftRulesMapper.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IGiftRulesService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IGiftRulesService.java new file mode 100644 index 000000000..39fcf190e --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IGiftRulesService.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.business.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.business.entity.GiftRule; + +import java.util.List; + +/** + * @Description: 添加赠品规则 + * @Author: jeecg-boot + * @Date: 2024-09-02 + * @Version: V1.0 + */ +public interface IGiftRulesService extends IService { + + List findGiftRulesByShopCode(List shopCodes); +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/GiftRulesServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/GiftRulesServiceImpl.java new file mode 100644 index 000000000..dd618a3eb --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/GiftRulesServiceImpl.java @@ -0,0 +1,34 @@ +package org.jeecg.modules.business.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.business.entity.GiftRule; +import org.jeecg.modules.business.mapper.GiftRulesMapper; +import org.jeecg.modules.business.service.IGiftRulesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: 添加赠品规则 + * @Author: jeecg-boot + * @Date: 2024-09-02 + * @Version: V1.0 + */ +@Service +@Slf4j +public class GiftRulesServiceImpl extends ServiceImpl implements IGiftRulesService { + + @Autowired + private GiftRulesMapper giftRulesMapper; + + public GiftRulesServiceImpl(GiftRulesMapper giftRulesMapper) { + this.giftRulesMapper = giftRulesMapper; + } + + @Override + public List findGiftRulesByShopCode(List shopCodes) { + return giftRulesMapper.findByShop(shopCodes); + } +} \ No newline at end of file From d17769cff377249f0681dbc7f4f7263d8d86aa02 Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Wed, 4 Sep 2024 17:16:23 +0200 Subject: [PATCH 2/5] Old SKU data become Triple, adding erpOrderItemId as differentiator in parameters in case of multiple SKU of same quantity --- .../dochangeorder/ChangeOrderRequestBody.java | 38 +++++++++++++++---- .../business/domain/job/AddCardJob.java | 4 +- .../domain/job/AddPortraitTubeJob.java | 4 +- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderRequestBody.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderRequestBody.java index d03bdf54b..3ab5bebc2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderRequestBody.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderRequestBody.java @@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import org.jeecg.modules.business.domain.api.mabang.RequestBody; import java.util.HashSet; @@ -18,9 +19,9 @@ public class ChangeOrderRequestBody implements RequestBody { private String orderStatus; private String remark; - private final HashSet> oldSkuData; + private HashSet> oldSkuData; - private final HashSet> newSkuData; + private HashSet> newSkuData; private final static String DEFAULT_WAREHOUSE_NAME = "SZBA宝安仓"; @@ -36,7 +37,25 @@ public class ChangeOrderRequestBody implements RequestBody { } } - public ChangeOrderRequestBody(String platformOrderId, String orderStatus, HashSet> oldSkuData, + public ChangeOrderRequestBody() { + } + + public static ChangeOrderRequestBody buildChangeOrderRequestBody(String platformOrderId, String orderStatus, + HashSet> oldSkuData, + HashSet> newSkuData, String remark) { + ChangeOrderRequestBody body = new ChangeOrderRequestBody(); + body.platformOrderId = platformOrderId; + body.orderStatus = orderStatus; + body.oldSkuData = new HashSet<>(); + if (oldSkuData != null) { + oldSkuData.forEach(pair -> body.oldSkuData.add(Triple.of(pair.getLeft(), null, pair.getRight()))); + } + body.newSkuData = newSkuData; + body.remark = remark; + return body; + } + + public ChangeOrderRequestBody(String platformOrderId, String orderStatus, HashSet> oldSkuData, HashSet> newSkuData, String remark) { this.platformOrderId = platformOrderId; this.oldSkuData = oldSkuData; @@ -58,17 +77,20 @@ public class ChangeOrderRequestBody implements RequestBody { putNonNull(json, "remark", remark); JSONArray stockDataArray = new JSONArray(); if (oldSkuData != null && !oldSkuData.isEmpty()) { - for (Pair oldSkuDatum : oldSkuData) { + for (Triple oldSkuDatum : oldSkuData) { JSONObject stockData = new JSONObject(); stockData.put("warehouseName", DEFAULT_WAREHOUSE_NAME); - stockData.put("stockSku", oldSkuDatum.getKey()); - stockData.put("quantity", oldSkuDatum.getValue()); + stockData.put("stockSku", oldSkuDatum.getLeft()); + if (oldSkuDatum.getMiddle() != null) { + stockData.put("erpOrderItemId", oldSkuDatum.getMiddle()); + } + stockData.put("quantity", oldSkuDatum.getRight()); stockData.put("type", OperationType.REMOVE.code); stockDataArray.add(stockData); } } - if(newSkuData != null) { + if (newSkuData != null) { for (Pair newSkuDatum : newSkuData) { JSONObject stockData = new JSONObject(); stockData.put("warehouseName", DEFAULT_WAREHOUSE_NAME); @@ -78,7 +100,7 @@ public class ChangeOrderRequestBody implements RequestBody { stockDataArray.add(stockData); } } - putNonNull(json,"stockData", stockDataArray.toJSONString()); + putNonNull(json, "stockData", stockDataArray.toJSONString()); return json; } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddCardJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddCardJob.java index b09d1e2c3..7207f2248 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddCardJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddCardJob.java @@ -123,8 +123,8 @@ public class AddCardJob implements Job { // Still no card in order, add one HashSet> card = new HashSet<>(); card.add(Pair.of(CARD_SKU, 1)); - ChangeOrderRequestBody changeOrderRequestBody = new ChangeOrderRequestBody(mabangOrder.getPlatformOrderId(), null, - null, card, null); + ChangeOrderRequestBody changeOrderRequestBody = ChangeOrderRequestBody.buildChangeOrderRequestBody( + mabangOrder.getPlatformOrderId(), null, null, card, null); changeOrderRequests.add(changeOrderRequestBody); } } 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 af393e0f9..6f8ee04d8 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 @@ -142,8 +142,8 @@ public class AddPortraitTubeJob implements Job { HashSet> adequateTubes = currentAndAdequateTubes.getRight(); // Do nothing if current tubes are the adequate tubes if (!currentTubes.containsAll(adequateTubes) || !adequateTubes.containsAll(currentTubes)) { - ChangeOrderRequestBody changeOrderRequestBody = new ChangeOrderRequestBody(mabangOrder.getPlatformOrderId(), null, - currentTubes, adequateTubes, null); + ChangeOrderRequestBody changeOrderRequestBody = ChangeOrderRequestBody.buildChangeOrderRequestBody( + mabangOrder.getPlatformOrderId(), null, currentTubes, adequateTubes, null); changeOrderRequests.add(changeOrderRequestBody); } } From adb767030a26914507f0ae233b67a113f3f1c473 Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Wed, 4 Sep 2024 17:17:31 +0200 Subject: [PATCH 3/5] Hotfix for AddPortraitTubeJob : add missing case for only one new 36cm canvas in order --- .../jeecg/modules/business/domain/job/AddPortraitTubeJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6f8ee04d8..0a818e584 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 @@ -249,7 +249,7 @@ public class AddPortraitTubeJob implements Job { if (canvasNew46RemainderCount > 0) { // TODO 2024-08-28 Temporarily use OLD 50cm tubes for NEW 46cm canvases tube50SingleCount++; - } else if (canvas40RemainderCount > 0) { + } else if (canvas40RemainderCount > 0 || canvasNew36RemainderCount > 0) { tube40SingleCount++; } else if (canvas30RemainderCount > 0){ tube30SingleDoubleCount++; From 3ca6fca694b2bc64e6c3291b8cde3d68c9e28a8d Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Wed, 4 Sep 2024 17:29:51 +0200 Subject: [PATCH 4/5] Create AddGiftJob --- .../business/domain/job/AddGiftJob.java | 241 ++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java new file mode 100644 index 000000000..77bcd25af --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java @@ -0,0 +1,241 @@ +package org.jeecg.modules.business.domain.job; + +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; +import org.codehaus.jettison.json.JSONArray; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderRequest; +import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderRequestBody; +import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderResponse; +import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; +import org.jeecg.modules.business.entity.GiftRule; +import org.jeecg.modules.business.entity.PlatformOrder; +import org.jeecg.modules.business.service.IGiftRulesService; +import org.jeecg.modules.business.service.IPlatformOrderMabangService; +import org.jeecg.modules.business.service.IPlatformOrderService; +import org.jetbrains.annotations.NotNull; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.groupingBy; + +@Slf4j +public class AddGiftJob implements Job { + + private static final Integer DEFAULT_NUMBER_OF_DAYS = 30; + + private static final List DEFAULT_SHOPS = Arrays.asList("FC Takumiya", "FCFR"); + private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; + private static final String OBSOLETE_STATUS_CODE = "4"; + + @Autowired + private IPlatformOrderService platformOrderService; + @Autowired + private IGiftRulesService giftRulesService; + @Autowired + private IPlatformOrderMabangService platformOrderMabangService; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + LocalDateTime endDateTime = LocalDateTime.now(); + LocalDateTime startDateTime = endDateTime.minusDays(DEFAULT_NUMBER_OF_DAYS); + List shops = DEFAULT_SHOPS; + JobDataMap jobDataMap = context.getMergedJobDataMap(); + String parameter = ((String) jobDataMap.get("parameter")); + if (parameter != null) { + try { + JSONObject jsonObject = new JSONObject(parameter); + if (!jsonObject.isNull("startDateTime")) { + String startDateStr = jsonObject.getString("startDateTime"); + startDateTime = LocalDateTime.parse(startDateStr); + } + if (!jsonObject.isNull("endDateTime")) { + String endDateStr = jsonObject.getString("endDateTime"); + endDateTime = LocalDateTime.parse(endDateStr); + } + if (!jsonObject.isNull("shops")) { + JSONArray shopsArray = jsonObject.getJSONArray("shops"); + List shopList = new ArrayList<>(); + for (int i = 0; i < shopsArray.length(); i++) { + shopList.add(shopsArray.getString(i)); + } + shops = shopList; + } + } catch (JSONException e) { + log.error("Error while parsing parameter as JSON, falling back to default parameters."); + } + } + + if (!endDateTime.isAfter(startDateTime)) { + throw new RuntimeException("EndDateTime must be strictly greater than StartDateTime !"); + } + + List platformOrders = platformOrderService.fetchUninvoicedOrdersForShops(startDateTime, endDateTime, shops); + List platformOrderIds = platformOrders.stream().map(PlatformOrder::getPlatformOrderId).collect(Collectors.toList()); + List> platformOrderIdLists = Lists.partition(platformOrderIds, 10); + List giftRules = giftRulesService.findGiftRulesByShopCode(shops); + Map>> rulesMap = giftRules.stream() + .collect(groupingBy(GiftRule::getShopCode, + groupingBy(GiftRule::getMatchQuantity))); + Map> giftSetByShop = giftRules.stream() + .collect(Collectors.groupingBy(GiftRule::getShopCode, + Collector.of(HashSet::new, (s, rule) -> s.add(rule.getSku()), (s1, s2) -> { + s1.addAll(s2); + return s1; + }))); + + List requests = new ArrayList<>(); + for (List platformOrderIdList : platformOrderIdLists) { + requests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList)); + } + List mabangOrders = new ArrayList<>(); + + ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_NUMBER_OF_THREADS); + List> futures = requests.stream() + .map(request -> CompletableFuture.supplyAsync(() -> { + boolean success = false; + try { + OrderListRawStream rawStream = new OrderListRawStream(request); + OrderListStream stream = new OrderListStream(rawStream); + List orders = stream.all(); + mabangOrders.addAll(orders); + success = !orders.isEmpty(); + } catch (RuntimeException e) { + log.error("Error communicating with MabangAPI", e); + } + return success; + }, executor)) + .collect(Collectors.toList()); + List results = futures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + long nbSuccesses = results.stream().filter(b -> b).count(); + log.info("{}/{} requests have succeeded.", nbSuccesses, requests.size()); + log.info("{}/{} mabang orders have been retrieved.", mabangOrders.size(), platformOrderIds.size()); + + List ordersWithLogistic = new ArrayList<>(); + log.info("Constructing gift insertion requests"); + List giftInsertionRequests = constructGiftInsertionRequests(mabangOrders, rulesMap, giftSetByShop, ordersWithLogistic); + log.info("{} gift insertion requests to be sent to MabangAPI", giftInsertionRequests.size()); + + log.info("Clearing logistic channel names before inserting gifts"); + platformOrderMabangService.clearLogisticChannel(ordersWithLogistic, executor); + + List> giftInsertionFutures = giftInsertionRequests.stream() + .map(giftInsertionRequestBody -> CompletableFuture.supplyAsync(() -> { + boolean success = false; + try { + ChangeOrderRequest changeOrderRequest = new ChangeOrderRequest(giftInsertionRequestBody); + ChangeOrderResponse response = changeOrderRequest.send(); + success = response.success(); + } catch (RuntimeException e) { + log.error("Error communicating with MabangAPI", e); + } + return success; + }, executor)) + .collect(Collectors.toList()); + results = giftInsertionFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + nbSuccesses = results.stream().filter(b -> b).count(); + log.info("{}/{} gift insertion requests have succeeded.", nbSuccesses, giftInsertionRequests.size()); + } + + @NotNull + private static List constructGiftInsertionRequests(List mabangOrders, + Map>> rulesMap, + Map> giftSetByShop, + List ordersWithLogistic) { + List giftInsertionRequests = new ArrayList<>(); + Map> ordersByShop = mabangOrders.stream().collect(groupingBy(Order::getShopErpCode)); + // Go through orders by Shop + for (Map.Entry> entry : ordersByShop.entrySet()) { + String shopCode = entry.getKey(); + log.info("Going through orders from shop {}", shopCode); + Map> rulesByType = rulesMap.get(shopCode); + Set giftSkuSet = giftSetByShop.get(shopCode); + List matchingQuantityRules = rulesByType.get(Boolean.TRUE); + List nonMatchingQuantityRules = rulesByType.get(Boolean.FALSE); + + for (Order order : entry.getValue()) { + log.info("Processing order {} ", order.getPlatformOrderId()); + // Non matching-quantity rules only apply once per order + boolean nonMatchingRulesApplied = false; + HashMap giftMap = new HashMap<>(); + Map> orderItemMap = order.getOrderItems() + .stream() + .filter(orderItem -> !orderItem.getStatus().equalsIgnoreCase(OBSOLETE_STATUS_CODE)) + .collect(groupingBy(orderItem -> giftSkuSet.contains(orderItem.getErpCode()))); + for (OrderItem orderItem : orderItemMap.get(Boolean.FALSE)) { + String erpCode = orderItem.getErpCode(); + if (!nonMatchingRulesApplied) { + for (GiftRule giftRule : nonMatchingQuantityRules) { + if (erpCode.matches(giftRule.getRegex())) { + nonMatchingRulesApplied = true; + putValueInMapOrReduce(giftRule.getSku(), 1, giftMap); + break; + } + } + } + for (GiftRule giftRule : matchingQuantityRules) { + if (erpCode.matches(giftRule.getRegex())) { + putValueInMapOrReduce(giftRule.getSku(), orderItem.getQuantity(), giftMap); + break; + } + } + } + log.debug("Order {} 's new gift map : ", giftMap); + HashSet> oldSkuData = new HashSet<>(); + List oldGifts = orderItemMap.get(Boolean.TRUE) == null ? new ArrayList<>() : orderItemMap.get(Boolean.TRUE); + oldGifts.forEach(orderItem -> oldSkuData.add(Triple.of(orderItem.getErpCode(), + orderItem.getErpOrderItemId(), orderItem.getQuantity()))); + HashSet> newSkuData = new HashSet<>(); + giftMap.forEach((key, value) -> newSkuData.add(Pair.of(key, value))); + + if (giftInsertionNeeded(oldSkuData, newSkuData)) { + ChangeOrderRequestBody changeOrderRequestBody = new ChangeOrderRequestBody(order.getPlatformOrderId(), null, + oldSkuData, newSkuData, null); + giftInsertionRequests.add(changeOrderRequestBody); + + // If the order already has a logistic channel name, then we need to clear it before inserting gifts + if (order.getLogisticChannelName() != null && !order.getLogisticChannelName().isEmpty()) { + ordersWithLogistic.add(order); + } + } + } + log.info("Ended processing orders from shop {}", shopCode); + } + return giftInsertionRequests; + } + + private static void putValueInMapOrReduce(String key, Integer value, HashMap giftMap) { + if (giftMap.containsKey(key)) { + giftMap.put(key, giftMap.get(key) + value); + } else { + giftMap.put(key, value); + } + } + + private static boolean giftInsertionNeeded(HashSet> oldSkuData, HashSet> newSkuData) { + if (newSkuData.isEmpty()) { + return false; + } else + // Need more inspection when set sizes are the same + if (oldSkuData.size() == newSkuData.size()) { + HashSet> oldSkuDataInPairs = new HashSet<>(); + oldSkuData.forEach(triple -> oldSkuDataInPairs.add(Pair.of(triple.getLeft(), triple.getRight()))); + return !oldSkuDataInPairs.containsAll(newSkuData) && !newSkuData.containsAll(oldSkuDataInPairs); + } + return true; + } +} From 5fd182f06fd9258ec39a51a22dc5700c8f077bc2 Mon Sep 17 00:00:00 2001 From: Qiuyi LI Date: Thu, 5 Sep 2024 11:25:05 +0200 Subject: [PATCH 5/5] Improve the process of deciding whether gift insertion is needed by reducing old gift map before comparison of two maps --- .../business/domain/job/AddGiftJob.java | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java index 77bcd25af..97648708c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/AddGiftJob.java @@ -171,7 +171,7 @@ public class AddGiftJob implements Job { log.info("Processing order {} ", order.getPlatformOrderId()); // Non matching-quantity rules only apply once per order boolean nonMatchingRulesApplied = false; - HashMap giftMap = new HashMap<>(); + HashMap newGiftMap = new HashMap<>(); Map> orderItemMap = order.getOrderItems() .stream() .filter(orderItem -> !orderItem.getStatus().equalsIgnoreCase(OBSOLETE_STATUS_CODE)) @@ -182,27 +182,31 @@ public class AddGiftJob implements Job { for (GiftRule giftRule : nonMatchingQuantityRules) { if (erpCode.matches(giftRule.getRegex())) { nonMatchingRulesApplied = true; - putValueInMapOrReduce(giftRule.getSku(), 1, giftMap); + putValueInMapOrReduce(giftRule.getSku(), 1, newGiftMap); break; } } } for (GiftRule giftRule : matchingQuantityRules) { if (erpCode.matches(giftRule.getRegex())) { - putValueInMapOrReduce(giftRule.getSku(), orderItem.getQuantity(), giftMap); + putValueInMapOrReduce(giftRule.getSku(), orderItem.getQuantity(), newGiftMap); break; } } } - log.debug("Order {} 's new gift map : ", giftMap); + log.debug("Order {} 's new gift map : ", newGiftMap); HashSet> oldSkuData = new HashSet<>(); + HashMap oldGiftMap = new HashMap<>(); List oldGifts = orderItemMap.get(Boolean.TRUE) == null ? new ArrayList<>() : orderItemMap.get(Boolean.TRUE); - oldGifts.forEach(orderItem -> oldSkuData.add(Triple.of(orderItem.getErpCode(), - orderItem.getErpOrderItemId(), orderItem.getQuantity()))); + oldGifts.forEach(orderItem -> { + oldSkuData.add(Triple.of(orderItem.getErpCode(), + orderItem.getErpOrderItemId(), orderItem.getQuantity())); + putValueInMapOrReduce(orderItem.getErpCode(), orderItem.getQuantity(), oldGiftMap); + }); HashSet> newSkuData = new HashSet<>(); - giftMap.forEach((key, value) -> newSkuData.add(Pair.of(key, value))); + newGiftMap.forEach((key, value) -> newSkuData.add(Pair.of(key, value))); - if (giftInsertionNeeded(oldSkuData, newSkuData)) { + if (!newGiftMap.isEmpty() && !newGiftMap.equals(oldGiftMap)) { ChangeOrderRequestBody changeOrderRequestBody = new ChangeOrderRequestBody(order.getPlatformOrderId(), null, oldSkuData, newSkuData, null); giftInsertionRequests.add(changeOrderRequestBody); @@ -225,17 +229,4 @@ public class AddGiftJob implements Job { giftMap.put(key, value); } } - - private static boolean giftInsertionNeeded(HashSet> oldSkuData, HashSet> newSkuData) { - if (newSkuData.isEmpty()) { - return false; - } else - // Need more inspection when set sizes are the same - if (oldSkuData.size() == newSkuData.size()) { - HashSet> oldSkuDataInPairs = new HashSet<>(); - oldSkuData.forEach(triple -> oldSkuDataInPairs.add(Pair.of(triple.getLeft(), triple.getRight()))); - return !oldSkuDataInPairs.containsAll(newSkuData) && !newSkuData.containsAll(oldSkuDataInPairs); - } - return true; - } }