From be558d5c9a6fb9f962d9716a6a0805702667baff Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Wed, 10 Jan 2024 11:38:16 +0100 Subject: [PATCH 1/5] fix : display shipping invoiced orders with invoiceable purchase fees + replace purchaseOrder status with paidAmount --- .../shippingInvoice/InvoiceController.java | 133 ++++++++++-------- .../client/TransactionController.java | 2 +- .../business/entity/PurchaseOrder.java | 13 +- .../business/mapper/PlatformOrderMapper.java | 2 + .../mapper/xml/PlatformOrderMapper.xml | 31 +++- .../service/IPlatformOrderService.java | 11 +- .../impl/PlatformOrderServiceImpl.java | 5 + .../business/vo/PlatformOrderFront.java | 12 ++ 8 files changed, 142 insertions(+), 67 deletions(-) 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 c5c4db0c1..22df5e56b 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 @@ -468,7 +468,7 @@ public class InvoiceController { ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(), shopIds); List shopIdList = Arrays.asList(shopIds.split(",")); - List orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1)); + List orders = platformOrderService.findUninvoicedShippingOrdersByShopForClient(shopIdList, Collections.singletonList(1)); IPage page = new Page<>(); page.setRecords(orders); @@ -486,11 +486,11 @@ public class InvoiceController { log.info("User : {} is requesting uninvoiced orders for shops : [{}]", ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(), shopIds); - List> ordersAndStatus = new ArrayList<>(); - List> finalOrderAndStatus = new ArrayList<>(); + // list of orders and their status : // checking shipping data availability List shopIdList = Arrays.asList(shopIds.split(",")); + // fetch order that can be invoice either by shipping or purchase or both List orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1)); if(orders.isEmpty()) return Result.OK("No order to invoice."); @@ -498,74 +498,93 @@ public class InvoiceController { List orderIds = orders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); Map> orderContentMap = platformOrderService.fetchOrderData(orderIds); + Map errorMapToOrderId = new HashMap<>(); + List orderFronts = new ArrayList<>(); + for(Map.Entry> entry : orderContentMap.entrySet()) { PlatformOrderFront orderFront = new PlatformOrderFront(); - boolean hasError = false; - //rename shop id by shop name to prevent it to leak in front - entry.getKey().setShopId(shops.get(entry.getKey().getShopId())); - // checks if logistic channel is missing - if(entry.getKey().getLogisticChannelName().isEmpty() && entry.getKey().getInvoiceLogisticChannelName() == null) { - ordersAndStatus.add(MutableTriple.of(entry.getKey(), "Error : Missing logistic channel for order : " + entry.getKey().getPlatformOrderId(), "")); - hasError = true; - } + BeanUtils.copyProperties(entry.getKey(), orderFront); + //rename shop id by shop name to prevent it to leak in front + orderFront.setShopId(shops.get(orderFront.getShopId())); + // set default value of shipping and purchase availability + orderFront.setShippingAvailable("0"); + orderFront.setPurchaseAvailable("0"); List skuIds = entry.getValue().stream().map(PlatformOrderContent::getSkuId).distinct().collect(Collectors.toList()); // finds the first sku that isn't in db List skuIdsFound = skuService.listByIds(skuIds); if(skuIdsFound.size() != skuIds.size()) { - if(ordersAndStatus.stream().noneMatch(order -> order.getLeft().getId().equals(entry.getKey().getId()))) - ordersAndStatus.add(MutableTriple.of(entry.getKey(), "Error : Missing one or more sku in db for order : " + entry.getKey().getPlatformOrderId(), "Error : Missing one or more sku in db for order : " + entry.getKey().getPlatformOrderId())); - else { - ordersAndStatus.get(ordersAndStatus.size() - 1).setMiddle((ordersAndStatus.get(ordersAndStatus.size() - 1).getMiddle() + " and missing one or more sku in db for order : " + entry.getKey().getPlatformOrderId())); - ordersAndStatus.get(ordersAndStatus.size() - 1).setRight((ordersAndStatus.get(ordersAndStatus.size() - 1).getRight() + " and missing one or more sku in db for order : " + entry.getKey().getPlatformOrderId())); + if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more sku in db for order : " + entry.getKey().getPlatformOrderId()); + else + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku in db"); + + orderFront.setShippingAvailable("-1"); + orderFront.setPurchaseAvailable("-1"); + } + + if(entry.getKey().getShippingInvoiceNumber() == null) { + // checks if logistic channel is missing + if(entry.getKey().getLogisticChannelName().isEmpty() && entry.getKey().getInvoiceLogisticChannelName() == null) { + if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing logistic channel for order : " + entry.getKey().getPlatformOrderId()); + else + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing logistic channel"); + orderFront.setShippingAvailable("-1"); + } + // finds the first product with missing weight + String missingWeightProductId = productService.searchFirstEmptyWeightProduct(skuIds); + if(missingWeightProductId != null) { + if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more weight for order : " + entry.getKey().getPlatformOrderId()); + else + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing weight"); + orderFront.setShippingAvailable("-1"); + } + } + if(entry.getKey().getPurchaseInvoiceNumber() == null) { + // finds the first sku with missing price + String missingPriceSkuId = skuService.searchFirstMissingPriceSku(skuIds); + if(missingPriceSkuId != null) { + if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more sku price for order : " + entry.getKey().getPlatformOrderId()); + else + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku price"); + orderFront.setPurchaseAvailable("-1"); } - hasError = true; } - // finds the first product with missing weight - String missingWeightProductId = productService.searchFirstEmptyWeightProduct(skuIds); - if(missingWeightProductId != null) { - if(ordersAndStatus.stream().noneMatch(order -> order.getLeft().getId().equals(entry.getKey().getId()))) - ordersAndStatus.add(MutableTriple.of(entry.getKey(), "Error : Missing one or more weight for order : " + entry.getKey().getPlatformOrderId(), "")); - else - ordersAndStatus.get(ordersAndStatus.size() - 1).setMiddle((ordersAndStatus.get(ordersAndStatus.size() - 1).getMiddle() + " and missing weight for order : " + entry.getKey().getPlatformOrderId())); - hasError = true; + // set purchase order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) + if(entry.getKey().getProductAvailable() == null) { + orderFront.setProductAvailable("0"); + entry.getKey().setProductAvailable("0"); } - // finds the first sku with missing price - String missingPriceSkuId = skuService.searchFirstMissingPriceSku(skuIds); - if(missingPriceSkuId != null) { - if(ordersAndStatus.stream().noneMatch(order -> order.getLeft().getId().equals(entry.getKey().getId()))) - ordersAndStatus.add(MutableTriple.of(entry.getKey(), "OK", "Error : Missing one or more sku price for order : " + entry.getKey().getPlatformOrderId())); - else - ordersAndStatus.get(ordersAndStatus.size() - 1).setRight( ordersAndStatus.get(ordersAndStatus.size() -1).getRight() + "and missing one or more sku price for order : " + entry.getKey().getPlatformOrderId()); - hasError = true; - } - if(!hasError) ordersAndStatus.add(MutableTriple.of(entry.getKey(), "OK", "OK")); - - if(entry.getKey().getProductAvailable().equals("0") && entry.getKey().getVirtualProductAvailable().equals("1")) - entry.getKey().setProductAvailable("2"); + if(entry.getKey().getProductAvailable().equals("0") && entry.getKey().getVirtualProductAvailable().equals("1") && entry.getKey().getPurchaseInvoiceNumber() == null) + orderFront.setProductAvailable("2"); if(entry.getKey().getPurchaseInvoiceNumber() != null) { PurchaseOrder purchase = purchaseOrderService.getPurchaseByInvoiceNumber(entry.getKey().getPurchaseInvoiceNumber()); - if(purchase.getStatus().equals("1")) - entry.getKey().setProductAvailable("3"); + if(purchase.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) + orderFront.setPurchaseAvailable("1");// invoiced else - entry.getKey().setProductAvailable("4"); + orderFront.setPurchaseAvailable("2");// paid } - BeanUtils.copyProperties(entry.getKey(), orderFront); - finalOrderAndStatus.add(MutableTriple.of(orderFront, ordersAndStatus.get(ordersAndStatus.size() - 1).getMiddle(), ordersAndStatus.get(ordersAndStatus.size() - 1).getRight())); + // set shipping order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) + if(entry.getKey().getShippingInvoiceNumber() != null) { + ShippingInvoice shippingInvoice = iShippingInvoiceService.getShippingInvoice(entry.getKey().getShippingInvoiceNumber()); + if(shippingInvoice.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) { + orderFront.setShippingAvailable("1"); // invoiced + } + else { + orderFront.setShippingAvailable("2"); // paid + } + } + orderFronts.add(orderFront); } - List errorMessages = new ArrayList<>(); - for(MutableTriple orderAndStatus : finalOrderAndStatus) { - if(!orderAndStatus.getMiddle().equals("OK")) { - errorMessages.add(orderAndStatus.getMiddle()); - } - if(!orderAndStatus.getRight().equals("OK")) { - errorMessages.add(orderAndStatus.getRight()); - } - } + List errorMessages = new ArrayList<>(errorMapToOrderId.values()); + // sorting by order time ascending - finalOrderAndStatus = finalOrderAndStatus.stream().sorted(Comparator.comparing(o -> o.getLeft().getOrderTime())).collect(Collectors.toList()); + orderFronts = orderFronts.stream().sorted(Comparator.comparing(PlatformOrderFront::getOrderTime)).collect(Collectors.toList()); // system notification String errors = SECTION_START; int max_entries = 100; @@ -584,14 +603,14 @@ public class InvoiceController { templateParam.put("errors", errors); templateParam.put("current_page", String.valueOf(current_page)); templateParam.put("total_page", String.valueOf(total_page)); - TemplateMessageDTO message = new TemplateMessageDTO("admin", "admin", "Self Service invoicing estimation Errors", templateParam, "expenses_overview_errors"); + TemplateMessageDTO message = new TemplateMessageDTO("admin", "Gauthier", "Self Service invoicing estimation Errors", templateParam, "expenses_overview_errors"); ISysBaseApi.sendTemplateAnnouncement(message); } } - IPage> page = new Page<>(); - page.setRecords(finalOrderAndStatus); - page.setTotal(finalOrderAndStatus.size()); + IPage page = new Page<>(); + page.setRecords(orderFronts); + page.setTotal(orderFronts.size()); return Result.OK(page); } 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 a7b10e04d..236a25b85 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,7 +92,7 @@ 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.findUninvoicedOrdersByShopForClient(shopIds, Arrays.asList(1,2,3)); + 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(); 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 c05fae5e4..4c1821854 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 @@ -90,7 +90,12 @@ public class PurchaseOrder implements Serializable { @Excel(name = "最终金额", width = 15) @ApiModelProperty(value = "最终金额") private java.math.BigDecimal finalAmount; - + /** + * paid amount + */ + @Excel(name = "已付金额", width = 15) + @ApiModelProperty(value = "已付金额") + private java.math.BigDecimal paidAmount; /** * 订单发票号 */ @@ -98,12 +103,6 @@ public class PurchaseOrder implements Serializable { @ApiModelProperty(value = "订单发票号") private String invoiceNumber; - /** - * Purchase status - */ - @Excel(name = "status", width = 15) - @ApiModelProperty(value = "status") - private String status; /** * Payment document 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 0508b74a5..153bdb06d 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 @@ -185,6 +185,7 @@ public interface PlatformOrderMapper extends BaseMapper { void cancelInvoice(@Param("invoiceNumber") String invoiceNumber); void cancelBatchInvoice(@Param("invoiceNumbers") List invoiceNumbers); + List findUninvoicedShippingOrdersByShopForClient(@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); @@ -209,4 +210,5 @@ public interface PlatformOrderMapper extends BaseMapper { List fetchShippingFeeBillableOrders(); List getPlatformOrdersByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); + } 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 c9dcd2b91..f0ad180d0 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 @@ -548,7 +548,7 @@ WHERE erp_status IN (4,5) AND order_time < #{endDate}; - SELECT * FROM platform_order WHERE erp_status IN @@ -575,6 +575,35 @@ #{shopId} ; + INSERT INTO platform_order_delete(id, create_by, create_time, update_by, 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 900055a72..7f38de0e7 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 @@ -180,11 +180,19 @@ public interface IPlatformOrderService extends IService { void cancelBatchInvoice(List invoiceNumbers); /** - * Find all order that can be invoiced themselves. + * Find all order that can be invoiced (shipping only). * @param shopIds list of shop id * @param erpStatuses list of erp_status * @return list of orders */ + List findUninvoicedShippingOrdersByShopForClient(List shopIds, List erpStatuses); + + /** + * Find all order that can be invoiced (shipping and purchase). + * @param shopIds + * @param erpStatuses + * @return + */ List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses); /** * Get ids of all order that can be invoiced by small clients (type 2) themselves. @@ -219,4 +227,5 @@ public interface IPlatformOrderService extends IService { */ List fetchShippingFeeBillableOrders(); List getPlatformOrdersByInvoiceNumber(String invoiceNumber); + } 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 b6ebfc842..61edab317 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 @@ -399,6 +399,11 @@ public class PlatformOrderServiceImpl extends ServiceImpl findUninvoicedShippingOrdersByShopForClient(List shopIds, List erpStatuses) { + return platformOrderMap.findUninvoicedShippingOrdersByShopForClient(shopIds, erpStatuses); + } + @Override public List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses) { return platformOrderMap.findUninvoicedOrdersByShopForClient(shopIds, erpStatuses); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java index 4e27b86d9..29a2cc24f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java @@ -93,4 +93,16 @@ public class PlatformOrderFront { @Excel(name = "有货(1=有,0=没有)", width = 15) @ApiModelProperty(value = "有货(1=有,0=没有)") private String productAvailable; + /** + * 可开物流票(0=不可,1=可) + */ + @Excel(name = "可开物流票(0=不可,1=可)", width = 15) + @ApiModelProperty(value = "可开物流票(0=不可,1=可)") + private String shippingAvailable; + /** + * 可开采购票(0=不可,1=可) + */ + @Excel(name = "可开采购票(0=不可,1=可)", width = 15) + @ApiModelProperty(value = "可开采购票(0=不可,1=可)") + private String purchaseAvailable; } From 0795f245c2aa65fd9bc475e471c16241424ae6fc Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Wed, 10 Jan 2024 11:57:59 +0100 Subject: [PATCH 2/5] fix : added enum to describe invoice status and product availability --- .../shippingInvoice/InvoiceController.java | 34 ++++++++++--------- .../business/vo/PlatformOrderFront.java | 24 +++++++++++++ 2 files changed, 42 insertions(+), 16 deletions(-) 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 22df5e56b..5e6ca6abb 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 @@ -486,7 +486,6 @@ public class InvoiceController { log.info("User : {} is requesting uninvoiced orders for shops : [{}]", ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(), shopIds); - // list of orders and their status : // checking shipping data availability List shopIdList = Arrays.asList(shopIds.split(",")); @@ -508,8 +507,8 @@ public class InvoiceController { //rename shop id by shop name to prevent it to leak in front orderFront.setShopId(shops.get(orderFront.getShopId())); // set default value of shipping and purchase availability - orderFront.setShippingAvailable("0"); - orderFront.setPurchaseAvailable("0"); + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Available.code); + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Available.code); List skuIds = entry.getValue().stream().map(PlatformOrderContent::getSkuId).distinct().collect(Collectors.toList()); // finds the first sku that isn't in db List skuIdsFound = skuService.listByIds(skuIds); @@ -519,8 +518,8 @@ public class InvoiceController { else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku in db"); - orderFront.setShippingAvailable("-1"); - orderFront.setPurchaseAvailable("-1"); + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); } if(entry.getKey().getShippingInvoiceNumber() == null) { @@ -530,7 +529,7 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing logistic channel for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing logistic channel"); - orderFront.setShippingAvailable("-1"); + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); } // finds the first product with missing weight String missingWeightProductId = productService.searchFirstEmptyWeightProduct(skuIds); @@ -539,7 +538,7 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more weight for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing weight"); - orderFront.setShippingAvailable("-1"); + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); } } if(entry.getKey().getPurchaseInvoiceNumber() == null) { @@ -550,32 +549,35 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more sku price for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku price"); - orderFront.setPurchaseAvailable("-1"); + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); } } // set purchase order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) if(entry.getKey().getProductAvailable() == null) { - orderFront.setProductAvailable("0"); - entry.getKey().setProductAvailable("0"); + orderFront.setProductAvailable(PlatformOrderFront.productStatus.Unavailable.code); + entry.getKey().setProductAvailable(PlatformOrderFront.productStatus.Unavailable.code); } - if(entry.getKey().getProductAvailable().equals("0") && entry.getKey().getVirtualProductAvailable().equals("1") && entry.getKey().getPurchaseInvoiceNumber() == null) - orderFront.setProductAvailable("2"); + if(entry.getKey().getProductAvailable().equals(PlatformOrderFront.productStatus.Unavailable.code) + && entry.getKey().getVirtualProductAvailable().equals(PlatformOrderFront.productStatus.Available.code) + && entry.getKey().getPurchaseInvoiceNumber() == null + ) + orderFront.setProductAvailable(PlatformOrderFront.productStatus.Ordered.code); if(entry.getKey().getPurchaseInvoiceNumber() != null) { PurchaseOrder purchase = purchaseOrderService.getPurchaseByInvoiceNumber(entry.getKey().getPurchaseInvoiceNumber()); if(purchase.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) - orderFront.setPurchaseAvailable("1");// invoiced + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Invoiced.code);// invoiced else - orderFront.setPurchaseAvailable("2");// paid + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Paid.code);// paid } // set shipping order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) if(entry.getKey().getShippingInvoiceNumber() != null) { ShippingInvoice shippingInvoice = iShippingInvoiceService.getShippingInvoice(entry.getKey().getShippingInvoiceNumber()); if(shippingInvoice.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) { - orderFront.setShippingAvailable("1"); // invoiced + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Invoiced.code); // invoiced } else { - orderFront.setShippingAvailable("2"); // paid + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Paid.code); // paid } } orderFronts.add(orderFront); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java index 29a2cc24f..702824bd1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderFront.java @@ -105,4 +105,28 @@ public class PlatformOrderFront { @Excel(name = "可开采购票(0=不可,1=可)", width = 15) @ApiModelProperty(value = "可开采购票(0=不可,1=可)") private String purchaseAvailable; + + public enum invoiceStatus { + Unavailable("-1"), + Available("0"), + Invoiced("1"), + Paid("2"); + + public final String code; + + invoiceStatus(String code) { + this.code = code; + } + } + public enum productStatus { + Unavailable("0"), + Available("1"), + Ordered("2"); + + public final String code; + + productStatus(String code) { + this.code = code; + } + } } From f6518e327e1604626b60ee79f109fb5780d30a09 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Wed, 10 Jan 2024 12:10:47 +0100 Subject: [PATCH 3/5] Update InvoiceController.java notification dest --- .../controller/admin/shippingInvoice/InvoiceController.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/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 5e6ca6abb..69fea7388 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 @@ -605,7 +605,7 @@ public class InvoiceController { templateParam.put("errors", errors); templateParam.put("current_page", String.valueOf(current_page)); templateParam.put("total_page", String.valueOf(total_page)); - TemplateMessageDTO message = new TemplateMessageDTO("admin", "Gauthier", "Self Service invoicing estimation Errors", templateParam, "expenses_overview_errors"); + TemplateMessageDTO message = new TemplateMessageDTO("admin", "admin", "Self Service invoicing estimation Errors", templateParam, "expenses_overview_errors"); ISysBaseApi.sendTemplateAnnouncement(message); } } From 3fdf1d27ebd987f9bf814a5c0d9f85839be53b6e Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Thu, 11 Jan 2024 11:41:01 +0100 Subject: [PATCH 4/5] 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