luodangjia
2024-12-18 f6e2f4ba4093e401475398e1bd3f7c2e8165b3cb
Merge remote-tracking branch 'origin/master'
20个文件已修改
5个文件已添加
795 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Goods.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SeckillActivityInfo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopBalanceStatement.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopWithdraw.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/excel/BalanceChangeRecordEX.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/CommissionStatistics.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsBargainPriceController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsShopController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SeckillActivityInfoController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopBalanceStatementController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopWithdrawController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopBalanceStatementMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsBargainPriceService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopBalanceStatementService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsBargainPriceServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopBalanceStatementServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/AddGoodsBargainPriceVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsBargainPriceInfo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommissionStatisticsVO.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopBalanceStatementMapper.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopPointMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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/Goods.java
@@ -139,6 +139,12 @@
    @ApiModelProperty(value = "地区价格")
    private List<GoodsArea> goodsAreaList;
    @TableField(exist = false)
    private String categoryName;
    @TableField(exist = false)
    private Integer showStatus;
    public String getIdStr() {
        return String.valueOf(id);
    }
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SeckillActivityInfo.java
@@ -73,5 +73,8 @@
    @TableField(exist = false)
    private List<GoodsSeckill> goodsSeckills;
    @TableField(exist = false)
    private Goods goods;
}
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-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopWithdraw.java
@@ -78,5 +78,9 @@
    @TableField("create_user_id")
    private Long createUserId;
    @ApiModelProperty(value = "门店名称")
    @TableField(exist = false)
    private String shopName;
}
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-account/src/main/java/com/ruoyi/account/vo/CommissionStatistics.java
@@ -14,7 +14,7 @@
public class CommissionStatistics {
    @ApiModelProperty(value = "分佣总计")
    private Integer totalCommission;
    private BigDecimal totalCommission;
    @ApiModelProperty(value = "分页数据", required = true)
    private IPage<BalanceChangeRecord> userPointPage;
@@ -22,6 +22,7 @@
    public CommissionStatistics() {
    }
    public CommissionStatistics(BigDecimal totalCommission, Page<BalanceChangeRecord> changeRecordPage) {
        this.totalCommission = totalCommission;
        this.userPointPage = changeRecordPage;
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsBargainPriceController.java
@@ -13,12 +13,12 @@
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.api.vo.GetGoodsBargainPrice;
import com.ruoyi.other.service.*;
import com.ruoyi.other.vo.AddGoodsBargainPriceVo;
import com.ruoyi.other.vo.GoodsBargainPriceInfo;
import com.ruoyi.other.vo.ShopGoodsList;
import com.ruoyi.other.vo.ShopGoodsListVo;
import com.ruoyi.system.api.model.LoginUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.*;
import io.swagger.models.auth.In;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -197,11 +197,29 @@
        return R.ok(page);
    }
    
    
    
    
    @ResponseBody
    @GetMapping("/getGoodsBargainPriceInfo/{id}")
    @ApiOperation(value = "获取商品特殊售价详情", tags = {"门店后台-商品管理"})
    @ApiImplicitParams({
            @ApiImplicitParam(value = "商品id", name = "id", required = true, dataType = "int"),
    })
    public R<GoodsBargainPriceInfo> getGoodsBargainPriceInfo(@PathVariable("id") Integer id){
        GoodsBargainPriceInfo goodsBargainPriceInfo = goodsBargainPriceService.getGoodsBargainPriceInfo(id);
        return R.ok(goodsBargainPriceInfo);
    }
    @ResponseBody
    @GetMapping("/addGoodsBargainPrice/{id}")
    @ApiOperation(value = "保存商品特殊售价", tags = {"门店后台-商品管理"})
    public R addGoodsBargainPrice(@RequestBody AddGoodsBargainPriceVo vo){
        return goodsBargainPriceService.addGoodsBargainPrice(vo);
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsShopController.java
@@ -72,7 +72,7 @@
    }
    
    
    
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SeckillActivityInfoController.java
@@ -14,6 +14,7 @@
import com.ruoyi.other.api.vo.GetSeckillActivityInfo;
import com.ruoyi.other.mapper.SeckillActivityInfoMapper;
import com.ruoyi.other.service.GoodsSeckillService;
import com.ruoyi.other.service.GoodsService;
import com.ruoyi.other.service.SeckillActivityInfoService;
import com.ruoyi.other.vo.SeckillActivityDetailVO;
import com.ruoyi.other.vo.SeckillActivityVO;
@@ -23,6 +24,7 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;
@@ -46,6 +48,9 @@
    @Resource
    private SeckillActivityInfoMapper seckillActivityInfoMapper;
    @Resource
    private GoodsService goodsService;
    
    
    
@@ -101,6 +106,18 @@
                                                 Goods goods)
    {
        IPage<SeckillActivityVO> IPage = seckillActivityInfoMapper.querySeckillActivity(Page.of(pageNum, pageSize), goods);
        for (SeckillActivityVO record : IPage.getRecords()) {
            LocalDateTime startTime = record.getStartTime();
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime endTime = record.getEndTime();
            if (endTime.isBefore(now)){
                record.setStatus(3); //已结束
            }else if (startTime.isBefore(now)){
                record.setStatus(2); // 已开始
            }else {
                record.setStatus(1); // 未开始
            }
        }
        return R.ok(IPage);
    }
