添加采购订单报表

This commit is contained in:
2024-09-11 20:44:00 +08:00
parent ee6785d4ec
commit 7e5bd67e71
3 changed files with 207 additions and 8 deletions

View File

@@ -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<PurchaseOrderDto> list(@RequestBody CommonQuery request) {
return this.service.list(request);
}
@PostMapping("/report")
public Object report(@RequestBody PurchaseOrderReportRequest request) {
return this.service.report(request);
}
}

View File

@@ -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<String> reportFields;
/**
*
* 采购数量 amount
* 已收货数量 receivedAmount
* 未收货数量 leftAmount
* 车数 totalCarCount
* 单价 price
* 总价 total
* 其他费用 otherFee
*
*
*/
private List<FieldInfo> fieldInfos;
private LocalDate startTime;
private LocalDate endTime;
/** 过滤条件 */
private List<String> supplierIds;
private List<String> coalInfoIds;
@Data
public static class FieldInfo {
private String fieldName;
@Comment("sum avg count max min")
private String function;
}
}

View File

@@ -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>
<#if field == 'coalInfoId'>,c.id as coal_info_id, max(c.name) as coal_info_name, max(c.code) as coal_info_code </#if>
</#list>
<#list fieldInfos as field>
<#if field.fieldName == 'price'>, ${field.function}(o.price) as ${underScore(field.fieldName)}_${field.function} </#if>
<#if field.fieldName == 'otherFee'>, ${field.function}(o.other_fee) as ${underScore(field.fieldName)}_${field.function} </#if>
<#if field.fieldName == 'amount'>, ${field.function}(o.amount) as ${underScore(field.fieldName)}_${field.function} </#if>
<#if field.fieldName == 'total'>, ${field.function}(o.amount * o.price + o.other_fee) as ${underScore(field.fieldName)}_${field.function} </#if>
<#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>
<#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>
<#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} </#if>
</#list>
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>
<#if endTime??> and o.start_time <= :endTime </#if>
<#if supplierIds??> and s.id in :supplierIds </#if>
<#if coalInfoIds??> and c.id in :coalInfoIds </#if>
group by 1, date_trunc('${timeDimension}', o.start_time)
<#list reportFields as field>
<#if field == 'supplierId'>,s.id </#if>
<#if field == 'coalInfoId'>,c.id </#if>
</#list>
""",
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<Tuple> 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);
}
}