From 8b4c629632a1453f5293c851453e0e462037ffb8 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 12 Sep 2024 20:26:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=80=E5=94=AE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=8A=A5=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PurchaseOrderService.java | 6 +- .../controller/SaleOrderController.java | 11 +- .../saleOrder/dto/SaleOrderReportRequest.java | 70 +++++++++ .../saleOrder/service/SaleOrderService.java | 135 +++++++++++++++++- 4 files changed, 211 insertions(+), 11 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/saleOrder/dto/SaleOrderReportRequest.java diff --git a/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java b/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java index 61ae81ee..ce410843 100644 --- a/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java +++ b/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java @@ -317,7 +317,7 @@ public class PurchaseOrderService select to_char(date_trunc('${timeDimension}', o.start_time), 'YYYY-MM-DD') as time, - array_agg(id) as ids + array_agg(o.id) as ids <#list reportFields as field> @@ -336,8 +336,8 @@ public class PurchaseOrderService <#if field.fieldName == 'total'>, ${field.function}(o.amount * o.price + o.other_fee) as ${underScore(field.fieldName)}_${field.function} - <#if field.fieldName == 'receivedAmount'>, ${field.function}((select round(sum(sz)::numeric, 2) from t_weight_device_data where purchase_order_id = o.id )) as ${underScore(field.fieldName)}_${field.function} - <#if field.fieldName == 'leftAmount'>, ${field.function}( coalesce(o.amount, 0) - coalesce( (select round(sum(sz)::numeric, 2) from t_weight_device_data where purchase_order_id = o.id ) , 0)) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'receivedAmount'>, ${field.function}((select round(sum(sz)::::numeric, 2) from t_weight_device_data where purchase_order_id = o.id )) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'leftAmount'>, ${field.function}( coalesce(o.amount, 0) - coalesce( (select round(sum(sz)::::numeric, 2) from t_weight_device_data where purchase_order_id = o.id ) , 0)) as ${underScore(field.fieldName)}_${field.function} <#if field.fieldName == 'totalCarCount'>, ${field.function}( (select count(1) from t_weight_device_data where purchase_order_id = o.id ) ) as ${underScore(field.fieldName)}_${field.function} diff --git a/src/main/java/cn/lihongjie/coal/saleOrder/controller/SaleOrderController.java b/src/main/java/cn/lihongjie/coal/saleOrder/controller/SaleOrderController.java index b9308613..39a9b9a7 100644 --- a/src/main/java/cn/lihongjie/coal/saleOrder/controller/SaleOrderController.java +++ b/src/main/java/cn/lihongjie/coal/saleOrder/controller/SaleOrderController.java @@ -4,10 +4,7 @@ import cn.lihongjie.coal.annotation.OrgScope; import cn.lihongjie.coal.annotation.SysLog; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; -import cn.lihongjie.coal.saleOrder.dto.CreateSaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.SaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.UpdateSaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.UpdateWeightDataDto; +import cn.lihongjie.coal.saleOrder.dto.*; import cn.lihongjie.coal.saleOrder.service.SaleOrderService; import lombok.extern.slf4j.Slf4j; @@ -63,4 +60,10 @@ public class SaleOrderController { public Page list(@RequestBody CommonQuery request) { return this.service.list(request); } + + + @PostMapping("/report") + public Object report(@RequestBody SaleOrderReportRequest request) { + return this.service.report(request); + } } diff --git a/src/main/java/cn/lihongjie/coal/saleOrder/dto/SaleOrderReportRequest.java b/src/main/java/cn/lihongjie/coal/saleOrder/dto/SaleOrderReportRequest.java new file mode 100644 index 00000000..8e185fe1 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/saleOrder/dto/SaleOrderReportRequest.java @@ -0,0 +1,70 @@ +package cn.lihongjie.coal.saleOrder.dto; + +import cn.lihongjie.coal.base.dto.CommonQuery; + +import lombok.Data; + +import org.hibernate.annotations.Comment; + +import java.time.LocalDate; +import java.util.*; + +@Data +public class SaleOrderReportRequest extends CommonQuery { + + @Comment( + """ +时间维度 +year +month + +""") + private String timeDimension; + + @Comment( + """ +统计字段 + +客户 supplierId +产品 productId + + +""") + private List reportFields; + + /** + * + * 采购数量 amount + * 已发货数量 receivedAmount + * 未发货数量 leftAmount + * 车数 totalCarCount + * 单价 price + * 总价 total + * 其他费用 otherFee + * + * + */ + private List fieldInfos; + + private LocalDate startTime; + private LocalDate endTime; + + /** 过滤条件 */ + private List supplierIds; + + private List productIds; + + + + + + + + @Data + public static class FieldInfo { + private String fieldName; + + @Comment("sum avg count max min") + private String function; + } +} diff --git a/src/main/java/cn/lihongjie/coal/saleOrder/service/SaleOrderService.java b/src/main/java/cn/lihongjie/coal/saleOrder/service/SaleOrderService.java index f12d4ad3..f892cab2 100644 --- a/src/main/java/cn/lihongjie/coal/saleOrder/service/SaleOrderService.java +++ b/src/main/java/cn/lihongjie/coal/saleOrder/service/SaleOrderService.java @@ -5,14 +5,12 @@ import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.base.service.BaseService; import cn.lihongjie.coal.common.Ctx; +import cn.lihongjie.coal.common.FreeMakerUtils; import cn.lihongjie.coal.common.JpaUtils; import cn.lihongjie.coal.exception.BizException; import cn.lihongjie.coal.organizationConfig.entity.OrganizationConfigEntity; import cn.lihongjie.coal.organizationConfig.service.OrganizationConfigService; -import cn.lihongjie.coal.saleOrder.dto.CreateSaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.SaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.UpdateSaleOrderDto; -import cn.lihongjie.coal.saleOrder.dto.UpdateWeightDataDto; +import cn.lihongjie.coal.saleOrder.dto.*; import cn.lihongjie.coal.saleOrder.entity.SaleOrderEntity; import cn.lihongjie.coal.saleOrder.mapper.SaleOrderMapper; import cn.lihongjie.coal.saleOrder.repository.SaleOrderRepository; @@ -21,6 +19,8 @@ import cn.lihongjie.coal.weightDeviceData.entity.WeightDeviceDataEntity; import cn.lihongjie.coal.weightDeviceData.mapper.WeightDeviceDataMapper; import cn.lihongjie.coal.weightDeviceData.repository.WeightDeviceDataRepository; +import com.google.common.base.CaseFormat; + import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Tuple; @@ -33,6 +33,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; @@ -41,8 +42,11 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; @Service @Slf4j @@ -287,4 +291,127 @@ public class SaleOrderService extends BaseService()); + } + + String sql = + FreeMakerUtils.render( + """ + + + select to_char(date_trunc('${timeDimension}', o.start_time), 'YYYY-MM-DD') as time, + array_agg(o.id) as ids + <#list reportFields as field> + + + + + <#if field == 'supplierId'>,s.id as supplier_id, max(s.name) as supplier_name, max(s.code) as supplier_code + <#if field == 'productId'>,p.id as product_id, max(p.name) as product_name, max(p.code) as product_code + + + + <#list fieldInfos as field> + + <#if field.fieldName == 'price'>, ${field.function}(o.price) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'otherFee'>, ${field.function}(o.other_fee) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'amount'>, ${field.function}(o.amount) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'total'>, ${field.function}(o.amount * o.price + o.other_fee) as ${underScore(field.fieldName)}_${field.function} + + + <#if field.fieldName == 'receivedAmount'>, ${field.function}((select round(sum(sz)::::numeric, 2) from t_weight_device_data where purchase_order_id = o.id )) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'leftAmount'>, ${field.function}( coalesce(o.amount, 0) - coalesce( (select round(sum(sz)::::numeric, 2) from t_weight_device_data where purchase_order_id = o.id ) , 0)) as ${underScore(field.fieldName)}_${field.function} + <#if field.fieldName == 'totalCarCount'>, ${field.function}( (select count(1) from t_weight_device_data where purchase_order_id = o.id ) ) as ${underScore(field.fieldName)}_${field.function} + + + + + from + t_sale_order o + left join t_product p on o.product_info_id = p.id + left join t_supplier s on o.supplier_id = s.id + + + where 1=1 + + <#if startTime??> and o.start_time >= :startTime + + <#if endTime??> and o.start_time <= :endTime + + <#if supplierIds??> and s.id in :supplierIds + + <#if productIds??> and p.id in :productIds + + + + + group by 1, date_trunc('${timeDimension}', o.start_time) + <#list reportFields as field> + + + <#if field == 'supplierId'>,s.id + <#if field == 'productId'>,p.id + + + + + + + + + + + + """, + request); + + var countSql = "select count(1) from (" + sql + ") as t"; + + var selectSql = + "select * from (" + + sql + + ") as t limit " + + request.getPageSize() + + " offset " + + request.getPageNo() * request.getPageSize(); + + Integer count = JpaUtils.execNativeQuery(em, countSql, request, Integer.class).get(0); + + List data = JpaUtils.execNativeQuery(em, selectSql, request, Tuple.class); + + var resultList = JpaUtils.convertTuplesToMap(data); + + var ans = + resultList.stream() + .map( + x -> + ((Map) x) + .entrySet().stream() + .collect( + Collectors.toMap( + (Map.Entry e) -> + CaseFormat + .LOWER_UNDERSCORE + .to( + CaseFormat + .LOWER_CAMEL, + e.getKey() + .toString()), + e -> + ObjectUtils + .defaultIfNull( + e + .getValue(), + "")))) + .toList(); + + return new PageImpl<>(ans, PageRequest.of(0, request.getPageSize()), count); + } }