ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java
@@ -171,6 +171,22 @@ @TableField("total_distribution_amount") private BigDecimal totalDistributionAmount; @ApiModelProperty(value = "拉新人积分总数") @TableField("total_invite_point") private Integer totalInvitePoint; @ApiModelProperty(value = "注册积分总数") @TableField("total_register_point") private Integer totalRegisterPoint; @ApiModelProperty(value = "做工积分总数") @TableField("total_work_point") private Integer totalWorkPoint; @ApiModelProperty(value = "业绩积分总数") @TableField("total_performance_point") private Integer totalPerformancePoint; @ApiModelProperty(value = "剩余积分") @TableField("lave_point") ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopBalanceStatement.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -36,8 +37,9 @@ @TableField("shop_id") private Integer shopId; @ApiModelProperty(value = "变动类型(1=返佣,2=提现)") @ApiModelProperty(value = "变动类型(1=门店分佣,2=下级门店分佣,3=门店服务费)") @TableField("type") @Excel(name = "变更类型",readConverterExp = "1=门店分佣,2=下级门店分佣,3=门店服务费") private Integer type; @ApiModelProperty(value = "历史余额") @@ -48,8 +50,14 @@ @TableField("variable_amount") private BigDecimal variableAmount; @ApiModelProperty(value = "变动后余额") @TableField("balance") @Excel(name = "变更后数量") private BigDecimal balance; @ApiModelProperty(value = "变动时间") @TableField("create_time") @Excel(name = "变更时间",dateFormat = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty(value = "变动用户id") @@ -60,5 +68,18 @@ @TableField("object_id") private Long objectId; @ApiModelProperty(value = "门店名称") @TableField(exist = false) @Excel(name = "门店名称") private String shopName; @ApiModelProperty(value = "店长名称") @TableField(exist = false) @Excel(name = "店长名称") private String shopManagerName; @ApiModelProperty(value = "联系电话") @TableField(exist = false) @Excel(name = "联系电话") private String phone; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java
@@ -3,17 +3,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.api.model.UserClickLog; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.dto.BalanceQuery; import com.ruoyi.account.dto.UserCancelQuery; import com.ruoyi.account.excel.UserPointEx; import com.ruoyi.account.excel.BalanceChangeRecordEX; import com.ruoyi.account.service.BalanceChangeRecordService; import com.ruoyi.account.vo.CommissionStatistics; import com.ruoyi.account.vo.UserPointStatistics; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.poi.ExcelUtil; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -52,77 +49,63 @@ return R.ok(balanceChangeRecordService.pageList(agentQuery)); } // /** // * 用户分佣统计 // */ // @GetMapping("/commissionStatistics") // @ApiOperation(value = "用户分佣统计", tags = "管理后台-财务统计-用户分佣统计") // public R<CommissionStatistics> commissionStatistics(UserPoint userPoint) { // userPoint.setType(2); // IPage<UserPoint> userPointPage = userPointService.getUserPointPage(Page.of(userPoint.getPageNum(), userPoint.getPageSize()), userPoint); // UserPointStatistics statistics = userPointService.getStatistics(userPoint); // CommissionStatistics commissionStatistics = new CommissionStatistics(); // commissionStatistics.setStatistics(statistics); // commissionStatistics.setUserPointPage(userPointPage); // return R.ok(commissionStatistics); // } /** * 用户分佣统计 */ @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, UserPoint userPoint) { // userPoint.setType(2); // IPage<UserPoint> userPointPage = userPointService.getUserPointPage(Page.of(1, Integer.MAX_VALUE), userPoint); // List<UserPoint> userPointList = userPointPage.getRecords(); // List<UserPointEx> userPointExList = new ArrayList<>(); // for (UserPoint point : userPointList) { // UserPointEx userPointEx = new UserPointEx(); // userPointEx.setUserName(point.getUserName()); // userPointEx.setPhone(point.getPhone()); // userPointEx.setChangeTime(point.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // userPointEx.setChangeNum(point.getVariablePoint().toString()); // Integer type = point.getType(); // switch (type) { // case 1: // userPointEx.setType("消费积分"); // break; // case 2: // userPointEx.setType("返佣积分"); // break; // case 3: // userPointEx.setType("拉新人积分"); // break; // case 4: // userPointEx.setType("兑换商品"); // break; // case 5: // userPointEx.setType("门店业绩"); // break; // case 6: // userPointEx.setType("门店返佣"); // break; // case 7: // userPointEx.setType("技师业绩"); // break; // case 8: // userPointEx.setType("转赠积分"); // break; // case 9: // userPointEx.setType("做工积分"); // break; // case 10: // userPointEx.setType("注册积分"); // break; // default: // userPointEx.setType("未知积分"); // } // userPointExList.add(userPointEx); // } // ExcelUtil<UserPointEx> util = new ExcelUtil<>(UserPointEx.class); // util.exportExcel(response, userPointExList, "用户分佣统计"); // } @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(); List<BalanceChangeRecordEX> userPointExList = new ArrayList<>(); for (BalanceChangeRecord balanceChangeRecord1 : userPointList) { BalanceChangeRecordEX balanceChangeRecordEX = new BalanceChangeRecordEX(); balanceChangeRecordEX.setUserName(balanceChangeRecord1.getUserName()); balanceChangeRecordEX.setPhone(balanceChangeRecord1.getUserPhone()); balanceChangeRecordEX.setChangeTime(balanceChangeRecord1.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); balanceChangeRecordEX.setChangeNum(balanceChangeRecord1.getAfterAmount().toString()); Integer type = balanceChangeRecord1.getChangeType(); // 类型:1充值2提现3红包4分佣5商城购物6订单取消回退 switch (type) { case 1: balanceChangeRecordEX.setType("充值"); break; case 2: balanceChangeRecordEX.setType("提现"); break; case 3: balanceChangeRecordEX.setType("红包"); break; case 4: balanceChangeRecordEX.setType("分佣"); break; case 5: balanceChangeRecordEX.setType("商城购物"); break; case 6: balanceChangeRecordEX.setType("订单取消回退"); break; default: balanceChangeRecordEX.setType("未知积分"); } userPointExList.add(balanceChangeRecordEX); } ExcelUtil<BalanceChangeRecordEX> util = new ExcelUtil<>(BalanceChangeRecordEX.class); util.exportExcel(response, userPointExList, "用户分佣统计"); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/excel/BalanceChangeRecordEX.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.account.excel; import com.ruoyi.common.core.annotation.Excel; import lombok.Data; @Data public class BalanceChangeRecordEX { @Excel(name = "用户名称") private String userName; @Excel(name = "联系电话") private String phone; @Excel(name = "变更类型") private String type; @Excel(name = "变更时间") private String changeTime; @Excel(name = "变更数量") private String changeNum; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopBalanceStatementController.java
@@ -1,8 +1,23 @@ package com.ruoyi.other.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.other.api.domain.ShopBalanceStatement; import com.ruoyi.other.service.ShopBalanceStatementService; import com.ruoyi.other.vo.ShopCommissionStatisticsVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; /** * <p> @@ -14,7 +29,34 @@ */ @RestController @RequestMapping("/shop-balance-statement") @Api(tags = "管理后台-财务统计-门店分佣统计") public class ShopBalanceStatementController { @Resource private ShopBalanceStatementService shopBalanceStatementService; /** * 门店分佣统计 */ @GetMapping("/commissionStatistics") @ApiOperation("门店分佣统计") public R<ShopCommissionStatisticsVO> shopCommissionStatistics(@ApiParam("页码") @RequestParam Integer pageNum, @ApiParam("每一页数据大小") Integer pageSize, ShopBalanceStatement shopBalanceStatement){ ShopCommissionStatisticsVO shopCommissionStatisticsVO = shopBalanceStatementService.shopCommissionStatistics(Page.of(pageNum, pageSize), shopBalanceStatement); return R.ok(shopCommissionStatisticsVO); } /** * 导出门店分佣统计 */ @GetMapping("/export") @ApiOperation("导出门店分佣统计") public void export(HttpServletResponse response , ShopBalanceStatement shopBalanceStatement){ ShopCommissionStatisticsVO shopCommissionStatisticsVO = shopBalanceStatementService.shopCommissionStatistics(Page.of(1, Integer.MAX_VALUE), shopBalanceStatement); IPage<ShopBalanceStatement> statementIPage = shopCommissionStatisticsVO.getStatementIPage(); ExcelUtil<ShopBalanceStatement> util = new ExcelUtil<>(ShopBalanceStatement.class); util.exportExcel(response, statementIPage.getRecords(), "用户积分统计"); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java
@@ -1,7 +1,11 @@ package com.ruoyi.other.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.other.api.domain.ShopBalanceStatement; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -12,5 +16,5 @@ * @since 2024-11-20 */ public interface ShopBalanceStatementMapper extends BaseMapper<ShopBalanceStatement> { List<ShopBalanceStatement> findLatestChangeByType(ShopBalanceStatement shopBalanceStatement); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java
@@ -1,7 +1,9 @@ package com.ruoyi.other.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.other.api.domain.ShopBalanceStatement; import com.ruoyi.other.vo.ShopCommissionStatisticsVO; /** * <p> @@ -12,5 +14,5 @@ * @since 2024-11-20 */ public interface ShopBalanceStatementService extends IService<ShopBalanceStatement> { ShopCommissionStatisticsVO shopCommissionStatistics(IPage<ShopBalanceStatement> page, ShopBalanceStatement shopBalanceStatement); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopBalanceStatementServiceImpl.java
@@ -1,10 +1,19 @@ package com.ruoyi.other.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.mapper.ShopBalanceStatementMapper; import com.ruoyi.other.api.domain.ShopBalanceStatement; import com.ruoyi.other.service.ShopBalanceStatementService; import com.ruoyi.other.service.ShopService; import com.ruoyi.other.vo.ShopCommissionStatisticsVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -16,5 +25,45 @@ */ @Service public class ShopBalanceStatementServiceImpl extends ServiceImpl<ShopBalanceStatementMapper, ShopBalanceStatement> implements ShopBalanceStatementService { @Resource private ShopBalanceStatementMapper shopBalanceStatementMapper; @Resource private ShopService shopService; @Override public ShopCommissionStatisticsVO shopCommissionStatistics(IPage<ShopBalanceStatement> page, ShopBalanceStatement shopBalanceStatement) { List<ShopBalanceStatement> latestChangeByType = shopBalanceStatementMapper.findLatestChangeByType(shopBalanceStatement); ShopCommissionStatisticsVO shopCommissionStatisticsVO = new ShopCommissionStatisticsVO(); for (ShopBalanceStatement sp : latestChangeByType) { switch (sp.getType()) { case 1: shopCommissionStatisticsVO.setTotalCommission(sp.getBalance()); break; case 2: shopCommissionStatisticsVO.setTotalSubordinateCommission(sp.getBalance()); break; case 3: shopCommissionStatisticsVO.setTotalServiceCharge(sp.getBalance()); break; } } shopCommissionStatisticsVO.setTotalAmount(shopCommissionStatisticsVO.getTotalCommission() .add(shopCommissionStatisticsVO.getTotalSubordinateCommission()) .add(shopCommissionStatisticsVO.getTotalServiceCharge())); IPage<ShopBalanceStatement> statementIPage = page(page, new LambdaQueryWrapper<ShopBalanceStatement>()); List<ShopBalanceStatement> records = statementIPage.getRecords(); List<Integer> shopIds = records.stream().map(ShopBalanceStatement::getShopId).collect(Collectors.toList()); List<Shop> shopList = shopService.listByIds(shopIds); records.forEach(st -> { shopList.stream().filter(shop -> shop.getId().equals(st.getShopId())).findFirst().ifPresent(shop -> { st.setShopName(shop.getName()); st.setShopManagerName(shop.getShopManager()); st.setPhone(shop.getPhone()); }); }); shopCommissionStatisticsVO.setStatementIPage(statementIPage); return shopCommissionStatisticsVO; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommissionStatisticsVO.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.other.vo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.other.api.domain.ShopBalanceStatement; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data @ApiModel("门店分佣统计") public class ShopCommissionStatisticsVO { /** * 总金额 */ @ApiModelProperty(value = "总金额") private BigDecimal totalAmount; /** * 分佣总金额 */ @ApiModelProperty(value = "分佣总金额") private BigDecimal totalCommission; /** * 服务费总计 */ @ApiModelProperty(value = "服务费总计") private BigDecimal totalServiceCharge; /** * 下级门店分佣总金额 */ @ApiModelProperty(value = "下级门店分佣总金额") private BigDecimal totalSubordinateCommission; private IPage<ShopBalanceStatement> statementIPage; } ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopBalanceStatementMapper.xml
New file @@ -0,0 +1,33 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.other.mapper.ShopBalanceStatementMapper"> <select id="findLatestChangeByType" resultType="com.ruoyi.other.api.domain.ShopBalanceStatement"> SELECT id, shop_id, type, historical_balance, variable_amount, balance, create_time, create_user_id, object_id FROM ( SELECT id, shop_id, type, historical_balance, variable_amount, balance, create_time, create_user_id, object_id, ROW_NUMBER() OVER ( PARTITION BY type, create_user_id ORDER BY create_time DESC ) AS rn FROM t_shop_balance_statement ) AS subquery </select> </mapper> ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopPointMapper.xml
@@ -23,7 +23,7 @@ create_time, create_user_id, object_id, ROW_NUMBER() OVER ( PARTITION BY type ORDER BY create_time DESC ) AS rn ROW_NUMBER() OVER ( PARTITION BY type,create_user_id ORDER BY create_time DESC ) AS rn FROM t_shop_point