luodangjia
2025-01-15 257d66798aa538f8737980f13d94c547bf0b51ea
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/BalanceChangeRecordServiceImpl.java
@@ -1,62 +1,133 @@
package com.ruoyi.account.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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.BalanceChangeRecord;
import com.ruoyi.account.api.model.UserClickLog;
import com.ruoyi.account.api.model.WithdrawalRequests;
import com.ruoyi.account.dto.BalanceQuery;
import com.ruoyi.account.mapper.BalanceChangeRecordMapper;
import com.ruoyi.account.service.AppUserService;
import com.ruoyi.account.service.BalanceChangeRecordService;
import com.ruoyi.account.vo.CommissionStatistics;
import com.ruoyi.account.vo.WalletStatistics;
import com.ruoyi.account.vo.WalletStatisticsDetail;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.other.api.domain.ShopBalanceStatement;
import com.ruoyi.other.api.feignClient.ShopClient;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class BalanceChangeRecordServiceImpl extends ServiceImpl<BalanceChangeRecordMapper, BalanceChangeRecord> implements BalanceChangeRecordService {
    @Resource
    private AppUserService appUserService;
    private ShopClient shopClient;
    @Override
    public IPage<BalanceChangeRecord> pageList(BalanceQuery agentQuery) {
        Page<BalanceChangeRecord> page = new Page<>();
        page.setCurrent(agentQuery.getPageNum());
        page.setSize(agentQuery.getPageSize());
        IPage<BalanceChangeRecord> shopIPage = this.baseMapper.pageList(page, agentQuery);
        return shopIPage;
        return this.baseMapper.pageList(page, agentQuery);
    }
    @Override
    public CommissionStatistics commissionStatistics(Page<BalanceChangeRecord> page, BalanceChangeRecord balanceChangeRecord) {
        List<BalanceChangeRecord> balanceChangeRecordList = this.baseMapper.selectBalanceChangeRecordList(balanceChangeRecord);
        List<AppUser> appUserList = appUserService.list(new LambdaQueryWrapper<AppUser>()
                .like(StringUtils.isNotEmpty(balanceChangeRecord.getUserName()), AppUser::getName, balanceChangeRecord.getUserName())
                .like(StringUtils.isNotEmpty(balanceChangeRecord.getUserPhone()), AppUser::getPhone, balanceChangeRecord.getUserPhone()));
        if (CollectionUtils.isEmpty(appUserList)){
            return new CommissionStatistics();
        BigDecimal totalCommission = balanceChangeRecordList.stream()
                .filter(item -> !(item.getChangeType().equals(2) && item.getChangeType().equals(5)))
                .map(BalanceChangeRecord::getChangeAmount)
                .reduce(BigDecimal.ZERO, BigDecimal::add)
                .setScale(2, RoundingMode.HALF_UP);
        IPage<BalanceChangeRecord> balanceChangeRecordIPage = this.baseMapper.queryCommissionStatistics(page, balanceChangeRecord);
        // 过滤商城购物
        List<BalanceChangeRecord> collect = balanceChangeRecordIPage.getRecords().stream().filter(e -> e.getChangeType() != 5).collect(Collectors.toList());
        for (BalanceChangeRecord changeRecord : collect) {
            if (changeRecord.getBeforeAmount()!=null && changeRecord.getAfterAmount()!=null){
                BigDecimal subtract = changeRecord.getBeforeAmount().subtract(changeRecord.getAfterAmount());
                if (subtract.compareTo(BigDecimal.ZERO)>0){
                    // 减少
                    changeRecord.setChangeAmountString("-¥"+changeRecord.getChangeAmount());
                }else if (subtract.compareTo(BigDecimal.ZERO)<0){
                    changeRecord.setChangeAmountString("+¥"+changeRecord.getChangeAmount());
                }else{
                    changeRecord.setChangeAmountString("¥"+changeRecord.getChangeAmount());
                }
            }
        }
        balanceChangeRecordIPage.setRecords(collect);
        return new CommissionStatistics(totalCommission, balanceChangeRecordIPage);
    }
    @Override
    public WalletStatistics walletStatistics(Page<BalanceChangeRecord> page, BalanceChangeRecord balanceChangeRecord) {
        ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement();
        shopBalanceStatement.setType(1);
        List<BalanceChangeRecord> balanceChangeRecordList = this.baseMapper.selectBalanceChangeRecordList(balanceChangeRecord);
        List<WalletStatisticsDetail> walletStatisticsDetailList = new ArrayList<>();
        for (BalanceChangeRecord changeRecord : balanceChangeRecordList) {
            WalletStatisticsDetail walletStatisticsDetail = new WalletStatisticsDetail();
            BeanUtils.copyBeanProp(walletStatisticsDetail, changeRecord);
            walletStatisticsDetailList.add(walletStatisticsDetail);
        }
        List<Long> appUserIds = appUserList.stream().map(AppUser::getId).collect(Collectors.toList());
        BigDecimal totalCommission = appUserList.stream()
                .map(AppUser::getTotalDistributionAmount)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        // 按时间排序(倒序)
        walletStatisticsDetailList.sort(Comparator.comparing(WalletStatisticsDetail::getCreateTime).reversed());
        long current = page.getCurrent();
        long size = page.getSize();
        if (current < 1) {
            current = 1;
        }
        int fromIndex = (int) ((current - 1) * size);
        int toIndex = (int) Math.min(fromIndex + size, walletStatisticsDetailList.size());
        Page<BalanceChangeRecord> changeRecordPage = page(page, new LambdaQueryWrapper<BalanceChangeRecord>()
                .in(BalanceChangeRecord::getAppUserId, appUserIds)
                .between(balanceChangeRecord.getStartTime() != null && balanceChangeRecord.getEndTime() != null,
                        BalanceChangeRecord::getCreateTime, balanceChangeRecord.getStartTime(), balanceChangeRecord.getEndTime()));
        return new CommissionStatistics(totalCommission, changeRecordPage);
        Page<WalletStatisticsDetail> walletStatisticsDetailPage = new Page<>();
        WalletStatistics walletStatistics = new WalletStatistics();
        if (fromIndex >= walletStatisticsDetailList.size()) {
            walletStatistics.setPage(walletStatisticsDetailPage);
            return walletStatistics;
        }
        Map<Integer, BigDecimal> shopCommissionMap = walletStatisticsDetailList.stream()
                .collect(Collectors.groupingBy(
                        WalletStatisticsDetail::getChangeType,
                        Collectors.reducing(
                                BigDecimal.ZERO,
                                WalletStatisticsDetail::getChangeAmount,
                                BigDecimal::add
                        )
                ));
        BigDecimal totalRecharge = shopCommissionMap.get(1);
        BigDecimal totalWithdraw = shopCommissionMap.get(2);
        BigDecimal totalShopWithdraw = shopCommissionMap.get(7);
        List<WalletStatisticsDetail> walletStatisticsDetailList2 = walletStatisticsDetailList.subList(fromIndex, toIndex);
        walletStatisticsDetailPage.setCurrent(current);
        walletStatisticsDetailPage.setSize(size);
        walletStatisticsDetailPage.setTotal(walletStatisticsDetailList.size());
        walletStatisticsDetailPage.setRecords(walletStatisticsDetailList2);
        walletStatistics.setPage(walletStatisticsDetailPage);
        walletStatistics.setTotalRecharge(totalRecharge);
        walletStatistics.setTotalWithdraw(totalWithdraw);
        walletStatistics.setTotalShopWithdraw(totalShopWithdraw);
        return walletStatistics;
    }
}