diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java index aa5fcce11..5178a667f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java @@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.collect.Lists; import freemarker.template.Template; import freemarker.template.TemplateException; +import org.codehaus.jettison.json.JSONException; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderResponse; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeWarehouseRequest; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeWarehouseRequestBody; @@ -385,7 +386,7 @@ public class PlatformOrderController { } @PostMapping("/orderManagement") - public Result orderManagement(@RequestBody List orderOperations) throws IOException { + public Result orderManagement(@RequestBody List orderOperations) throws IOException, JSONException { boolean isEmployee = securityService.checkIsEmployee(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); Client client; @@ -469,6 +470,9 @@ public class PlatformOrderController { } List mabangOrders = platformOrderMabangService.getOrdersFromMabang(requests, executor); for(Order mabangOrder : mabangOrders) { + if(mabangOrder.getTrackingNumber() == null) { + continue; + } if(!mabangOrder.getTrackingNumber().isEmpty()) { ordersWithTrackingNumber.add(mabangOrder); } @@ -511,14 +515,17 @@ public class PlatformOrderController { templateModel.put("lastname", client.getSurname()); if(cancelCount > 0) { templateModel.put("cancelSuccessCount", cancelResponses.getSuccesses().size() + "/" + cancelCount); + templateModel.put("cancelSuccesses", cancelResponses.getSuccesses()); templateModel.put("cancelFailures", cancelResponses.getFailures()); } if(suspendCount > 0) { templateModel.put("suspendSuccessCount", suspendResponses.getSuccesses().size() + "/" + suspendCount); + templateModel.put("suspendSuccesses", suspendResponses.getSuccesses()); templateModel.put("suspendFailures", suspendResponses.getFailures()); } if(editCount > 0) { templateModel.put("editSuccessCount", editResponses.getSuccesses().size() + "/" + editCount); + templateModel.put("editSuccesses", editResponses.getSuccesses()); templateModel.put("editFailures", editResponses.getFailures()); } @@ -539,6 +546,13 @@ public class PlatformOrderController { throw new RuntimeException(e); } + // sync orders from Mabang + List poIdsSuccesses = new ArrayList<>(); + poIdsSuccesses.addAll(cancelResponses.getSuccesses()); + poIdsSuccesses.addAll(suspendResponses.getSuccesses()); + poIdsSuccesses.addAll(editResponses.getSuccesses()); + platformOrderMabangService.syncOrdersFromMabang(poIdsSuccesses); + return Result.OK(result); } @GetMapping("/recipientInfo") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java index 62f1e9fc2..87720542f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java @@ -1,13 +1,11 @@ package org.jeecg.modules.business.domain.job; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.jeecg.common.api.dto.message.TemplateMessageDTO; import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.service.IPlatformOrderMabangService; import org.jetbrains.annotations.NotNull; import org.quartz.Job; @@ -17,10 +15,6 @@ import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; @Slf4j public class MabangOrderSyncJob implements Job { @@ -29,7 +23,6 @@ public class MabangOrderSyncJob implements Job { private IPlatformOrderMabangService platformOrderMabangService; @Autowired private ISysBaseAPI ISysBaseApi; - private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getMergedJobDataMap(); @@ -54,53 +47,32 @@ public class MabangOrderSyncJob implements Job { throw new RuntimeException("PlatformOrder ID list can't be empty !"); } - log.info("Syncing following orders {}", platformOrderIds); - List> platformOrderIdLists = Lists.partition(platformOrderIds, 10); - 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()); - int syncedOrderNumber = mabangOrders.size(); - List syncedOrderIds = mabangOrders.stream().map(Order::getPlatformOrderId).collect(Collectors.toList()); - log.info("{}/{} mabang orders have been retrieved.", syncedOrderNumber, platformOrderIds.size()); - - log.info("{} orders to be updated.", syncedOrderNumber); - platformOrderMabangService.saveOrderFromMabang(mabangOrders); - - Map param = new HashMap<>(); - param.put("requested_order_number", String.valueOf(platformOrderIds.size())); - param.put("synced_order_number", String.valueOf(syncedOrderNumber)); - param.put("requested_order_ids", getHtmlListFromStringList(platformOrderIds)); - List failedToSyncOrderIds = new ArrayList<>(); - for (String platformOrderId : platformOrderIds) { - if (!syncedOrderIds.contains(platformOrderId)) { - failedToSyncOrderIds.add(platformOrderId); + try { + JSONObject res = platformOrderMabangService.syncOrdersFromMabang(platformOrderIds); + String syncedOrderNumber = String.valueOf(res.getInt("synced_order_number")); + List syncedOrderIds = new ArrayList<>(); + JSONArray syncedOrderIdsArray = res.getJSONArray("synced_order_ids"); + for (int i = 0; i < syncedOrderIdsArray.length(); i++) { + syncedOrderIds.add(syncedOrderIdsArray.getString(i)); } + Map param = new HashMap<>(); + param.put("requested_order_number", String.valueOf(platformOrderIds.size())); + param.put("synced_order_number", syncedOrderNumber); + param.put("requested_order_ids", getHtmlListFromStringList(platformOrderIds)); + List failedToSyncOrderIds = new ArrayList<>(); + for (String platformOrderId : platformOrderIds) { + if (!syncedOrderIds.contains(platformOrderId)) { + failedToSyncOrderIds.add(platformOrderId); + } + } + param.put("failed_to_sync_order_ids", getHtmlListFromStringList(failedToSyncOrderIds)); + TemplateMessageDTO message = new TemplateMessageDTO("admin", username == null ? "admin" : username, "马帮订单同步任务", param, "mabang_order_sync_job_result"); + ISysBaseApi.sendTemplateAnnouncement(message); + log.info("Order sync job recap message sent"); + } catch (JSONException e) { + throw new RuntimeException(e); } - param.put("failed_to_sync_order_ids", getHtmlListFromStringList(failedToSyncOrderIds)); - TemplateMessageDTO message = new TemplateMessageDTO("admin", username == null ? "admin" : username, "马帮订单同步任务", param, "mabang_order_sync_job_result"); - ISysBaseApi.sendTemplateAnnouncement(message); - log.info("Order sync job recap message sent"); + } @NotNull diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java index 414cf78c8..bdf6a1121 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java @@ -1,6 +1,8 @@ package org.jeecg.modules.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderListRequestBody; import org.jeecg.modules.business.vo.PlatformOrderOperation; @@ -40,4 +42,6 @@ public interface IPlatformOrderMabangService extends IService { void clearLogisticChannel(List orders, ExecutorService executor); String stripAccents(String input); + + JSONObject syncOrdersFromMabang(List platformOrderIds) throws JSONException; } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java index 17555acd1..d5593bec2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java @@ -1,8 +1,12 @@ package org.jeecg.modules.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.*; import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; @@ -23,6 +27,7 @@ import java.text.Normalizer; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; @@ -40,6 +45,8 @@ import static java.util.stream.Collectors.toList; public class PlatformOrderMabangServiceImpl extends ServiceImpl implements IPlatformOrderMabangService { @Autowired private PlatformOrderMabangMapper platformOrderMabangMapper; + @Autowired + private ISysBaseAPI ISysBaseApi; private static final Integer DEFAULT_NUMBER_OF_THREADS = 2; private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10; @@ -324,4 +331,46 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl platformOrderIds) throws JSONException { + log.info("Syncing following orders {}", platformOrderIds); + List> platformOrderIdLists = Lists.partition(platformOrderIds, 10); + List requests = new ArrayList<>(); + for (List platformOrderIdList : platformOrderIdLists) { + requests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList)); + } + List mabangOrders = new ArrayList<>(); + ExecutorService executor = Executors.newFixedThreadPool(10); + 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()); + int syncedOrderNumber = mabangOrders.size(); + List syncedOrderIds = mabangOrders.stream().map(Order::getPlatformOrderId).collect(Collectors.toList()); + log.info("{}/{} mabang orders have been retrieved.", syncedOrderNumber, platformOrderIds.size()); + + log.info("{} orders to be updated.", syncedOrderNumber); + saveOrderFromMabang(mabangOrders); + + JSONObject res = new JSONObject(); + res.put("synced_order_number", syncedOrderNumber); + res.put("synced_order_ids", syncedOrderIds); + return res; + } + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl index c41d01daf..da72236c7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl @@ -7,7 +7,13 @@ <#if cancelSuccessCount??> - Demandes d'annulations de commande : ${cancelSuccessCount} réussie(s) + Demandes d'annulations de commande : ${cancelSuccessCount} réussie(s) : +
    + <#list cancelSuccesses as success> +
  • ${success}
  • + +
+ <#if cancelFailures?size gt 0 > @@ -23,7 +29,13 @@ <#if suspendSuccessCount??> - Demandes de suspension de commande : ${suspendSuccessCount} réussie(s) + Demandes de suspension de commande : ${suspendSuccessCount} réussie(s) : +
    + <#list suspendSuccesses as success> +
  • ${success}
  • + +
+ <#if suspendFailures?size gt 0 > @@ -39,7 +51,13 @@ <#if editSuccessCount??> - Demandes de modification d'informations de commande : ${editSuccessCount} réussie(s) + Demandes de modification d'informations de commande : ${editSuccessCount} réussie(s) : +
    + <#list editSuccesses as success> +
  • ${success}
  • + +
+ <#if editFailures?size gt 0 >