From 3fdf1d27ebd987f9bf814a5c0d9f85839be53b6e Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Thu, 11 Jan 2024 11:41:01 +0100 Subject: [PATCH 1/2] fix : handle not initialized balance error and uninvoiced purchase fees orders --- .../controller/admin/CreditController.java | 12 ++- .../client/TransactionController.java | 85 ++++++++++++------- .../business/mapper/PlatformOrderMapper.java | 1 + .../mapper/xml/PlatformOrderMapper.xml | 31 +++++++ .../service/IPlatformOrderService.java | 8 ++ .../service/impl/BalanceServiceImpl.java | 4 + .../impl/PlatformOrderServiceImpl.java | 5 ++ 7 files changed, 114 insertions(+), 32 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java index a794f8392..bfb55ccbc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/CreditController.java @@ -6,8 +6,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.business.entity.Client; import org.jeecg.modules.business.entity.Credit; import org.jeecg.modules.business.service.IBalanceService; +import org.jeecg.modules.business.service.IClientService; import org.jeecg.modules.business.service.ICreditService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -40,6 +42,8 @@ public class CreditController extends JeecgController { private ICreditService creditService; @Autowired private IBalanceService balanceService; + @Autowired + private IClientService clientService; /** * 分页列表查询 @@ -74,7 +78,13 @@ public class CreditController extends JeecgController { @PostMapping(value = "/add") public Result add(@RequestBody Credit credit) { creditService.save(credit); - balanceService.updateBalance(credit.getClientId(), credit.getId(), credit.getAmount(), credit.getCurrencyId()); + try { + balanceService.updateBalance(credit.getClientId(), credit.getId(), credit.getAmount(), credit.getCurrencyId()); + } + catch (RuntimeException e) { + Client client = clientService.getById(credit.getClientId()); + return Result.error("Error while updating " + client.fullName() + "'s balance : " + e.getMessage()); + } return Result.OK("sys.api.entryAddSuccess"); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java index 236a25b85..8bf898065 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java @@ -92,44 +92,67 @@ public class TransactionController { public Result debit(@RequestParam("clientId") String clientId, @RequestParam("currency") String currency) { List errorMessages = new ArrayList<>(); List shopIds = shopService.listIdByClient(clientId); - List orders = platformOrderService.findUninvoicedShippingOrdersByShopForClient(shopIds, Arrays.asList(1,2,3)); - if(orders.isEmpty()) - return Result.OK("No order to invoice."); - Date startDate = orders.stream().map(PlatformOrder::getOrderTime).min(Date::compareTo).get(); - Date endDate = orders.stream().map(PlatformOrder::getOrderTime).max(Date::compareTo).get(); - List orderIds = orders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); - log.info("{} Orders to be estimated", orderIds.size()); - ShippingInvoiceFactory factory = new ShippingInvoiceFactory( - platformOrderService, clientMapper, shopMapper, logisticChannelMapper, logisticChannelPriceMapper, - platformOrderContentService, skuDeclaredValueService, countryService, exchangeRatesMapper, - purchaseOrderService, purchaseOrderContentMapper, skuPromotionHistoryMapper, savRefundService, savRefundWithDetailService, emailService, env); - List shippingFeesEstimations = factory.getEstimations(clientId, orderIds, errorMessages); - if(shippingFeesEstimations.isEmpty()) - return Result.OK("No estimation found."); - // purchase estimation - List estimationOrderIds = new ArrayList<>(); + List shippingOrders = platformOrderService.findUninvoicedShippingOrdersByShopForClient(shopIds, Arrays.asList(1,2,3)); + Date startDate = null; + Date endDate = null; + List shippingFeesEstimations; BigDecimal shippingFeesEstimation = BigDecimal.ZERO; - for(ShippingFeesEstimation estimation: shippingFeesEstimations) { - estimationOrderIds.addAll(estimation.getOrderIds()); - shippingFeesEstimation = shippingFeesEstimation.add(estimation.getDueForProcessedOrders()); + if(!shippingOrders.isEmpty()) { + startDate = shippingOrders.stream().map(PlatformOrder::getOrderTime).min(Date::compareTo).get(); + endDate = shippingOrders.stream().map(PlatformOrder::getOrderTime).max(Date::compareTo).get(); + List shippingOrderIds = shippingOrders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); + log.info("Estimating shipping fees for {}", shippingOrderIds.size()); + ShippingInvoiceFactory factory = new ShippingInvoiceFactory( + platformOrderService, clientMapper, shopMapper, logisticChannelMapper, logisticChannelPriceMapper, + platformOrderContentService, skuDeclaredValueService, countryService, exchangeRatesMapper, + purchaseOrderService, purchaseOrderContentMapper, skuPromotionHistoryMapper, savRefundService, savRefundWithDetailService, emailService, env); + shippingFeesEstimations = factory.getEstimations(clientId, shippingOrderIds, errorMessages); + for (ShippingFeesEstimation estimation : shippingFeesEstimations) { + shippingFeesEstimation = shippingFeesEstimation.add(estimation.getDueForProcessedOrders()); + } } - List orderContents = platformOrderContentMapper.fetchOrderContent(estimationOrderIds); - List skuIds = orderContents.stream().map(PlatformOrderContent::getSkuId).collect(Collectors.toList()); - List skuPrices = platformOrderContentMapper.searchSkuPrice(skuIds); - BigDecimal exchangeRateEurToRmb = exchangeRatesMapper.getLatestExchangeRate("EUR", "RMB"); + + // purchase estimation + List purchaseOrders = platformOrderService.fetchUninvoicedPurchaseOrdersByShopFroClient(shopIds, Arrays.asList(1,2,3)); BigDecimal purchaseEstimation = BigDecimal.ZERO; - boolean isCompleteInvoiceReady = true; - if(skuPrices.size() != skuIds.size()) { - isCompleteInvoiceReady = false; - errorMessages.add("Some sku prices are missing."); + + if(shippingOrders.isEmpty() && purchaseOrders.isEmpty()) { + return Result.OK("No order to invoice."); } - for(PlatformOrderContent content : orderContents){ - for (SkuPrice skuPrice : skuPrices) { - if(content.getSkuId().equals(skuPrice.getSkuId())) { - purchaseEstimation = purchaseEstimation.add(skuPrice.getPrice(content.getQuantity(), exchangeRateEurToRmb)); + + boolean isCompleteInvoiceReady = true; + if(!purchaseOrders.isEmpty()) { + Date purchaseStartDate = purchaseOrders.stream().map(PlatformOrder::getOrderTime).min(Date::compareTo).get(); + Date purchaseEndDate = purchaseOrders.stream().map(PlatformOrder::getOrderTime).max(Date::compareTo).get(); + if(startDate == null) + startDate = purchaseStartDate; + else + startDate = startDate.before(purchaseStartDate) ? startDate : purchaseStartDate; + if(endDate == null) + endDate = purchaseEndDate; + else + endDate = endDate.after(purchaseEndDate) ? endDate : purchaseEndDate; + + List purchaseOrderIds = purchaseOrders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); + List orderContents = platformOrderContentMapper.fetchOrderContent(purchaseOrderIds); + List skuIds = orderContents.stream().map(PlatformOrderContent::getSkuId).collect(Collectors.toList()); + List skuPrices = platformOrderContentMapper.searchSkuPrice(skuIds); + BigDecimal exchangeRateEurToRmb = exchangeRatesMapper.getLatestExchangeRate("EUR", "RMB"); + if (skuPrices.size() != skuIds.size()) { + isCompleteInvoiceReady = false; + errorMessages.add("Some sku prices are missing."); + } + for (PlatformOrderContent content : orderContents) { + for (SkuPrice skuPrice : skuPrices) { + if (content.getSkuId().equals(skuPrice.getSkuId())) { + purchaseEstimation = purchaseEstimation.add(skuPrice.getPrice(content.getQuantity(), exchangeRateEurToRmb)); + } } } } + if(shippingFeesEstimation.compareTo(BigDecimal.ZERO) == 0 && purchaseEstimation.compareTo(BigDecimal.ZERO) == 0) { + return Result.OK("No estimation found."); + } if(!currency.equals("EUR")) { BigDecimal exchangeRate = exchangeRatesMapper.getLatestExchangeRate("EUR", currency); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java index 153bdb06d..3e70fd068 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java @@ -186,6 +186,7 @@ public interface PlatformOrderMapper extends BaseMapper { void cancelBatchInvoice(@Param("invoiceNumbers") List invoiceNumbers); List findUninvoicedShippingOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); + List fetchUninvoicedPurchaseOrdersByShopFroClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List findUninvoicedOrderIdsByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml index f0ad180d0..dc6c006cc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml @@ -575,6 +575,37 @@ #{shopId} ; + - SELECT * FROM platform_order WHERE IF(shipping_invoice_number IS NOT NULL, shipping_invoice_number LIKE '%%%%-%%-2%%%', diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java index f18f172a9..1db346af1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java @@ -193,7 +193,7 @@ public interface IPlatformOrderService extends IService { * @param erpStatuses * @return */ - List fetchUninvoicedPurchaseOrdersByShopFroClient(List shopIds, List erpStatuses); + List fetchUninvoicedPurchaseOrdersByShopForClient(List shopIds, List erpStatuses); /** * Find all order that can be invoiced (shipping and purchase). diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java index 77e646803..0d1651174 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java @@ -405,8 +405,8 @@ public class PlatformOrderServiceImpl extends ServiceImpl fetchUninvoicedPurchaseOrdersByShopFroClient(List shopIds, List erpStatuses) { - return platformOrderMap.fetchUninvoicedPurchaseOrdersByShopFroClient(shopIds, erpStatuses); + public List fetchUninvoicedPurchaseOrdersByShopForClient(List shopIds, List erpStatuses) { + return platformOrderMap.fetchUninvoicedPurchaseOrdersByShopForClient(shopIds, erpStatuses); } @Override