package com.ydtech.modules.admin.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ydtech.core.page.HttpResult; import com.ydtech.modules.admin.dao.PartnerWalletMapper; import com.ydtech.modules.admin.dao.SysPartnerMapper; import com.ydtech.modules.admin.dao.SysRelationPersonMapper; import com.ydtech.modules.admin.model.SysPartner; import com.ydtech.modules.admin.model.SysRelationPerson; import com.ydtech.modules.admin.model.dto.SysPartnerConsoleDto; import com.ydtech.modules.admin.model.dto.partner.CopartnerAndStudioNumberDTO; import com.ydtech.modules.admin.model.dto.partner.PartnerDataDTO; import com.ydtech.modules.admin.model.vo.DeptBalanceVo; import com.ydtech.modules.admin.service.PartnerWalletService; import com.ydtech.modules.base.controller.BaseController; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * @description: 控制台 钱包管理 合伙人 * @author: wenks * @date: 2025/6/13 15:56 **/ @Service @RequiredArgsConstructor public class PartnerWalletServiceImpl implements PartnerWalletService { private final SysPartnerMapper sysPartnerMapper; private final PartnerWalletMapper partnerWalletMapper; private final SysRelationPersonMapper sysRelationPersonMapper; @Override public HttpResult> queryPartnerStatistics(DeptBalanceVo deptBalanceVo) { Page page = new Page<>(deptBalanceVo.getPageNum(), deptBalanceVo.getPageSize()); IPage sysPartnersPage = sysPartnerMapper.queryPage(page, deptBalanceVo); List userIdList = sysPartnersPage.getRecords() .stream() .map(SysPartnerConsoleDto::getUserId) .collect(Collectors.toList()); // 并行查询统计数据 CompletableFuture> memberFuture = CompletableFuture.supplyAsync( () -> partnerWalletMapper.getMemberNumber(userIdList)); CompletableFuture> premiumFuture = CompletableFuture.supplyAsync( () -> partnerWalletMapper.getTotalPremiums(userIdList, deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate())); CompletableFuture> commissionFuture = CompletableFuture.supplyAsync( () -> partnerWalletMapper.getCommission(userIdList, deptBalanceVo.getBeginDate(), deptBalanceVo.getEndDate())); CompletableFuture> studioFuture = CompletableFuture.supplyAsync( () -> partnerWalletMapper.getCopartnerAndStudioNumber(userIdList)); LambdaQueryWrapper eq = new LambdaQueryWrapper() .eq(SysRelationPerson::getSource, "0") .eq(SysRelationPerson::getType, "1") .in(SysRelationPerson::getSuggestId, userIdList); CompletableFuture> sysRelationPerson = CompletableFuture.supplyAsync( () -> sysRelationPersonMapper.selectList(eq)); CompletableFuture.allOf(memberFuture, premiumFuture, commissionFuture, studioFuture, sysRelationPerson).join(); // 转换为Map Map memberMap = convertToMap(memberFuture.join()); Map premiumMap = convertToMap(premiumFuture.join()); Map commissionMap = convertToMap(commissionFuture.join()); Map studioMap = studioFuture.join().stream() .collect(Collectors.toMap( x -> x.getUserId() + x.getSource() + x.getType(), CopartnerAndStudioNumberDTO::getCount)); Map> collect = sysRelationPerson.join() .stream() .collect(Collectors.groupingBy(SysRelationPerson::getSuggestId, Collectors.mapping(SysRelationPerson::getAgencyLeaderId, Collectors.toList()))); // 填充统计数据 sysPartnersPage.getRecords().forEach(dto -> { dto.setLoginUserId(deptBalanceVo.getUserId()); dto.setLeaderIds(collect.get(dto.getUserId())); dto.setMemberShip(Integer.parseInt(memberMap.getOrDefault(dto.getUserId(), "0"))); dto.setTotalIncome(new BigDecimal(premiumMap.getOrDefault(dto.getUserId(), "0"))); dto.setCommission(new BigDecimal(commissionMap.getOrDefault(dto.getUserId(), "0"))); dto.setNumberPartners(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "00", "0"))); dto.setDirectStudio(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "01", "0"))); dto.setIndirectStudio(Integer.parseInt(studioMap.getOrDefault(dto.getUserId() + "11", "0"))); }); return HttpResult.ok(sysPartnersPage); } private Map convertToMap(List list) { return Optional.ofNullable(list) .orElse(Collections.emptyList()) .stream() .collect(Collectors.toMap(PartnerDataDTO::getUserId, PartnerDataDTO::getData)); } }