From 7e5bd67e71a14cefffcde77692d9217e0d8eb9eb Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Wed, 11 Sep 2024 20:44:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=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 --- .../controller/PurchaseOrderController.java | 10 +- .../dto/PurchaseOrderReportRequest.java | 70 +++++++++ .../service/PurchaseOrderService.java | 135 +++++++++++++++++- 3 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/purchaseOrder/dto/PurchaseOrderReportRequest.java diff --git a/src/main/java/cn/lihongjie/coal/purchaseOrder/controller/PurchaseOrderController.java b/src/main/java/cn/lihongjie/coal/purchaseOrder/controller/PurchaseOrderController.java index 90d445a2..c527fcd0 100644 --- a/src/main/java/cn/lihongjie/coal/purchaseOrder/controller/PurchaseOrderController.java +++ b/src/main/java/cn/lihongjie/coal/purchaseOrder/controller/PurchaseOrderController.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.purchaseOrder.dto.CreatePurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.PurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.UpdatePurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.UpdateWeightDataDto; +import cn.lihongjie.coal.purchaseOrder.dto.*; import cn.lihongjie.coal.purchaseOrder.service.PurchaseOrderService; import lombok.extern.slf4j.Slf4j; @@ -63,4 +60,9 @@ public class PurchaseOrderController { public Page list(@RequestBody CommonQuery request) { return this.service.list(request); } + + @PostMapping("/report") + public Object report(@RequestBody PurchaseOrderReportRequest request) { + return this.service.report(request); + } } diff --git a/src/main/java/cn/lihongjie/coal/purchaseOrder/dto/PurchaseOrderReportRequest.java b/src/main/java/cn/lihongjie/coal/purchaseOrder/dto/PurchaseOrderReportRequest.java new file mode 100644 index 00000000..0a71e66a --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/purchaseOrder/dto/PurchaseOrderReportRequest.java @@ -0,0 +1,70 @@ +package cn.lihongjie.coal.purchaseOrder.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 PurchaseOrderReportRequest extends CommonQuery { + + @Comment( + """ +时间维度 +year +month + +""") + private String timeDimension; + + @Comment( + """ +统计字段 + +供应商 supplierId +煤源 coalInfoId + + +""") + private List reportFields; + + /** + * + * 采购数量 amount + * 已收货数量 receivedAmount + * 未收货数量 leftAmount + * 车数 totalCarCount + * 单价 price + * 总价 total + * 其他费用 otherFee + * + * + */ + private List fieldInfos; + + private LocalDate startTime; + private LocalDate endTime; + + /** 过滤条件 */ + private List supplierIds; + + private List coalInfoIds; + + + + + + + + @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/purchaseOrder/service/PurchaseOrderService.java b/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java index a28bd02e..61ae81ee 100644 --- a/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.java +++ b/src/main/java/cn/lihongjie/coal/purchaseOrder/service/PurchaseOrderService.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.purchaseOrder.dto.CreatePurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.PurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.UpdatePurchaseOrderDto; -import cn.lihongjie.coal.purchaseOrder.dto.UpdateWeightDataDto; +import cn.lihongjie.coal.purchaseOrder.dto.*; import cn.lihongjie.coal.purchaseOrder.entity.PurchaseOrderEntity; import cn.lihongjie.coal.purchaseOrder.mapper.PurchaseOrderMapper; import cn.lihongjie.coal.purchaseOrder.repository.PurchaseOrderRepository; @@ -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 @@ -298,4 +302,127 @@ public class PurchaseOrderService } } } + + @PersistenceContext EntityManager em; + + public Object report(PurchaseOrderReportRequest request) { + + if (CollectionUtils.isEmpty(request.getFieldInfos())) { + request.setFieldInfos(new ArrayList<>()); + } + + String sql = + FreeMakerUtils.render( + """ + + + select to_char(date_trunc('${timeDimension}', o.start_time), 'YYYY-MM-DD') as time, + array_agg(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 == 'coalInfoId'>,c.id as coal_info_id, max(c.name) as coal_info_name, max(c.code) as coal_info_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_purchase_order o + left join t_coal_info c on o.coal_info_id = c.id + left join t_supplier s on c.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 coalInfoIds??> and c.id in :coalInfoIds + + + + + group by 1, date_trunc('${timeDimension}', o.start_time) + <#list reportFields as field> + + + <#if field == 'supplierId'>,s.id + <#if field == 'coalInfoId'>,c.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); + } + }