From e5fe9a4989f55050bceff6d45f17f3891d8eabd1 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Tue, 12 Mar 2024 16:22:17 +0100 Subject: [PATCH] feature : Create Mabang Purchase Order --- .../admin/PurchaseOrderController.java | 49 ++++++++++--- .../shippingInvoice/InvoiceController.java | 4 +- .../doSearchSkuListNew/SkuListRawStream.java | 16 ++--- .../business/entity/PurchaseOrder.java | 6 ++ .../business/mapper/PurchaseOrderMapper.java | 13 ++++ .../mapper/xml/PurchaseOrderMapper.xml | 36 ++++++++++ .../modules/business/mapper/xml/SkuMapper.xml | 5 +- .../service/IProviderMabangService.java | 2 +- .../service/IPurchaseOrderService.java | 10 +++ .../impl/ProviderMabangServiceImpl.java | 70 ++++++++++++++----- .../purchase/PurchaseOrderServiceImpl.java | 24 +++++++ .../business/vo/PurchaseOrderPage.java | 12 ++-- .../modules/business/vo/SkuQuantity.java | 15 ++++ 13 files changed, 216 insertions(+), 46 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java index 532e89375..30c09c7b7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java @@ -14,6 +14,7 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.business.controller.UserException; +import org.jeecg.modules.business.domain.job.ThrottlingExecutorService; import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.vo.*; @@ -37,6 +38,9 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URISyntaxException; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -66,27 +70,25 @@ public class PurchaseOrderController { private IPlatformOrderService platformOrderService; @Autowired private IShippingInvoiceService shippingInvoiceService; + @Autowired private IProviderMabangService providerMabangService; + private static final Integer DEFAULT_NUMBER_OF_THREADS = 2; + private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10; /** * Page query for purchase order * - * @param purchaseOrder * @param pageNo * @param pageSize - * @param req * @return */ @AutoLog(value = "商品采购订单-分页列表查询") @ApiOperation(value = "商品采购订单-分页列表查询", notes = "商品采购订单-分页列表查询") @GetMapping(value = "/list") - public Result queryPageList(PurchaseOrder purchaseOrder, - @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - HttpServletRequest req) { - QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(purchaseOrder, req.getParameterMap()); - Page page = new Page<>(pageNo, pageSize); - IPage pageList = purchaseOrderService.page(page, queryWrapper); - return Result.OK(pageList); + public Result queryPageList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNo, pageSize); + purchaseOrderService.setPageForList(page); + return Result.OK(page); } /** * 添加 @@ -590,4 +592,31 @@ public class PurchaseOrderController { PurchaseConfirmation d = platformOrderService.confirmPurchaseBySkuQuantity(clientInfo, skuQuantities); return Result.OK(d); } + + @GetMapping(value = "/createMabangPurchaseOrder") + public Result createMabangPurchaseOrder(@RequestParam("invoiceNumbers") List request) { + log.info("Creating purchase order to Mabang for invoices : {} ", request); + ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS, + MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES); + List> changeOrderFutures = request.stream() + .map(invoiceNumber -> CompletableFuture.supplyAsync(() -> { + log.info("Invoice number : {}", invoiceNumber); + List skuQuantities = purchaseOrderService.getSkuQuantityByInvoiceNumber(invoiceNumber); + if(skuQuantities.isEmpty()) { + return false; + } + Map skuQuantityMap = skuQuantities.stream() + .collect(Collectors.toMap(SkuQuantity::getErpCode, SkuQuantity::getQuantity)); + skuQuantityMap.forEach((s, integer) -> log.info("SKU: {} Quantity: {}", s, integer)); + InvoiceMetaData metaData = purchaseOrderService.getMetaDataFromInvoiceNumbers(invoiceNumber); + return providerMabangService.addPurchaseOrderToMabang(skuQuantityMap, metaData); + },throttlingExecutorService)) + .collect(Collectors.toList()); + + List results = changeOrderFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + long nbSuccesses = results.stream().filter(b -> b).count(); + log.info("{}/{} purchase order requests have succeeded.", nbSuccesses, request.size()); + + return Result.ok("data.noData"); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index ced1c3f6d..9572a1369 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -322,6 +322,7 @@ public class InvoiceController { /** * Make purchase invoice for specified orders and type * used by self-service clients + * creates a purchase order in Mabang * @param param Parameters for creating an invoice * @return Result of the generation, in case of error, message will be contained, * in case of success, data will contain filename. @@ -426,12 +427,11 @@ public class InvoiceController { List skuQuantities = new ArrayList<>(); for(Map.Entry entry : payload.entrySet()) { String skuId = skuService.getIdFromErpCode(entry.getKey()); - skuQuantities.add(new SkuQuantity(skuId, entry.getValue())); + skuQuantities.add(new SkuQuantity(skuId, entry.getKey(), entry.getValue())); } try { String purchaseId = purchaseOrderService.addPurchase(skuQuantities); metaData = purchaseOrderService.makeInvoice(purchaseId); - providerMabangService.addPurchaseOrderToMabang(payload, metaData); return Result.OK(metaData); } catch (UserException e) { return Result.error(e.getMessage()); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRawStream.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRawStream.java index 9d57e63f0..2b80eab4b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRawStream.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRawStream.java @@ -49,15 +49,15 @@ public class SkuListRawStream implements NetworkDataStream { if (!began) { throw new IllegalStateException("Calling hasNext before begin"); } - // still has page left, true - if (!currentResponse.getCursor().isEmpty() || currentResponse.getCursor().equals(toSend.getCursor())) { - log.info("page: {}, has next", toSend.getPage()); - toSend.setCursor(currentResponse.getCursor()); - return true; - } // no page left, false - log.info("No page left, end"); - return false; + if(currentResponse.getCursor().isEmpty()) { + log.info("No page left, end"); + return false; + } + // still has page left, true + log.info("page: {}, has next", toSend.getPage()); + toSend.setCursor(currentResponse.getCursor()); + return true; } /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/PurchaseOrder.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/PurchaseOrder.java index 4c1821854..d92d3e5e8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/PurchaseOrder.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/PurchaseOrder.java @@ -103,6 +103,12 @@ public class PurchaseOrder implements Serializable { @ApiModelProperty(value = "订单发票号") private String invoiceNumber; + /** + * 订单是否下了单 + */ + @Excel(name = "订单是否下了单", width = 15) + @ApiModelProperty(value = "订单是否下了单") + private boolean ordered; /** * Payment document diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PurchaseOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PurchaseOrderMapper.java index 414a85a46..c3ea935f3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PurchaseOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PurchaseOrderMapper.java @@ -7,6 +7,9 @@ import org.apache.ibatis.annotations.Param; import org.jeecg.modules.business.entity.PlatformOrder; import org.jeecg.modules.business.entity.PurchaseOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.business.vo.InvoiceMetaData; +import org.jeecg.modules.business.vo.PurchaseOrderPage; +import org.jeecg.modules.business.vo.SkuQuantity; import org.springframework.stereotype.Repository; /** @@ -105,4 +108,14 @@ public interface PurchaseOrderMapper extends BaseMapper { List getPurchasesByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); List getPlatformOrder(@Param("invoiceNumber") String invoiceNumber); + + List getSkuQuantityByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); + + InvoiceMetaData getMetaDataFromInvoiceNumbers(@Param("invoiceNumber") String invoiceNumber); + + List getPage(@Param("offset") long offset, @Param("size") long size); + + long countPurchaseOrders(); + + void updatePurchaseOrderStatus(@Param("invoiceNumber") String invoiceNumber, @Param("isOrdered") boolean isOrdered); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PurchaseOrderMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PurchaseOrderMapper.xml index ccf8e747e..b6e074ce5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PurchaseOrderMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PurchaseOrderMapper.xml @@ -103,4 +103,40 @@ FROM platform_order WHERE shipping_invoice_number = #{invoiceNumber} + + + + + + UPDATE purchase_order + SET ordered = #{isOrdered} + WHERE invoice_number = #{invoiceNumber} + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml index 67d701f76..ffd37e3c9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml @@ -140,13 +140,14 @@