ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/BalanceChangeRecord.java
@@ -81,4 +81,8 @@ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; @ApiModelProperty(value = "门店名称") @TableField(exist = false) private String shopName; } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopBalanceStatementClient.java
@@ -6,12 +6,13 @@ import com.ruoyi.other.api.factory.ShopBalanceStatementClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @FeignClient(contextId = "ShopBalanceStatementClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = ShopBalanceStatementClientFallbackFactory.class) public interface ShopBalanceStatementClient { @PostMapping() R<List<ShopBalanceStatement>> getList(ShopBalanceStatement shopBalanceStatement); @PostMapping("/shop-balance-statement/getList") R<List<ShopBalanceStatement>> getList(@RequestBody ShopBalanceStatement shopBalanceStatement); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java
@@ -6,6 +6,7 @@ import com.ruoyi.account.dto.BalanceQuery; import com.ruoyi.account.service.BalanceChangeRecordService; import com.ruoyi.account.vo.CommissionStatistics; import com.ruoyi.account.vo.WalletStatistics; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.poi.ExcelUtil; import io.swagger.annotations.ApiOperation; @@ -23,54 +24,68 @@ @RestController @RequestMapping("/balanceChangeRecord") public class BalanceChangeRecordController { @Resource private BalanceChangeRecordService balanceChangeRecordService; /** * 保存账户流水记录 * @param balanceChangeRecord * @return */ @PostMapping("/saveBalanceChangeRecord") public R saveBalanceChangeRecord(@RequestBody BalanceChangeRecord balanceChangeRecord){ balanceChangeRecordService.save(balanceChangeRecord); return R.ok(); } @PostMapping("/page") @ApiOperation(value = "余额变更明细", tags = {"后台"}) public R<IPage<BalanceChangeRecord>> page(@RequestBody BalanceQuery agentQuery) { @Resource private BalanceChangeRecordService balanceChangeRecordService; return R.ok(balanceChangeRecordService.pageList(agentQuery)); } /** * 用户分佣统计 */ @GetMapping("/commissionStatistics") @ApiOperation(value = "用户分佣统计", tags = "管理后台-财务统计-用户分佣统计") public R<CommissionStatistics> commissionStatistics(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, BalanceChangeRecord balanceChangeRecord) { CommissionStatistics commissionStatistics1 = balanceChangeRecordService.commissionStatistics(Page.of(pageNum, pageSize), balanceChangeRecord); return R.ok(commissionStatistics1); } // /** * 保存账户流水记录 * * @param balanceChangeRecord * @return */ @PostMapping("/saveBalanceChangeRecord") public R saveBalanceChangeRecord(@RequestBody BalanceChangeRecord balanceChangeRecord) { balanceChangeRecordService.save(balanceChangeRecord); return R.ok(); } @PostMapping("/page") @ApiOperation(value = "余额变更明细", tags = {"后台"}) public R<IPage<BalanceChangeRecord>> page(@RequestBody BalanceQuery agentQuery) { return R.ok(balanceChangeRecordService.pageList(agentQuery)); } /** * 用户分佣统计 */ @GetMapping("/commissionStatistics") @ApiOperation(value = "用户分佣统计", tags = "管理后台-财务统计-用户分佣统计") public R<CommissionStatistics> commissionStatistics(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, BalanceChangeRecord balanceChangeRecord) { CommissionStatistics commissionStatistics1 = balanceChangeRecordService.commissionStatistics(Page.of(pageNum, pageSize), balanceChangeRecord); return R.ok(commissionStatistics1); } // // /** // * 导出用户分佣统计 // */ @GetMapping("/commissionExport") @ApiOperation(value = "用户分佣统计导出", tags = "管理后台-财务统计-用户分佣统计") public void commissionExport(HttpServletResponse response, BalanceChangeRecord balanceChangeRecord) { CommissionStatistics commissionStatistics1 = balanceChangeRecordService.commissionStatistics(Page.of(1, Integer.MAX_VALUE), balanceChangeRecord); IPage<BalanceChangeRecord> userPointPage = commissionStatistics1.getUserPointPage(); List<BalanceChangeRecord> userPointList = userPointPage.getRecords(); ExcelUtil<BalanceChangeRecord> util = new ExcelUtil<>(BalanceChangeRecord.class); util.exportExcel(response, userPointList, "用户分佣统计"); } @GetMapping("/commissionExport") @ApiOperation(value = "用户分佣统计导出", tags = "管理后台-财务统计-用户分佣统计") public void commissionExport(HttpServletResponse response, BalanceChangeRecord balanceChangeRecord) { CommissionStatistics commissionStatistics1 = balanceChangeRecordService.commissionStatistics(Page.of(1, Integer.MAX_VALUE), balanceChangeRecord); IPage<BalanceChangeRecord> userPointPage = commissionStatistics1.getUserPointPage(); List<BalanceChangeRecord> userPointList = userPointPage.getRecords(); ExcelUtil<BalanceChangeRecord> util = new ExcelUtil<>(BalanceChangeRecord.class); util.exportExcel(response, userPointList, "用户分佣统计"); } /** * 钱包统计 */ @GetMapping("/walletStatistics") @ApiOperation(value = "钱包统计", tags = "管理后台-财务统计-钱包统计") public R<WalletStatistics> walletStatistics(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, BalanceChangeRecord balanceChangeRecord) { WalletStatistics walletStatistics = balanceChangeRecordService.walletStatistics(Page.of(pageNum, pageSize), balanceChangeRecord); return R.ok(walletStatistics); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/BalanceChangeRecordService.java
@@ -6,9 +6,13 @@ import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.dto.BalanceQuery; import com.ruoyi.account.vo.CommissionStatistics; import com.ruoyi.account.vo.WalletStatistics; public interface BalanceChangeRecordService extends IService<BalanceChangeRecord> { IPage<BalanceChangeRecord> pageList(BalanceQuery agentQuery); CommissionStatistics commissionStatistics(Page<BalanceChangeRecord> page, BalanceChangeRecord balanceChangeRecord); WalletStatistics walletStatistics(Page<BalanceChangeRecord> of, BalanceChangeRecord balanceChangeRecord); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/BalanceChangeRecordServiceImpl.java
@@ -1,26 +1,27 @@ 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.common.core.utils.StringUtils; import com.ruoyi.other.api.domain.ShopPoint; 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 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; @@ -28,7 +29,7 @@ @Service public class BalanceChangeRecordServiceImpl extends ServiceImpl<BalanceChangeRecordMapper, BalanceChangeRecord> implements BalanceChangeRecordService { @Resource private AppUserService appUserService; private ShopBalanceStatementClient shopBalanceStatementClient; @Override public IPage<BalanceChangeRecord> pageList(BalanceQuery agentQuery) { @@ -51,4 +52,87 @@ 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; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatistics.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.account.vo; import com.baomidou.mybatisplus.core.metadata.IPage; import lombok.Data; import java.math.BigDecimal; @Data public class WalletStatistics { /** * 用户充值总金额 */ private BigDecimal totalRecharge; /** * 用户提现总金额 */ private BigDecimal totalWithdraw; /** * 门店提现总金额 */ private BigDecimal totalShopWithdraw; private IPage<WalletStatisticsDetail> page; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java
New file @@ -0,0 +1,49 @@ package com.ruoyi.account.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @Data public class WalletStatisticsDetail { /** * 门店名称 */ @ApiModelProperty(value = "门店名称") private String shopName; /** * 用户姓名 */ @ApiModelProperty(value = "用户姓名") private String userName; /** * 联系电话 */ @ApiModelProperty(value = "联系电话") private String userPhone; @ApiModelProperty("类型:1充值2提现3红包4分佣5商城购物6订单取消回退7门店提现") @Excel(name = "变更类型", readConverterExp = "1=充值,2=提现,3=红包,4=分佣,5=商城购物,6=订单取消回退,7=门店提现") private Integer changeType; /** * 变更时间 */ @ApiModelProperty(value = "变更时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; /** * 变更数量 */ @ApiModelProperty(value = "变更数量") private BigDecimal changeAmount; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopBalanceStatementController.java
@@ -8,6 +8,7 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.other.api.domain.ShopBalanceStatement; import com.ruoyi.other.mapper.ShopBalanceStatementMapper; import com.ruoyi.other.service.ShopBalanceStatementService; import com.ruoyi.other.vo.ShopCommissionStatisticsVO; import io.swagger.annotations.Api; @@ -33,6 +34,8 @@ public class ShopBalanceStatementController { @Resource private ShopBalanceStatementService shopBalanceStatementService; @Resource private ShopBalanceStatementMapper shopBalanceStatementMapper; /** * 门店分佣统计 @@ -62,7 +65,7 @@ @PostMapping("/getList") public R<List<ShopBalanceStatement>> getList(@RequestBody ShopBalanceStatement shopBalanceStatement){ return R.ok(); return R.ok(shopBalanceStatementMapper.selectShopBalanceStatementList(shopBalanceStatement)); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java
@@ -22,5 +22,4 @@ List<ShopBalanceStatement> selectShopBalanceStatementList(@Param("bs") ShopBalanceStatement shopBalanceStatement); }