@@ -148,6 +165,9 @@
        List<GoodsSeckill> goodsSeckills = goodsSeckillService.list(new LambdaQueryWrapper<GoodsSeckill>()
                .eq(GoodsSeckill::getSeckillActivityInfoId, id));
        seckillActivityInfo.setGoodsSeckills(goodsSeckills);
        Integer goodId = seckillActivityInfo.getGoodId();
        Goods goods = goodsService.getById(goodId);
        seckillActivityInfo.setGoods(goods);
        return R.ok(seckillActivityInfo);
    }
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/controller/ShopWithdrawController.java
@@ -1,8 +1,26 @@
package com.ruoyi.other.controller;
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.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.ShopWithdraw;
import com.ruoyi.other.service.ShopService;
import com.ruoyi.other.service.ShopWithdrawService;
import com.ruoyi.system.api.model.LoginUser;
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 java.time.LocalDateTime;
/**
 * <p>
@@ -14,7 +32,49 @@
 */
@RestController
@RequestMapping("/shop-withdraw")
@Api(tags = {"管理后台-门店管理-提现管理"})
public class ShopWithdrawController {
    @Resource
    private ShopWithdrawService shopWithdrawService;
    @Resource
    private ShopService shopService;
    @Resource
    private TokenService tokenService;
    /**
     * 提现申请列表
     */
    @GetMapping("/list")
    @ApiOperation("提现申请列表")
    public R<IPage<ShopWithdraw>> list(@ApiParam("页码") @RequestParam Integer pageNum,
                         @ApiParam("每一页数据大小") Integer pageSize,
                         ShopWithdraw shopWithdraw) {
        Page<ShopWithdraw> page = shopWithdrawService.page(Page.of(pageNum, pageSize), new LambdaQueryWrapper<ShopWithdraw>()
                .like(StringUtils.isNotEmpty(shopWithdraw.getShopName()), ShopWithdraw::getShopName, shopWithdraw.getShopName()));
        page.getRecords().forEach(item-> item.setShopName(shopService.getById(item.getShopId()).getName()));
        return R.ok(page);
    }
    /**
     * 审核
     */
    @RequestMapping("/audit")
    @ApiOperation("审核")
    public R<Void> audit(ShopWithdraw shopWithdraw) {
        LoginUser loginUser = tokenService.getLoginUser();
        ShopWithdraw shopWithdraw1 = shopWithdrawService.getById(shopWithdraw.getId());
        shopWithdraw1.setAuditStatus(shopWithdraw.getAuditStatus());
        shopWithdraw1.setAuditUserId(loginUser.getUserid());
        shopWithdraw1.setAuditTime(LocalDateTime.now());
        shopWithdraw1.setAuditMsg(shopWithdraw.getAuditMsg());
        shopWithdrawService.updateById(shopWithdraw1);
        return R.ok();
    }
}
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/GoodsBargainPriceService.java
@@ -1,7 +1,12 @@
package com.ruoyi.other.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsBargainPrice;
import com.ruoyi.other.vo.AddGoodsBargainPriceVo;
import com.ruoyi.other.vo.GoodsBargainPriceInfo;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * <p>
@@ -12,5 +17,21 @@
 * @since 2024-11-20
 */
public interface GoodsBargainPriceService extends IService<GoodsBargainPrice> {
    /**
     * 获取商品特殊售价明细
     * @param id
     * @return
     */
    GoodsBargainPriceInfo getGoodsBargainPriceInfo(Integer id);
    /**
     * 提交特殊售价申请
     * @param vo
     * @return
     */
    R addGoodsBargainPrice(AddGoodsBargainPriceVo vo);
}
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/GoodsBargainPriceServiceImpl.java
@@ -1,10 +1,23 @@
package com.ruoyi.other.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.GoodsBargainPriceDetail;
import com.ruoyi.other.mapper.GoodsBargainPriceMapper;
import com.ruoyi.other.api.domain.GoodsBargainPrice;
import com.ruoyi.other.service.GoodsBargainPriceDetailService;
import com.ruoyi.other.service.GoodsBargainPriceService;
import com.ruoyi.other.vo.AddGoodsBargainPriceVo;
import com.ruoyi.other.vo.GoodsBargainPriceInfo;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -16,5 +29,71 @@
 */
