| | |
| | | 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 实现类 |
| | |
| | | |
| | | @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)); |
| | | }); |
| | | } |
| | | |
| | | } |