package com.ruoyi.account.service.impl;
|
|
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.BalanceChangeRecord;
|
import com.ruoyi.account.dto.BalanceQuery;
|
import com.ruoyi.account.mapper.BalanceChangeRecordMapper;
|
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.bean.BeanUtils;
|
import com.ruoyi.other.api.domain.ShopBalanceStatement;
|
import com.ruoyi.other.api.feignClient.ShopBalanceStatementClient;
|
import org.springframework.stereotype.Service;
|
|
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 ShopBalanceStatementClient shopBalanceStatementClient;
|
|
@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;
|
}
|
|
@Override
|
public CommissionStatistics commissionStatistics(Page<BalanceChangeRecord> page, BalanceChangeRecord balanceChangeRecord) {
|
List<BalanceChangeRecord> balanceChangeRecordList = this.baseMapper.selectBalanceChangeRecordList(balanceChangeRecord);
|
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);
|
return new CommissionStatistics(totalCommission, balanceChangeRecordIPage);
|
}
|
|
@Override
|
public WalletStatistics walletStatistics(Page<BalanceChangeRecord> page, BalanceChangeRecord balanceChangeRecord) {
|
ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement();
|
shopBalanceStatement.setType(4);
|
|
R<List<ShopBalanceStatement>> r;
|
try {
|
r = shopBalanceStatementClient.getList(shopBalanceStatement);
|
} catch (Exception e) {
|
log.error("获取店铺余额对账单列表时出错", e);
|
return null;
|
}
|
|
if (R.isError(r)) {
|
return null;
|
}
|
|
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);
|
}
|
|
walletStatisticsDetailList.addAll(r.getData().stream().map(this::createWalletStatisticsDetail).collect(Collectors.toList()));
|
|
// 按时间排序(倒序)
|
walletStatisticsDetailList.sort(Comparator.comparing(WalletStatisticsDetail::getCreateTime).reversed());
|
|
long current = page.getCurrent();
|
long size = page.getSize();
|
int fromIndex = (int) (current - 1);
|
int toIndex = (int) Math.min(fromIndex + size, walletStatisticsDetailList.size());
|
|
if (fromIndex < 0 || toIndex > walletStatisticsDetailList.size()) {
|
throw new ServiceException("页面参数无效");
|
}
|
|
List<WalletStatisticsDetail> walletStatisticsDetailList2 = walletStatisticsDetailList.subList(fromIndex, toIndex);
|
|
|
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);
|
|
|
WalletStatistics walletStatistics = new WalletStatistics();
|
Page<WalletStatisticsDetail> page1 = new Page<>();
|
page1.setRecords(walletStatisticsDetailList2);
|
page1.setTotal(walletStatisticsDetailList.size());
|
page1.setCurrent(current);
|
page1.setSize(size);
|
walletStatistics.setPage(page1);
|
walletStatistics.setTotalRecharge(totalRecharge);
|
walletStatistics.setTotalWithdraw(totalWithdraw);
|
walletStatistics.setTotalShopWithdraw(totalShopWithdraw);
|
return walletStatistics;
|
}
|
|
private WalletStatisticsDetail createWalletStatisticsDetail(ShopBalanceStatement item) {
|
WalletStatisticsDetail walletStatisticsDetail = new WalletStatisticsDetail();
|
walletStatisticsDetail.setShopName(item.getShopName());
|
walletStatisticsDetail.setUserName(item.getShopManagerName());
|
walletStatisticsDetail.setUserPhone(item.getPhone());
|
walletStatisticsDetail.setChangeType(4);
|
walletStatisticsDetail.setCreateTime(item.getCreateTime());
|
walletStatisticsDetail.setChangeAmount(item.getVariableAmount());
|
return walletStatisticsDetail;
|
}
|
|
}
|