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 实现类 * * @author 超级管理员 */ @Service public class ErpPurchaseStatisticsServiceImpl implements ErpPurchaseStatisticsService { @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 getSupplierStatistics(ErpPurchaseStatisticsReqVO reqVO) { Page page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); purchaseStatisticsMapper.selectSupplierStatistics(page, reqVO); return new PageResult<>(page.getRecords(), page.getTotal()); } @Override public PageResult getPriceAnalysis(ErpPurchaseStatisticsReqVO reqVO) { Page page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize()); purchaseStatisticsMapper.selectPriceAnalysis(page, reqVO); fillProductInfo(page.getRecords()); return new PageResult<>(page.getRecords(), page.getTotal()); } @Override public PageResult getUncompletedOrders(ErpPurchaseStatisticsReqVO reqVO) { Page 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 list) { if (CollUtil.isEmpty(list)) { return; } Map 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 list) { if (CollUtil.isEmpty(list)) { return; } List orderItems = purchaseOrderItemMapper.selectListByOrderIds( convertSet(list, ErpPurchaseUncompletedOrderRespVO::getOrderId)); Map> orderItemMap = convertMultiMap(orderItems, ErpPurchaseOrderItemDO::getOrderId); Map itemMap = mdmItemApi.getItemMap( convertSet(orderItems, ErpPurchaseOrderItemDO::getProductId)); list.forEach(vo -> { List 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)); }); } }