@Service
public class GoodsBargainPriceServiceImpl extends ServiceImpl<GoodsBargainPriceMapper, GoodsBargainPrice> implements GoodsBargainPriceService {
    @Resource
    private TokenService tokenService;
    @Resource
    private SysUserClient sysUserClient;
    @Resource
    private GoodsBargainPriceDetailService goodsBargainPriceDetailService;
    /**
     * 获取商品特殊售价明细
     * @param id
     * @return
     */
    @Override
    public GoodsBargainPriceInfo getGoodsBargainPriceInfo(Integer id) {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userid).getData();
        GoodsBargainPrice bargainPrice = this.getOne(new LambdaQueryWrapper<GoodsBargainPrice>().eq(GoodsBargainPrice::getShopId, sysUser.getObjectId())
                .eq(GoodsBargainPrice::getGoodsId, id).eq(GoodsBargainPrice::getDelFlag, 0).last(" order by create_time desc limit 0, 1"));
        if(null == bargainPrice){
            return null;
        }
        List<GoodsBargainPriceDetail> list = goodsBargainPriceDetailService.list(new LambdaQueryWrapper<GoodsBargainPriceDetail>().eq(GoodsBargainPriceDetail::getGoodsBargainPriceId, bargainPrice.getId()));
        GoodsBargainPriceInfo info = new GoodsBargainPriceInfo();
        info.setId(bargainPrice.getId().toString());
        info.setList(list);
        info.setAuditMsg(bargainPrice.getAuditMsg());
        info.setAuditStatus(bargainPrice.getAuditStatus());
        return info;
    }
    /**
     * 提交特殊售价申请
     * @param vo
     * @return
     */
    @Override
    public R addGoodsBargainPrice(AddGoodsBargainPriceVo vo) {
        Long userid = tokenService.getLoginUser().getUserid();
        SysUser sysUser = sysUserClient.getSysUser(userid).getData();
        GoodsBargainPrice bargainPrice = this.getOne(new LambdaQueryWrapper<GoodsBargainPrice>().eq(GoodsBargainPrice::getShopId, sysUser.getObjectId())
                .eq(GoodsBargainPrice::getGoodsId, vo.getGoodsId()).eq(GoodsBargainPrice::getDelFlag, 0).last(" order by create_time desc limit 0, 1"));
        if(null != bargainPrice && 1 == bargainPrice.getAuditStatus()){
            return R.fail("特价申请正在审核中");
        }
        bargainPrice = new GoodsBargainPrice();
        bargainPrice.setShopId(sysUser.getObjectId());
        bargainPrice.setGoodsId(vo.getGoodsId());
        bargainPrice.setAuditStatus(1);
        bargainPrice.setDelFlag(0);
        bargainPrice.setCreateTime(LocalDateTime.now());
        bargainPrice.setCreateUserId(userid);
        this.updateById(bargainPrice);
        //添加明细
        List<GoodsBargainPriceDetail> list = vo.getList();
        for (GoodsBargainPriceDetail goodsBargainPriceDetail : list) {
            goodsBargainPriceDetail.setGoodsBargainPriceId(bargainPrice.getId());
        }
        goodsBargainPriceDetailService.saveBatch(list);
        return R.ok();
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -28,7 +28,10 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -169,38 +172,55 @@
            if (CollectionUtils.isEmpty(goodsShopList)){
                throw new NullPointerException("请选择指定门店");
            }
            for (GoodsShop goodsShop : goodsShopList) {
                goodsShop.setGoodsId(goods.getId());
                goodsShop.setId(null);
            }
            goodsShopService.saveBatch(goodsShopList);
            saveGoodsShopList(goodsShopList, goods.getId());
        }
        // 指定用户
        List<GoodsAppUser> goodsAppUserList = goods.getGoodsAppUserList();
        if (!CollectionUtils.isEmpty(goodsAppUserList)){
            for (GoodsAppUser goodsAppUser : goodsAppUserList) {
                goodsAppUser.setId(null );
                goodsAppUser.setGoodsId(goods.getId());
            }
            goodsAppUserService.saveBatch(goodsAppUserList);
            saveGoodsAppUserList(goodsAppUserList, goods.getId());
        }
        // 会员价格配置
        List<GoodsVip> goodsVipList = goods.getGoodsVipList();
        for (GoodsVip goodsVip : goodsVipList) {
            goodsVip.setId(null);
            goodsVip.setGoodsId(goods.getId());
        }
        goodsVipService.saveBatch(goodsVipList);
        saveGoodsVipList(goodsVipList, goods.getId());
        // 特殊地区售价设置
        List<GoodsArea> goodsAreaList = goods.getGoodsAreaList();
        if (!CollectionUtils.isEmpty(goodsAreaList)){
            saveGoodsAreaList(goodsAreaList, goods.getId());
        }
    }
    @Override
    public void updateManageGoods(Goods goods) {
        goodsMapper.updateById(goods);
        // 指定门店
        List<GoodsShop> goodsShopList = goods.getGoodsShopList();
        saveGoodsShopList(goodsShopList, goods.getId());
        // 指定用户
        List<GoodsAppUser> goodsAppUserList = goods.getGoodsAppUserList();
        saveGoodsAppUserList(goodsAppUserList, goods.getId());
        // 会员价格配置
        List<GoodsVip> goodsVipList = goods.getGoodsVipList();
        saveGoodsVipList(goodsVipList, goods.getId());
        // 特殊地区售价设置
        List<GoodsArea> goodsAreaList = goods.getGoodsAreaList();
        saveGoodsAreaList(goodsAreaList, goods.getId());
    }
    private void saveGoodsAreaList(List<GoodsArea> goodsAreaList, Integer id) {
        goodsAreaService.remove(new LambdaQueryWrapper<GoodsArea>()
                .eq(GoodsArea::getGoodsId, id));
        if (!CollectionUtils.isEmpty(goodsAreaList)){
            for (GoodsArea goodsArea : goodsAreaList) {
                List<GoodsArea> goodsAreaList1 = goodsArea.getGoodsAreaList();
                for (GoodsArea area : goodsAreaList1) {
                    area.setGoodsId(goods.getId());
                    area.setGoodsId(id);
                    area.setProvince(goodsArea.getProvince());
                    area.setCity(goodsArea.getCity());
                    area.setDistricts(goodsArea.getDistricts());
@@ -211,41 +231,40 @@
                goodsAreaService.saveBatch(goodsAreaList1);
            }
        }
    }
    @Override
    public void updateManageGoods(Goods goods) {
        goodsMapper.updateById(goods);
        // 指定门店
        List<GoodsShop> goodsShopList = goods.getGoodsShopList();
        goodsShopService.updateBatchById(goodsShopList);
    private void saveGoodsVipList(List<GoodsVip> goodsVipList, Integer id) {
        goodsVipService.remove(new LambdaQueryWrapper<GoodsVip>()
                .eq(GoodsVip::getGoodsId, id));
        goodsVipList.forEach(item -> {
            item.setId(null);
            item.setGoodsId(id);
        });
        goodsVipService.saveBatch(goodsVipList);
    }
        // 指定用户
        List<GoodsAppUser> goodsAppUserList = goods.getGoodsAppUserList();
        goodsAppUserService.updateBatchById(goodsAppUserList);
        // 会员价格配置
        List<GoodsVip> goodsVipList = goods.getGoodsVipList();
        goodsVipService.updateBatchById(goodsVipList);
        // 特殊地区售价设置
        List<GoodsArea> goodsAreaList = goods.getGoodsAreaList();
        if (!CollectionUtils.isEmpty(goodsAreaList)){
            for (GoodsArea goodsArea : goodsAreaList) {
                List<GoodsArea> goodsAreaList1 = goodsArea.getGoodsAreaList();
                for (GoodsArea area : goodsAreaList1) {
                    area.setGoodsId(goods.getId());
                    area.setProvince(goodsArea.getProvince());
                    area.setCity(goodsArea.getCity());
                    area.setDistricts(goodsArea.getDistricts());
                    area.setProvinceCode(goodsArea.getProvinceCode());
                    area.setCityCode(goodsArea.getCityCode());
                    area.setDistrictsCode(goodsArea.getDistrictsCode());
                }
                goodsAreaService.updateBatchById(goodsAreaList1);
    private void saveGoodsAppUserList(List<GoodsAppUser> goodsAppUserList, Integer id) {
        goodsAppUserService.remove(new LambdaQueryWrapper<GoodsAppUser>()
                .eq(GoodsAppUser::getGoodsId, id));
        if (!CollectionUtils.isEmpty(goodsAppUserList)){
            for (GoodsAppUser goodsAppUser : goodsAppUserList) {
                goodsAppUser.setId(null );
                goodsAppUser.setGoodsId(id);
            }
        }
        goodsAppUserService.saveBatch(goodsAppUserList);
    }
    private void saveGoodsShopList(List<GoodsShop> goodsShopList, Integer goodsId) {
        goodsShopService.remove(new LambdaQueryWrapper<GoodsShop>()
                .eq(GoodsShop::getGoodsId, goodsId));
        if (!CollectionUtils.isEmpty(goodsShopList)){
            for (GoodsShop goodsShop : goodsShopList) {
                goodsShop.setGoodsId(goodsId);
                goodsShop.setId(null);
            }
        }
        goodsShopService.saveBatch(goodsShopList);
    }
    @Override
@@ -322,6 +341,9 @@
    private List<VipSetting> getVipSettings(Stream<Integer> goodsVipList) {
        List<Integer> vipIds = goodsVipList.collect(Collectors.toList());
        if (CollectionUtils.isEmpty(vipIds)){
            return new ArrayList<>();
        }
        return vipSettingService.listByIds(vipIds);
    }
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/AddGoodsBargainPriceVo.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.other.vo;
import com.ruoyi.other.api.domain.GoodsBargainPriceDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/12/17 16:28
 */
@Data
@ApiModel
public class AddGoodsBargainPriceVo {
    @ApiModelProperty("商品id")
    private Integer goodsId;
    @ApiModelProperty("特殊售价")
    private List<GoodsBargainPriceDetail> list;
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsBargainPriceInfo.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.other.vo;
import com.ruoyi.other.api.domain.GoodsBargainPriceDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/12/17 16:14
 */
@Data
@ApiModel
public class GoodsBargainPriceInfo {
    @ApiModelProperty("数据id")
    private String id;
    @ApiModelProperty("审核状态(0=待审核,1=审核通过,2=审核失败)")
    private Integer auditStatus;
    @ApiModelProperty("审核意见")
    private String auditMsg;
    @ApiModelProperty("特殊售价")
    private List<GoodsBargainPriceDetail> list;
}
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/SeckillActivityInfoMapper.xml
@@ -49,24 +49,53 @@
    <select id="querySeckillActivity" resultType="com.ruoyi.other.vo.SeckillActivityVO">
        SELECT
        tsai.id,
        tg.`name`,
        tg.`name` goodsName,
        tg.introduction,
        tgc.`name` goodsCategoryName,
        tg.operating_cost,
        tg.shop_cost,
        tg.purchase_limit maxNum,
        tg.home_page_picture,
        tg.original_price,
        tgs.selling_price,
        tg.sale_num,
        tsai.start_time
        tg.`type` goodsType,
        tsai.start_time,
        tsai.end_time,
        tsai.is_shelves showStatus
        FROM
        t_seckill_activity_info tsai
        LEFT JOIN t_goods tg ON tsai.good_id = tg.id
        LEFT JOIN t_goods_seckill tgs ON tgs.seckill_activity_info_id = tsai.id
        WHERE tsai.end_time >= NOW() AND tsai.del_flag = 0
        LEFT JOIN t_goods_category tgc ON tgc.id = tg.goods_category_id
        WHERE tsai.del_flag = 0
        <if test="goods.name != null and goods.name != ''">
            AND tg.`name` LIKE concat('%',#{goods.name},'%')
        </if>
        <if test="goods.goodsCategoryId != null">
            AND tg.goods_category_id = #{goods.goodsCategoryId}
        </if>
        <if test="goods.categoryName != null and goods.categoryName != ''">
            AND tgc.name = #{goods.categoryName}
        </if>
        <if test="goods.showStatus != null">
            AND tsai.is_shelves = #{goods.showStatus}
        </if>
        <if test="goods.type != null">
            AND tg.type = #{goods.type}
        </if>
        <if test="goods.status != null and goods.status ==1">
            AND tsai.start_time <![CDATA[>]]> NOW()
        </if>
        <if test="goods.status != null and goods.status ==2">
            AND tsai.start_time <![CDATA[<=]]> NOW() AND tsai.end_time <![CDATA[>]]> NOW()
        </if>
        <if test="goods.status != null and goods.status ==3">
            AND tsai.end_time <![CDATA[<]]> NOW()
        </if>
        <if test="goods.vipId != null">
            AND find_in_set(#{goods.vipId},tgs.vip) > 0
        </if>
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