From b8124a880f01a10496f7335b67b249fdb5b8f628 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Fri, 20 Dec 2024 11:27:26 +0100 Subject: [PATCH] feat: client invoicing page optimization with filters etc.. --- .../shippingInvoice/InvoiceController.java | 160 ++---------------- .../business/mapper/PlatformOrderMapper.java | 10 +- .../mapper/xml/PlatformOrderMapper.xml | 104 ++++++++++++ .../service/IPlatformOrderService.java | 4 + .../impl/PlatformOrderServiceImpl.java | 6 + .../business/vo/PlatformOrderFront.java | 2 + 6 files changed, 132 insertions(+), 154 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 9e35e2297..c0139b0e9 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 @@ -529,10 +529,15 @@ public class InvoiceController { @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize, @RequestParam(name = "column", defaultValue = "order_time") String column, - @RequestParam(name = "order", defaultValue = "ASC") String order) { + @RequestParam(name = "order", defaultValue = "ASC") String order, + @RequestParam(name ="shippingAvailable[]", required = false) List shippingAvailable, + @RequestParam(name ="purchaseAvailable[]", required = false) List purchaseAvailable, + @RequestParam(name = "productAvailable[]", required = false) List productAvailable + ) { log.info("User : {} is requesting uninvoiced orders for shops : [{}]", ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(), shopIds); + List productStatuses = productAvailable == null || productAvailable.isEmpty() ? Arrays.asList(Integer.valueOf(PlatformOrderFront.productStatus.Unavailable.code), Integer.valueOf(PlatformOrderFront.productStatus.Available.code), Integer.valueOf(PlatformOrderFront.productStatus.Ordered.code)) : productAvailable; String parsedColumn = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column.replace("_dictText","")); String parsedOrder = order.toUpperCase(); if(!parsedOrder.equals("ASC") && !parsedOrder.equals("DESC")) { @@ -545,158 +550,15 @@ public class InvoiceController { e.printStackTrace(); return Result.error("Error 400 : Bad Request"); } - // checking shipping data availability +// // checking shipping data availability List shopIdList = Arrays.asList(shopIds.split(",")); - // fetch order that can be invoiced either by shipping or purchase or both - List allOrders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, 1, -1); - int total = allOrders.size(); - List orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, pageNo, pageSize); -// LinkedList sortedOrders = orders.stream().sorted(Comparator.comparing(PlatformOrder::getOrderTime)).collect(Collectors.toCollection(LinkedList::new)); - if(orders.isEmpty()) - return Result.OK("No order to invoice."); - Map shops = shopService.listByIds(shopIdList).stream().collect(Collectors.toMap(Shop::getId, Shop::getName)); - List orderIds = orders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); - Map> orderContentMap = platformOrderService.fetchOrderData(orderIds); - // some orders may not have content, so we have to re-add them - if(orderIds.size() != orderContentMap.size()) { - List orderIdsInMap = orderContentMap.keySet().stream().map(PlatformOrder::getId).collect(Collectors.toList()); - List orderIdsWithoutContent = orderIds.stream().filter(id -> !orderIdsInMap.contains(id)).collect(Collectors.toList()); - List ordersWithoutContent = platformOrderService.listByIds(orderIdsWithoutContent); - Map> orderContentMapWithoutContent = new HashMap<>(); - for(PlatformOrder po : ordersWithoutContent) { - orderContentMapWithoutContent.put(po, new ArrayList<>()); - } - orderContentMap.putAll(orderContentMapWithoutContent); - } - Map errorMapToOrderId = new HashMap<>(); - List orderFronts = new ArrayList<>(); - - for(Map.Entry> entry : orderContentMap.entrySet()) { - PlatformOrderFront orderFront = new PlatformOrderFront(); - 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(Available.code); - orderFront.setPurchaseAvailable(Available.code); - - if(entry.getValue().isEmpty()) { - if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) - errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : order has no content : " + entry.getKey().getPlatformOrderId()); - else - errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and has no content"); - orderFront.setShippingAvailable(Unavailable.code); - orderFront.setPurchaseAvailable(Unavailable.code); - orderFronts.add(orderFront); - continue; - } - - 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(!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(Unavailable.code); - orderFront.setPurchaseAvailable(Unavailable.code); - continue; - } - - 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(Unavailable.code); - } - // finds the first product with missing weight - String missingWeightSkuId = skuWeightService.searchFirstEmptyWeightSku(skuIds); - if(missingWeightSkuId != 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(Unavailable.code); - } - } - 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(Unavailable.code); - } - } - - // set purchase order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) - if(entry.getKey().getProductAvailable() == null) { - orderFront.setProductAvailable(PlatformOrderFront.productStatus.Unavailable.code); - entry.getKey().setProductAvailable(PlatformOrderFront.productStatus.Unavailable.code); - } - 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(Invoiced.code);// invoiced - else - orderFront.setPurchaseAvailable(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(Invoiced.code); // invoiced - } - else { - orderFront.setShippingAvailable(Paid.code); // paid - } - } - orderFronts.add(orderFront); - } - - List errorMessages = new ArrayList<>(errorMapToOrderId.values()); - - // sorting by order time ascending - orderFronts = orderFronts.stream().sorted(Comparator.comparing(PlatformOrderFront::getOrderTime)).collect(Collectors.toList()); - // system notification - String errors = SECTION_START; - int max_entries = 100; - int current_page = 0; - int total_page = (int) Math.ceil((double) errorMessages.size() /max_entries); - for(int i = 1; i <= errorMessages.size(); i++) { - if(i%max_entries == 1) { - errors = SECTION_START; - current_page++; - } - errors = errors.concat("
  • " + i + " : " + errorMessages.get(i-1) +"
  • "); - if(i%max_entries==0 || i == errorMessages.size()) { - errors = errors.concat(SECTION_END); - Map templateParam = new HashMap<>(); - templateParam.put("nb_entries", String.valueOf(errorMessages.size())); - 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"); - ISysBaseApi.sendTemplateAnnouncement(message); - } - } + List orders = platformOrderService.fetchUninvoicedOrdersByShopForClientFullSQL(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, pageNo, pageSize, + productStatuses, shippingAvailable, purchaseAvailable); + int total = orders.get(0).getTotalCount(); IPage page = new Page<>(); - page.setRecords(orderFronts); + page.setRecords(orders); page.setSize(pageSize); page.setCurrent(pageNo); page.setTotal(total); 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 cf3be7d1a..e9bbc05a3 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 @@ -6,10 +6,7 @@ import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData; import org.jeecg.modules.business.entity.PlatformOrder; import org.jeecg.modules.business.entity.PlatformOrderShopSync; -import org.jeecg.modules.business.vo.OrderKpi; -import org.jeecg.modules.business.vo.PlatformOrderOption; -import org.jeecg.modules.business.vo.PlatformOrderPage; -import org.jeecg.modules.business.vo.ShippingFeeBillableOrders; +import org.jeecg.modules.business.vo.*; import org.jeecg.modules.business.vo.clientPlatformOrder.ClientPlatformOrderPage; import org.jeecg.modules.business.vo.clientPlatformOrder.section.OrderQuantity; import org.springframework.stereotype.Repository; @@ -193,7 +190,10 @@ public interface PlatformOrderMapper extends BaseMapper { List findUninvoicedShippingOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List fetchUninvoicedPurchaseOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses, - @Param("column") String column, @Param("order") String order, @Param("offset") Integer offset, @Param("size") Integer pageSize); + @Param("column") String column, @Param("order") String order, @Param("offset") Integer offset, @Param("size") Integer pageSize); + List fetchUninvoicedOrdersByShopForClientFullSQL(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses, + @Param("column") String column, @Param("order") String order, @Param("offset") Integer offset, @Param("size") Integer pageSize, + @Param("productStatuses") List productStatuses, @Param("shippingStatuses") List shippingStatuses, @Param("purchaseStatuses") List purchaseStatuses); List findUninvoicedOrderIdsByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List fetchEmptyLogisticChannelOrders(@Param("startDate") String startDate,@Param("endDate") String endDate); 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 46e73dabc..4e2cde8eb 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 @@ -682,6 +682,110 @@ ; + + 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 29a4ab0d5..bb9bbd90d 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 @@ -219,6 +219,10 @@ public interface IPlatformOrderService extends IService { * @return */ List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize); + + List fetchUninvoicedOrdersByShopForClientFullSQL(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize, + List productAvailable, List shippingAvailable, List purchaseAvailable); + /** * Get ids of all order that can be invoiced by small clients (type 2) themselves. * 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 141993102..bdda7a8d6 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 @@ -434,6 +434,12 @@ public class PlatformOrderServiceImpl extends ServiceImpl fetchUninvoicedOrdersByShopForClientFullSQL(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize, + List productAvailable, List shippingAvailable, List purchaseAvailable) { + int offset = (pageNo - 1) * pageSize; + return platformOrderMap.fetchUninvoicedOrdersByShopForClientFullSQL(shopIds, erpStatuses, column, order, offset, pageSize, productAvailable, shippingAvailable, purchaseAvailable); + } @Override public List findUninvoicedOrderIdsByShopForClient(List shopIds, List 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 702824bd1..1b00a316a 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 @@ -106,6 +106,8 @@ public class PlatformOrderFront { @ApiModelProperty(value = "可开采购票(0=不可,1=可)") private String purchaseAvailable; + private Integer totalCount; + public enum invoiceStatus { Unavailable("-1"), Available("0"),