package cn.iocoder.yudao.module.srm.service.statistics; import cn.iocoder.yudao.module.srm.controller.admin.statistics.vo.SrmTenderStatisticsRespVO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmBidAwardDO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderBidDO; import cn.iocoder.yudao.module.srm.dal.dataobject.SrmTenderProjectDO; import cn.iocoder.yudao.module.srm.dal.mysql.SrmBidAwardMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderBidMapper; import cn.iocoder.yudao.module.srm.dal.mysql.SrmTenderProjectMapper; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.stream.Collectors; @Service public class SrmStatisticsServiceImpl implements SrmStatisticsService { @Resource private SrmTenderProjectMapper tenderProjectMapper; @Resource private SrmTenderBidMapper tenderBidMapper; @Resource private SrmBidAwardMapper bidAwardMapper; @Override public SrmTenderStatisticsRespVO getTenderStatistics(String year) { // 查询当年所有招标项目 List projects = tenderProjectMapper.selectList( new LambdaQueryWrapperX() .apply("YEAR(create_time) = {0}", year)); // 查询当年所有定标记录 List awards = bidAwardMapper.selectList( new LambdaQueryWrapperX() .apply("YEAR(create_time) = {0}", year)); // 查询当年所有投标供应商数(去重) List bids = tenderBidMapper.selectList( new LambdaQueryWrapperX() .apply("YEAR(create_time) = {0}", year)); long totalTenderCount = projects.size(); BigDecimal totalTenderAmount = projects.stream() .map(p -> p.getBudgetAmount() != null ? p.getBudgetAmount() : BigDecimal.ZERO) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal totalAwardAmount = awards.stream() .map(a -> a.getAwardAmount() != null ? a.getAwardAmount() : BigDecimal.ZERO) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal savedAmount = totalTenderAmount.subtract(totalAwardAmount); long supplierCount = bids.stream() .map(SrmTenderBidDO::getSupplierId) .distinct() .count(); BigDecimal winRate = BigDecimal.ZERO; if (totalTenderCount > 0) { long awardedProjectCount = awards.stream() .map(SrmBidAwardDO::getTenderProjectId) .distinct() .count(); winRate = BigDecimal.valueOf(awardedProjectCount) .multiply(BigDecimal.valueOf(100)) .divide(BigDecimal.valueOf(totalTenderCount), 1, RoundingMode.HALF_UP); } SrmTenderStatisticsRespVO vo = new SrmTenderStatisticsRespVO(); vo.setTotalTenderCount(totalTenderCount); vo.setTotalTenderAmount(totalTenderAmount); vo.setTotalAwardAmount(totalAwardAmount); vo.setSavedAmount(savedAmount); vo.setWinRate(winRate); vo.setSupplierCount(supplierCount); vo.setPeriod(year); return vo; } }