From 006020bc9a87dc40c2e73bc50f244b348b831de1 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 03 十一月 2026 13:41:56 +0800
Subject: [PATCH] 恢复 ERP 采购入库/退货后端,补齐采购统计接口
---
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/statistics/ErpPurchaseStatisticsServiceImpl.java | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 108 insertions(+), 0 deletions(-)
diff --git a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/statistics/ErpPurchaseStatisticsServiceImpl.java b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/statistics/ErpPurchaseStatisticsServiceImpl.java
index d725153..5e1ee7b 100644
--- a/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/statistics/ErpPurchaseStatisticsServiceImpl.java
+++ b/yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/statistics/ErpPurchaseStatisticsServiceImpl.java
@@ -1,11 +1,32 @@
package cn.iocoder.yudao.module.erp.service.statistics;
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
+import cn.iocoder.yudao.module.erp.controller.admin.statistics.vo.purchase.ErpPurchasePriceAnalysisRespVO;
+import cn.iocoder.yudao.module.erp.controller.admin.statistics.vo.purchase.ErpPurchaseStatisticsReqVO;
+import cn.iocoder.yudao.module.erp.controller.admin.statistics.vo.purchase.ErpPurchaseSummaryRespVO;
+import cn.iocoder.yudao.module.erp.controller.admin.statistics.vo.purchase.ErpPurchaseSupplierStatisticsRespVO;
+import cn.iocoder.yudao.module.erp.controller.admin.statistics.vo.purchase.ErpPurchaseUncompletedOrderRespVO;
+import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
+import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;
import cn.iocoder.yudao.module.erp.dal.mysql.statistics.ErpPurchaseStatisticsMapper;
+import cn.iocoder.yudao.module.mdm.api.item.MdmItemApi;
+import cn.iocoder.yudao.module.mdm.api.item.dto.MdmItemRespDTO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
/**
* ERP 閲囪喘缁熻 Service 瀹炵幇绫�
@@ -17,10 +38,97 @@
@Resource
private ErpPurchaseStatisticsMapper purchaseStatisticsMapper;
+ @Resource
+ private ErpPurchaseOrderItemMapper purchaseOrderItemMapper;
+ @Resource
+ private MdmItemApi mdmItemApi;
@Override
public BigDecimal getPurchasePrice(LocalDateTime beginTime, LocalDateTime endTime) {
return purchaseStatisticsMapper.getPurchasePrice(beginTime, endTime);
}
+ @Override
+ public ErpPurchaseSummaryRespVO getPurchaseSummary() {
+ ErpPurchaseSummaryRespVO summary = purchaseStatisticsMapper.selectPurchaseSummary();
+ return summary != null ? summary : new ErpPurchaseSummaryRespVO()
+ .setTotalOrderCount(0L).setTotalOrderAmount(BigDecimal.ZERO)
+ .setTotalInCount(0L).setTotalInAmount(BigDecimal.ZERO)
+ .setTotalReturnCount(0L).setTotalReturnAmount(BigDecimal.ZERO);
+ }
+
+ @Override
+ public PageResult<ErpPurchaseSupplierStatisticsRespVO> getSupplierStatistics(ErpPurchaseStatisticsReqVO reqVO) {
+ Page<ErpPurchaseSupplierStatisticsRespVO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());
+ purchaseStatisticsMapper.selectSupplierStatistics(page, reqVO);
+ return new PageResult<>(page.getRecords(), page.getTotal());
+ }
+
+ @Override
+ public PageResult<ErpPurchasePriceAnalysisRespVO> getPriceAnalysis(ErpPurchaseStatisticsReqVO reqVO) {
+ Page<ErpPurchasePriceAnalysisRespVO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());
+ purchaseStatisticsMapper.selectPriceAnalysis(page, reqVO);
+ fillProductInfo(page.getRecords());
+ return new PageResult<>(page.getRecords(), page.getTotal());
+ }
+
+ @Override
+ public PageResult<ErpPurchaseUncompletedOrderRespVO> getUncompletedOrders(ErpPurchaseStatisticsReqVO reqVO) {
+ Page<ErpPurchaseUncompletedOrderRespVO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());
+ purchaseStatisticsMapper.selectUncompletedOrders(page, reqVO);
+ fillUncompletedOrderInfo(page.getRecords());
+ return new PageResult<>(page.getRecords(), page.getTotal());
+ }
+
+ /**
+ * 琛ュ叏浜у搧鍚嶇О銆佹潯鐮侊紝骞惰绠椾环鏍煎彉鍖栫巼
+ */
+ private void fillProductInfo(List<ErpPurchasePriceAnalysisRespVO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return;
+ }
+ Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
+ convertSet(list, ErpPurchasePriceAnalysisRespVO::getProductId));
+ list.forEach(vo -> {
+ MapUtils.findAndThen(itemMap, vo.getProductId(), item -> vo
+ .setProductName(item.getName()).setProductBarCode(item.getBarCode()));
+ // 浠锋牸鍙樺寲鐜� = (鏈�杩戜环鏍� - 骞冲潎浠锋牸) / 骞冲潎浠锋牸 脳 100
+ if (vo.getLatestPrice() == null || vo.getAvgPrice() == null
+ || vo.getAvgPrice().compareTo(BigDecimal.ZERO) == 0) {
+ vo.setPriceChangeRate(BigDecimal.ZERO);
+ return;
+ }
+ vo.setPriceChangeRate(vo.getLatestPrice().subtract(vo.getAvgPrice())
+ .multiply(BigDecimal.valueOf(100))
+ .divide(vo.getAvgPrice(), 2, RoundingMode.HALF_UP));
+ });
+ }
+
+ /**
+ * 琛ュ叏浜у搧鍚嶇О锛屽苟璁$畻鏈畬鎴愰噾棰�
+ */
+ private void fillUncompletedOrderInfo(List<ErpPurchaseUncompletedOrderRespVO> list) {
+ if (CollUtil.isEmpty(list)) {
+ return;
+ }
+ List<ErpPurchaseOrderItemDO> orderItems = purchaseOrderItemMapper.selectListByOrderIds(
+ convertSet(list, ErpPurchaseUncompletedOrderRespVO::getOrderId));
+ Map<Long, List<ErpPurchaseOrderItemDO>> orderItemMap = convertMultiMap(orderItems, ErpPurchaseOrderItemDO::getOrderId);
+ Map<Long, MdmItemRespDTO> itemMap = mdmItemApi.getItemMap(
+ convertSet(orderItems, ErpPurchaseOrderItemDO::getProductId));
+ list.forEach(vo -> {
+ List<ErpPurchaseOrderItemDO> items = orderItemMap.getOrDefault(vo.getOrderId(), Collections.emptyList());
+ vo.setProductNames(items.stream()
+ .map(item -> {
+ MdmItemRespDTO mdmItem = itemMap.get(item.getProductId());
+ return mdmItem != null ? mdmItem.getName() : "ID=" + item.getProductId();
+ })
+ .distinct()
+ .collect(Collectors.joining("锛�")));
+ BigDecimal orderAmount = vo.getOrderAmount() != null ? vo.getOrderAmount() : BigDecimal.ZERO;
+ BigDecimal inAmount = vo.getInAmount() != null ? vo.getInAmount() : BigDecimal.ZERO;
+ vo.setUncompletedAmount(orderAmount.subtract(inAmount));
+ });
+ }
+
}
--
Gitblit v1.9.3