huliguo
2025-04-09 91e9c006a2ce431a5916b137974bd004622eb9fa
用户端代码调整测试
20个文件已修改
7个文件已添加
1096 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserPointFallbackFactory.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserPointClient.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/ApplyForAdmission.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Shop.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopBalanceStatement.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java 143 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserApplyForAdmissionController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/ApplyForAdmissionDTO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/ApplyForAdmissionMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserApplyForAdmissionService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserApplyForAdmissionServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/TaskUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopBalanceStatementServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserPointFallbackFactory.java
@@ -21,13 +21,9 @@
                return R.fail("保存积分流水记录失败:" + cause.getMessage());
            }
            @Override
            public R saveUserPointCopy(UserPointCopy userPoint) {
                return R.fail("保存积分流水记录失败:" + cause.getMessage());
            }
            @Override
            public R deleteUserPointCopy(Long id, List<Integer> type) {
            public R deleteUserPoint(Long id) {
                return R.fail("删除积分流水记录失败:" + cause.getMessage());
            }
            
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserPointClient.java
@@ -28,11 +28,8 @@
    @PostMapping("/user-point/saveUserPoint")
    R saveUserPoint(@RequestBody UserPoint userPoint);
    @PostMapping("/user-point/saveUserPointCopy")
    R saveUserPointCopy(@RequestBody UserPointCopy userPoint);
    @DeleteMapping("/user-point/deleteUserPointCopy")
    R deleteUserPointCopy(@RequestParam("orderId") Long orderId, @RequestParam("type") List<Integer> type);
    @DeleteMapping("/user-point/deleteUserPoint")
    R deleteUserPoint(@RequestParam("orderId") Long orderId);
    
    @PostMapping("/user-point/getUserPointCopy")
    R<List<UserPointCopy>> getUserPointCopy(@RequestParam("orderId") Long orderId, @RequestParam("type") List<Integer> type);
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java
@@ -87,23 +87,27 @@
    private LocalDateTime lastLoginTime;
    @ApiModelProperty(value = "绑定门店id")
    @ApiModelProperty(value = "门店id")
    @TableField("shop_id")
    private Integer shopId;
    @ApiModelProperty(value = "绑定门店名称")
    @ApiModelProperty(value = "门店名称")
    @TableField(exist = false)
    private String shopName;
    @ApiModelProperty(value = "绑定门店列表")
    @ApiModelProperty(value = "门店列表")
    @TableField(exist = false)
    private List<String> shopNames;
    @ApiModelProperty(value = "绑定门店封面")
    @ApiModelProperty(value = "门店封面")
    @TableField(exist = false)
    private String shopCover;
    @ApiModelProperty(value = "绑定门店地址")
    @ApiModelProperty(value = "门店地址")
    @TableField(exist = false)
    private String shopAddress;
    @ApiModelProperty(value = "消费总金额")
    @ApiModelProperty(value = "门店状态(0-未拥有门店,1-正常,2-冻结)")
    @TableField(exist = false)
    private Integer shopStatus;
    @ApiModelProperty(value = "消费总金额(微信支付总金额)")
    @TableField("shop_amount")
    private BigDecimal shopAmount;
@@ -121,7 +125,7 @@
    @ApiModelProperty(value = "充值积分")
    @TableField("recharge_point")
    private BigDecimal rechargePoint;
    private Integer rechargePoint;
    @ApiModelProperty(value = "取消订单积分")
@@ -202,9 +206,9 @@
    public Integer getUserTotalPoint(){
        if (totalPoint == null){
            totalPoint = 0;
        }
        totalPoint = rechargePoint+cancelPoint+exchangePoint+transferableInPoint+transferableOutPoint;
        return totalPoint ;
    }
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/ApplyForAdmission.java
New file
@@ -0,0 +1,89 @@
package com.ruoyi.account.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_apply_for_admission")
@ApiModel(value="ApplyForAdmission对象", description="申请入驻对象")
public class ApplyForAdmission implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "申请用户id")
    @TableId("apply_user_id")
    private Long applyUserId;
    @ApiModelProperty("商家名称")
    @TableId("shop_name")
    private String shopName;
    @ApiModelProperty("商家封面图")
    @TableId("home_picture")
    private String homePicture;
    @ApiModelProperty("店铺详情图")
    @TableId("details_picture")
    private String detailsPicture;
    @ApiModelProperty("资质证书图片")
    @TableId("certification")
    private String certification;
    @ApiModelProperty("店长姓名")
    @TableId("shop_manager")
    private String shopManager;
    @ApiModelProperty("电话")
    @TableId("phone")
    private String phone;
    @ApiModelProperty(value = "客服电话(同步到t_phone表)")
    @TableField("service_tel")
    private String serviceTel;
    @ApiModelProperty(value = "营业星期:1-周一到周日 2-周一周五 3-仅周末")
    @TableId("business_date")
    private Integer businessDate;
    @ApiModelProperty(value = "经度")
    @TableId("longitude")
    private String longitude;
    @ApiModelProperty(value = "纬度")
    @TableId("latitude")
    private String latitude;
    @ApiModelProperty(value = "详细地址")
    @TableId("address")
    private String address;
    @ApiModelProperty(value = "状态(0-待审核,1-审核通过,2-审核不通过)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "备注")
    @TableField("remark")
    private String  remark;
    @ApiModelProperty(value = "创建时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField("update_time")
    private LocalDateTime updateTime;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
@@ -38,9 +38,8 @@
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "变动类型(1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩," +
            "9-门店返佣,14-下级门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人,15-兑换券)")
    @Excel(name = "变动类型", readConverterExp = "1=消费积分,2=返佣积分,3=拉新人积分,4=每日分享,5=每日签到,6=使用时长,7=注册积分,8=门店业绩,9=门店返佣,14=下级门店返佣,10=技师业绩,11=兑换商品,12=他人赠送,13=赠与他人,15=兑换券")
    @ApiModelProperty(value = "变动类型(4=兑换商品,12=他人赠送,13=赠与他人,16=取消订单,17=充值 )")
    @Excel(name = "变动类型", readConverterExp = "4=兑换商品,12=他人赠送,13=赠与他人,16=取消订单,17=充值 ")
    @TableField("type")
    private Integer type;
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,2 +1,2 @@
com.ruoyi.account.api.factory.AppUserClientFallbackFactory
com.ruoyi.account.api.factory.UserPointFallbackFactory
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java
@@ -37,11 +37,11 @@
    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价")
    @ApiModelProperty(value = "3待使用4已完成5已取消6已退款7售后中8已评价")
    @TableField("order_status")
    private Integer orderStatus;
    
    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价")
    @ApiModelProperty(value = "3待使用4已完成5已取消6已退款7售后中8已评价")
    @TableField("old_order_status")
    private Integer oldOrderStatus;
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Shop.java
@@ -94,48 +94,9 @@
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "门店积分总数")
    @TableField("shop_all_point")
    private Integer shopAllPoint;
    @ApiModelProperty(value = "绑定下级门店分佣积分")
    @TableField("lower_level_share_point")
    private Integer lowerLevelSharePoint;
    @ApiModelProperty(value = "门店返佣积分")
    @TableField("share_point")
    private Integer sharePoint;
    @ApiModelProperty(value = "门店服务积分")
    @TableField("server_point")
    private Integer serverPoint;
    @ApiModelProperty(value = "门店已用积分")
    @TableField("use_point")
    private Integer usePoint;
    @ApiModelProperty(value = "门店剩余积分")
    @TableField("lave_point")
    private Integer lavePoint;
    @TableField(exist = false)
    private Integer laveUsePoint;
    @ApiModelProperty(value = "门店分佣总金额")
    @TableField("giveaway_all_money")
    private BigDecimal giveawayAllMoney;
    @ApiModelProperty(value = "门店分佣金额")
    @TableField("giveaway_money")
    private BigDecimal giveawayMoney;
    @ApiModelProperty(value = "绑定下级门店分佣金额")
    @TableField("lower_level_giveaway_money")
    private BigDecimal lowerLevelGiveawayMoney;
    @ApiModelProperty(value = "门店服务分佣金额")
    @TableField("server_giveaway_money")
    private BigDecimal serverGiveawayMoney;
    @ApiModelProperty(value = "评分")
    @TableField("score")
    private Double score;
    @ApiModelProperty(value = "可提现金额")
    @TableField("can_withdraw_money")
@@ -157,13 +118,6 @@
    @TableField("order_number")
    private Integer orderNumber;
    @ApiModelProperty(value = "门店服务订单数")
    @TableField("server_order_number")
    private Integer serverOrderNumber;
    @ApiModelProperty(value = "单品自提订单数")
    @TableField("custom_order_number")
    private Integer customOrderNumber;
    @ApiModelProperty(value = "删除(0=否,1=是)")
    @TableField("del_flag")
@@ -221,8 +175,7 @@
    @TableField(exist = false)
    private Double distance;
    @TableField(exist = false)
    private Double score;
    @ApiModelProperty(value = "自己打分")
    @TableField(exist = false)
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ShopBalanceStatement.java
@@ -50,9 +50,9 @@
    @TableField(exist = false)
    @Excel(name = "联系电话")
    private String phone;
    @ApiModelProperty(value = "变动类型(1=服务商分佣,2=高级服务商分佣,3=核销门店服务费,4=提现,5=订单收入)")
    @ApiModelProperty(value = "变动类型(4=提现,5=订单收入,6=订单退款)")
    @TableField("type")
    @Excel(name = "变更类型",readConverterExp = "1=服务商分佣,2=高级服务商分佣,3=核销门店服务费,5=订单收入")
    @Excel(name = "变更类型",readConverterExp = "5=订单收入,6=订单退款")
    private Integer type;
    @ApiModelProperty(value = "历史余额")
ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -7,5 +7,6 @@
com.ruoyi.other.api.factory.StoreFallbackFactory
com.ruoyi.other.api.factory.PointSettingClientFallbackFactory
com.ruoyi.other.api.factory.RegionClientFallbackFactory
com.ruoyi.other.api.factory.ShopBalanceStatementClientFallbackFactory
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.dto.ChangeAppUserInfo;
import com.ruoyi.account.mapper.AppUserMapper;
import com.ruoyi.account.service.*;
@@ -189,64 +190,22 @@
    }
    @ResponseBody
    @GetMapping("/recommend")
    @ApiOperation(value = "推广中心", tags = {"小程序-推广中心"})
    public R<AppUser> recommend() {
        Long userId = tokenService.getLoginUserApplet().getUserid();
        //获取绑定门店
        AppUser user = appUserService.getById(userId);
        return R.ok(user);
    }
    @GetMapping("/index")
    @ApiOperation(value = "个人中心首页", tags = {"小程序-个人中心首页"})
    @ApiOperation(value = "个人信息", tags = {"小程序-个人中心首页"})
    public R<AppUser> index() {
        Long userId = tokenService.getLoginUserApplet().getUserid();
        //当前用户信息
        AppUser user = appUserService.getById(userId);
        return R.ok(user);
        return R.ok(appUserService.index());
    }
    /**
     * 获取门店作为服务商的所有用户
     * @param shopId
     * @return
     */
    public Set<Long> getShopServerUser(Integer shopId){
        Shop shop = shopClient.getShopById(shopId).getData();
        List<Shop> shopList = shopClient.getAllShop().getData();
        List<Long> appUserIds = shopList.stream().map(Shop::getAppUserId).collect(Collectors.toList());
        Long appUserId = shop.getAppUserId();
        //所有未开店的用户
        List<AppUser> list = appUserService.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0)
                .ne(AppUser::getStatus, 3).notIn(AppUser::getId, appUserIds));
        Set<Long> ids = new HashSet<>();
        getShopServerUser(appUserId, list, ids);
        return ids;
    }
    
    
    public void getShopServerUser(Long appUserId, List<AppUser> appUserList, Set<Long> ids){
        List<AppUser> collect = appUserList.stream().filter(s->s.getInviteUserId().equals(appUserId)).collect(Collectors.toList());
        if(collect.size() == 0){
            return;
        }
        Set<Long> appUserSet = collect.stream().map(AppUser::getId).collect(Collectors.toSet());
        if(ids.containsAll(appUserSet)){
            return;
        }
        ids.addAll(appUserSet);
        for (AppUser appUser : collect) {
            getShopServerUser(appUser.getId(), appUserList, ids);
        }
    }
@@ -266,34 +225,6 @@
        return R.ok();
    }
    /**
     * 获取用户的祖籍列表
     */
    @GetMapping("/getUserAncestorList")
    public R<List<AppUser>> getUserAncestorList(Long id) {
        List<AppUser> list = appUserService.getUserAncestorList(id, null);
        return R.ok(list);
    }
    /**
     * 获取用户的直帮上级用户
     */
    @ResponseBody
    @PostMapping("/getSuperiorLeader")
    @ApiOperation(value = "获取用户的直帮上级用户")
    public R<AppUser> getSuperiorLeader(@RequestParam("id") Long id) {
        AppUser superiorLeader = appUserService.getSuperiorLeader(id);
        return R.ok(superiorLeader);
    }
    @ResponseBody
    @PostMapping("/onlineRecord")
    @ApiOperation(value = "10分钟定时任务调用,记录用户在线时长", tags = {"小程序-个人中心首页"})
    public R onlineRecord() {
        appUserService.onlineRecord();
        return R.ok();
    }
    /**
@@ -357,8 +288,8 @@
            List<Order> orders = orderClient.getRedeemedOrdersByShop(shopId).getData();
            List<Long> userIds = orders.stream().map(Order::getAppUserId).collect(Collectors.toList());
            //门店作为服务商的用户
            Set<Long> shopServerUser = getShopServerUser(shopId);
            userIds.addAll(shopServerUser);
           /* Set<Long> shopServerUser = getShopServerUser(shopId);
            userIds.addAll(shopServerUser);*/
            queryWrapper.in(!CollectionUtils.isEmpty(userIds), "id", userIds)
                    .like(StringUtils.isNotEmpty( appUser.getName()),"name", appUser.getName());
        }
@@ -391,12 +322,6 @@
        appUser.setExcludeStatus(3);
        IPage<AppUser> appuserPage = appUserService.getAppuserPage(pageNum, pageSize, appUser, shopId, userId);
        for (AppUser record : appuserPage.getRecords()) {
            if (record.getInviteUserId() != null) {
                AppUser byId1 = appUserService.getById(record.getInviteUserId());
                if (byId1!=null) {
                    record.setInviteUserName(byId1.getName());
                }
            }
            Shop shop1 = shopClient.getServiceProvider(record.getId()).getData();
            if(null != shop1){
                record.setShopName(shop1.getName());
@@ -425,12 +350,12 @@
        }
        IPage<AppUser> appuserPage = appUserService.getAppuserPage(pageNum, pageSize, appUser, shopId, userId);
        for (AppUser record : appuserPage.getRecords()) {
            if (record.getInviteUserId() != null) {
           /* if (record.getInviteUserId() != null) {
                AppUser byId1 = appUserService.getById(record.getInviteUserId());
                if (byId1!=null) {
                    record.setInviteUserName(byId1.getName());
                }
            }
            }*/
            if (record.getShopId()!=null){
                R<Shop> shopById = shopClient.getShopById(record.getShopId());
                if (shopById.getData()!=null){
@@ -461,8 +386,8 @@
            for (Order datum : listR.getData()) {
                userIds.add(datum.getAppUserId());
            }
            Set<Long> shopServerUser = getShopServerUser(objectId);
            userIds.addAll(shopServerUser);
           /* Set<Long> shopServerUser = getShopServerUser(objectId);
            userIds.addAll(shopServerUser);*/
        }
        IPage<AppUser> appuserPage = appUserService.getAppuserPage1(pageCurr, pageSize, appUser, userIds);
        return R.ok(appuserPage);
@@ -530,19 +455,19 @@
            byId.setShopNames(shopName);
        }
        //推广人
        if (byId.getInviteUserId() != null) {
        /*if (byId.getInviteUserId() != null) {
            AppUser appUser = appUserService.getById(byId.getInviteUserId());
            if(null != appUser){
                byId.setInviteUserName(appUser.getName());
            }
        }
        }*/
        //最后下单时间
        R<Order> lastOrder = remoteOrderGoodsClient.getLastOrder(id);
        if (lastOrder.getData() != null) {
            byId.setLastOrderTime(lastOrder.getData().getCreateTime());
        }
        List<AppUser> list = appUserService.lambdaQuery().eq(AppUser::getInviteUserId, id).list();
        byId.setBottomUsers(list);
        /*List<AppUser> list = appUserService.lambdaQuery().eq(AppUser::getInviteUserId, id).list();
        byId.setBottomUsers(list);*/
        //消费总金额
        if(null == shopId || 1 == sysUser.getRoleType()){
            shopId = -1;
@@ -561,31 +486,7 @@
        return R.ok(byId);
    }
    /**
     * 获取指定用户的下级用户
     */
    @GetMapping("/bottom/list")
    @ApiOperation(value = "用户列表-下级用户", tags = {"管理后台"})
    public R<Page<AppUser>> bottom(Integer pageNum, Integer pageSize, Long userId){
        Page<AppUser> page = appUserService.page(Page.of(pageNum, pageSize), new LambdaQueryWrapper<AppUser>()
                .eq(AppUser::getInviteUserId, userId));
        return R.ok(page);
    }
    @GetMapping("/bottom")
    @ApiOperation(value = "用户列表-绑定下级列表", tags = {"管理后台"})
    public R<Page<AppUser>> bottom(Long id, Integer pageNum, Integer pageSize) {
        //绑定下级
        Page<AppUser> page = appUserService.lambdaQuery()
                .eq(AppUser::getInviteUserId, id)
                .eq(AppUser::getDelFlag, 0)
                .eq(AppUser::getStatus, 1)
                .page(Page.of(pageNum, pageSize));
        return R.ok(page);
    }
    @GetMapping("/orders")
    @ApiOperation(value = "用户列表-订单列表", tags = {"管理后台"})
@@ -639,16 +540,6 @@
    }
    /**
     * 设置指定用户的下级用户绑定门店
     */
    @PostMapping("/setLowerUserShop")
    public R<Void> setLowerUserShop(@RequestParam("userId") Long userId,@RequestParam("shopId") Integer shopId) {
        appUserService.update(new LambdaUpdateWrapper<AppUser>()
                .set(AppUser::getShopId,shopId)
                .eq(AppUser::getInviteUserId, userId));
        return R.ok();
    }
    /**
@@ -718,8 +609,8 @@
            shopId = data.getObjectId();
            if(null == userId){
                userIds = orderClient.getAppUserByShoppingShop(shopId).getData();
                Set<Long> shopServerUser = getShopServerUser(shopId);
                userIds.addAll(shopServerUser);
              /*  Set<Long> shopServerUser = getShopServerUser(shopId);
                userIds.addAll(shopServerUser);*/
            }else{
                userIds = new HashSet<>();
                userIds.add(userId);
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserApplyForAdmissionController.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.account.controller;
import com.ruoyi.account.api.model.ApplyForAdmission;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.service.UserApplyForAdmissionService;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Api(tags = {"申请入驻"})
@RestController
@RequestMapping("/user-applyForAdmission")
@Slf4j
public class UserApplyForAdmissionController {
    @Resource
    private UserApplyForAdmissionService userApplyForAdmissionService;
    @PostMapping("/apply")
    @ApiOperation(value = "入驻申请", tags = {"小程序-个人中心首页-申请合作"})
    public R apply(ApplyForAdmissionDTO applyForAdmissionDTO) {
        userApplyForAdmissionService.apply(applyForAdmissionDTO);
        return R.ok();
    }
    @GetMapping("/read")
    @ApiOperation(value = "查看入驻申请", tags = {"小程序-个人中心首页-申请合作"})
    public R<ApplyForAdmission> read() {
        return R.ok(userApplyForAdmissionService.read());
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -49,6 +49,7 @@
    private OrderClient orderClient;
    /**
     * 获取个人积分
     */
@@ -64,9 +65,7 @@
    @GetMapping("/getUserPointDetail")
    @ApiOperation("获取变更明细")
    public R<PageInfo<UserPointDetailVO>> getUserPointDetail(@ApiParam("指定日期") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date,
                                          @ApiParam("变动类型(1=消费积分,2=返佣积分,3=拉新人积分,4=兑换商品 " +
                                                  "5 = 门店业绩积分 6 =门店返佣积分7=技师业绩积分8 =转赠积分 9 =做工积分 " +
                                                  "10 =注册积分 )") Integer type, Integer pageCurr, Integer pageSize) {
                                          @ApiParam("变动类型(4=兑换商品,12=他人赠送,13=赠与他人,16=取消订单,17=充值 )") Integer type, Integer pageCurr, Integer pageSize) {
        LocalDateTime startTime = null;
        LocalDateTime endTime = null;
        if (date != null) {
@@ -107,7 +106,17 @@
        return R.ok();
    }
    /**
     * 删除用户积分流水
     */
    @DeleteMapping("/deleteUserPoint")
    public R deleteUserPoint(@RequestParam("orderId") Long orderId) {
        userPointService.remove(new LambdaQueryWrapper<UserPoint>().eq(UserPoint::getObjectId, orderId));
        return R.ok();
    }
    /**
     * 积分统计
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/ApplyForAdmissionDTO.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.account.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ApplyForAdmissionDTO {
    @ApiModelProperty("商家名称")
    private String shopName;
    @ApiModelProperty("商家封面图")
    private String homePicture;
    @ApiModelProperty("店铺详情图")
    private String detailsPicture;
    @ApiModelProperty("资质证书图片")
    private String certification;
    @ApiModelProperty("店长姓名")
    private String shopManager;
    @ApiModelProperty("电话")
    private String phone;
    @ApiModelProperty(value = "客服电话(同步到t_phone表)")
    private String serviceTel;
    @ApiModelProperty(value = "营业星期:1-周一到周日 2-周一周五 3-仅周末")
    private Integer businessDate;
    @ApiModelProperty(value = "经度")
    private String longitude;
    @ApiModelProperty(value = "纬度")
    private String latitude;
    @ApiModelProperty(value = "详细地址")
    private String address;
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/ApplyForAdmissionMapper.java
New file
@@ -0,0 +1,8 @@
package com.ruoyi.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.account.api.model.AppUserBank;
import com.ruoyi.account.api.model.ApplyForAdmission;
public interface ApplyForAdmissionMapper extends BaseMapper<ApplyForAdmission> {
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.vo.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -48,32 +49,12 @@
    
    /**
     * 注册账号
     * @param registerAccount
     * @return
     */
//    R<LoginVo> registerAccount(RegisterAccount registerAccount);
    /**
     * 获取用户的祖籍列表
     */
    List<AppUser> getUserAncestorList(Long id,List<AppUser> list);
    /**
     * 获取指定用户的直帮上级用户(消费用户绑定的上级,最近一个用户会员类型为【创业者】的用户)
     */
    AppUser getSuperiorLeader(Long id);
    /**
     * 解绑推广人
     */
    void unbindThePromoter();
    /**
     * 在线记录操作,用于赠送积分
     */
    void onlineRecord();
    IPage<AppUser> getAppuserPage(Integer pageNum, Integer pageSize, AppUser appUser, Integer shopId, Set<Long> userId);
@@ -81,4 +62,8 @@
    IPage<AppUser> getAppuserPage1(Integer pageNum, Integer pageSize, AppUser appUser,List<Long> userIds);
    List<AppUser> getAppUserByPhoneNoFilter(String phone);
    AppUser index();
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserApplyForAdmissionService.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.account.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.ApplyForAdmission;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
public interface UserApplyForAdmissionService extends IService<ApplyForAdmission> {
    void apply(ApplyForAdmissionDTO applyForAdmissionDTO);
    ApplyForAdmission read();
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -8,6 +8,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.mapper.AppUserMapper;
import com.ruoyi.account.service.*;
import com.ruoyi.account.util.GeodesyUtil;
@@ -30,7 +31,9 @@
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -267,8 +270,6 @@
    /**
     * 注册账号
     * @param registerAccount
     * @return
     */
    /*
    @Override
@@ -473,149 +474,9 @@
    
    @Override
    public List<AppUser> getUserAncestorList(Long id, List<AppUser> list) {
        if (list == null) {
            list = new ArrayList<>();
        }
        Set<Long> visitedIds = new HashSet<>();
        Long currentId = id;
        while (currentId != null && !visitedIds.contains(currentId)) {
            AppUser appUser = getById(currentId);
            if (appUser == null) {
                break; // 如果用户不存在,终止循环
            }
            Long inviteUserId = appUser.getInviteUserId();
            if (inviteUserId != null) {
                AppUser invitedUser = getById(inviteUserId);
                if (invitedUser != null) {
                    list.add(invitedUser);
                    visitedIds.add(currentId);
                    currentId = inviteUserId;
                } else {
                    break; // 如果邀请用户不存在,终止循环
                }
            } else {
                break; // 如果没有邀请用户,终止循环
            }
        }
        return list;
    }
    @Override
    public AppUser getSuperiorLeader(Long id) {
        AppUser appUser = getById(id);
        Long inviteUserId = appUser.getInviteUserId();
        AppUser inviteUser = getById(inviteUserId);
        if (inviteUser == null){
            return null;
        }
        if (inviteUser.getVipId() > 3) {
            return inviteUser;
        }else {
            return getSuperiorLeader(inviteUserId);
        }
    }
    
    
    /**
     * 定时解绑推广人
     */
    @Override
    public void unbindThePromoter() {
        //注册X天后没有升级成黄金会员则自动解绑推广人
        //解绑推广人
        Set<Long> unbind_promoter = redisTemplate.opsForZSet().rangeByScore("unbind_promoter", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
        if(unbind_promoter.size() > 0){
            List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getVipId, 1).eq(AppUser::getDelFlag, 0).isNotNull(AppUser::getInviteUserId)
                    .eq(AppUser::getStatus, 1).in(AppUser::getId, unbind_promoter));
            for (AppUser appUser : list) {
                UpdateWrapper<AppUser> updateWrapper = new UpdateWrapper<>();
                updateWrapper.set("invite_user_id", null).set("shop_id", null).eq("id", appUser.getId());
                this.update(updateWrapper);
            }
            redisTemplate.opsForZSet().remove("unbind_promoter", unbind_promoter.toArray());
        }
        //可更换推广人
        Set<Long> replaceable = redisTemplate.opsForZSet().rangeByScore("replaceable", 0, LocalDateTime.now().toEpochSecond(ZoneOffset.UTC));
        if(replaceable.size() > 0){
            List<AppUser> list = this.list(new LambdaQueryWrapper<AppUser>().eq(AppUser::getDelFlag, 0).eq(AppUser::getChangePromoter, 0)
                    .eq(AppUser::getStatus, 1).in(AppUser::getId, replaceable));
            for (AppUser appUser : list) {
                Long data = orderClient.getOrderCountByAppUserId(appUser.getId()).getData();
                if(data == 0L){
                    appUser.setChangePromoter(1);
                    this.updateById(appUser);
                }
            }
            redisTemplate.opsForZSet().remove("replaceable", replaceable.toArray());
        }
    }
    /**
     * 在线记录操作,用于赠送积分
     */
    @Override
    public void onlineRecord() {
        Long userid = tokenService.getLoginUserApplet().getUserid();
        Object cacheObject = redisService.getCacheObject("ONLINE_" + userid);
        if(null == cacheObject){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("time", System.currentTimeMillis());
            jsonObject.put("online", 0);
            redisService.setCacheObject("ONLINE_" + userid, jsonObject, 1L, TimeUnit.HOURS);
        }else{
            JSONObject jsonObject = (JSONObject) cacheObject;
            long time = System.currentTimeMillis() - jsonObject.getInteger("time");
            Integer online = jsonObject.getInteger("online");
            online++;
            //时间满足1小时,并且次数记录满足6次(10分钟记录一次)
            if(time >= 3600000 && 6 <= online){
                jsonObject.put("time", System.currentTimeMillis());
                jsonObject.put("online", 0);
                redisService.setCacheObject("ONLINE_" + userid, jsonObject, 1L, TimeUnit.HOURS);
                AppUser appUser = this.getById(userid);
                PointSetting pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()).getData();
                if(null != pointSetting){
                    int hourPoint = pointSetting.getHourPoint().intValue();
                    int hourPoint1 = 0;
                    if(1 == pointSetting.getWorkPointOpen()){
                        hourPoint1 = new BigDecimal(hourPoint).multiply(pointSetting.getWorkPoint().divide(new BigDecimal(100))).intValue();
                    }
                    //添加积分变动记录
                    if(hourPoint > 0){
                        Integer lavePoint = appUser.getLavePoint();
                        appUser.setTotalPoint(appUser.getTotalPoint() + hourPoint);
                        appUser.setLavePoint(appUser.getLavePoint() + hourPoint);
                        appUser.setAvailablePoint(appUser.getAvailablePoint() + hourPoint1);
                        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() + hourPoint1);
                        if(null != pointSetting && 1 == pointSetting.getWorkPointGift()){
                            appUser.setTransferablePoint(appUser.getTransferablePoint() + hourPoint1);
                        }
                        appUser.setTotalHourPoint(appUser.getTotalHourPoint() + hourPoint);
                        this.updateById(appUser);
                        UserPoint userPoint = new UserPoint();
                        userPoint.setType(6);
                        userPoint.setHistoricalPoint(lavePoint);
                        userPoint.setVariablePoint(hourPoint);
                        userPoint.setBalance(appUser.getLavePoint());
                        userPoint.setCreateTime(LocalDateTime.now());
                        userPoint.setAppUserId(appUser.getId());
                        userPointService.save(userPoint);
                    }
                }
            }else{
                jsonObject.put("online", online);
                redisService.setCacheObject("ONLINE_" + userid, jsonObject, 1L, TimeUnit.HOURS);
            }
        }
    }
    @Override
    public IPage<AppUser> getAppuserPage(Integer pageNum, Integer pageSize, AppUser appUser, Integer shopId, Set<Long> userId) {
@@ -643,4 +504,26 @@
    public List<AppUser> getAppUserByPhoneNoFilter(String phone) {
        return this.baseMapper.getAppUserByPhoneNoFilter(phone);
    }
    /**
     * 小程序-个人中心
     * @return
     */
    @Override
    public AppUser index() {
        Long userId = tokenService.getLoginUserApplet().getUserid();
        //当前用户信息
        AppUser user = this.getById(userId);
        //查询门店,如果门店被冻结
        List<Shop> shopList = shopClient.getShopByUserId(userId).getData();
        user.setShopStatus(0);//未拥有门店
        if (shopList != null && !shopList.isEmpty()) {
            for (Shop shop : shopList) {
                user.setShopStatus(shop.getStatus());//门店状态
            }
        }
        return user;
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserApplyForAdmissionServiceImpl.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.account.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.api.model.ApplyForAdmission;
import com.ruoyi.account.dto.ApplyForAdmissionDTO;
import com.ruoyi.account.mapper.AppUserMapper;
import com.ruoyi.account.mapper.ApplyForAdmissionMapper;
import com.ruoyi.account.service.UserApplyForAdmissionService;
import com.ruoyi.common.security.service.TokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@Slf4j
@Service
public class UserApplyForAdmissionServiceImpl extends ServiceImpl<ApplyForAdmissionMapper, ApplyForAdmission> implements UserApplyForAdmissionService {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private ApplyForAdmissionMapper userApplyForAdmissionMapper;
    /**
     * 申请入驻
     */
    @Override
    public void apply(ApplyForAdmissionDTO applyForAdmissionDTO) {
        Long userid = tokenService.getLoginUserApplet().getUserid();
        ApplyForAdmission applyForAdmission = new ApplyForAdmission();
        BeanUtils.copyProperties(applyForAdmissionDTO, applyForAdmission);
        applyForAdmission.setCreateTime(LocalDateTime.now());
        applyForAdmission.setApplyUserId(userid);
        applyForAdmission.setStatus(0);
        this.save(applyForAdmission);
    }
    /**
     * 查看
     */
    @Override
    public ApplyForAdmission read() {
        Long userid = tokenService.getLoginUserApplet().getUserid();
        return userApplyForAdmissionMapper.selectOne(new LambdaQueryWrapper<ApplyForAdmission>().eq(ApplyForAdmission::getApplyUserId, userid));
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -50,18 +50,14 @@
    @Override
    public UserPointVO getUserPoint(Long userId) {
        AppUser appUser = appUserService.getById(userId);
        int totalPoint = 0;
        int sharePoint = 0;
        int shopAchievementPoint = 0;
        int shopSharePoint = 0;
        UserPointVO userPointVO = new UserPointVO();
        userPointVO.setTotalPoint(appUser.getTotalPoint() + totalPoint);
        userPointVO.setTotalPoint(appUser.getUserTotalPoint() );
        userPointVO.setConsumePoint(appUser.getAvailablePoint());
        userPointVO.setShopPoint(appUser.getShopPoint());
        userPointVO.setSharePoint(appUser.getSharePoint() + sharePoint);
        userPointVO.setPullNewPoint(appUser.getTotalInvitePoint());
        userPointVO.setShopAchievementPoint(appUser.getShopAchievementPoint() + shopAchievementPoint);
        userPointVO.setShopSharePoint(appUser.getShopSharePoint() + shopSharePoint);
        userPointVO.setRechargePoint(appUser.getRechargePoint());
        userPointVO.setCancelPoint(appUser.getCancelPoint());
        userPointVO.setExpendPoint(appUser.getExchangePoint());
        userPointVO.setTransferableInPoint(appUser.getTransferableInPoint());
        userPointVO.setTransferableOutPoint(appUser.getTransferableOutPoint());
        return userPointVO;
    }
@@ -107,10 +103,8 @@
        if (appUser == null) {
            return R.fail("用户未找到");
        }
        // 可转赠积分总数
        Integer transferablePoint = appUser.getTransferablePoint();
        if (point > transferablePoint) {
            return R.fail("可转赠积分不足");
        if (appUser.getAvailablePoint() < point) {
            return R.fail("用户可用积分不足");
        }
        AppUser appUserForPhoe = appUserService.getOne(new LambdaQueryWrapper<AppUser>()
@@ -124,38 +118,43 @@
        if(appUserForPhoe.getId().equals(userid)){
            return R.fail("不能转增给自己");
        }
        Integer lavePoint1 = appUserForPhoe.getLavePoint();
        appUserForPhoe.setLavePoint(appUserForPhoe.getLavePoint() + point);
        appUserForPhoe.setTotalPoint(appUserForPhoe.getTotalPoint() + point);
        appUserForPhoe.setTransferablePoint(transferablePoint + point);
        appUserForPhoe.setAvailablePoint(appUserForPhoe.getAvailablePoint() + point);
        appUserForPhoe.setTotalAvailablePoint(appUserForPhoe.getTotalAvailablePoint() + point);
        Integer historicalPoint = appUserForPhoe.getAvailablePoint();//历史积分
        Integer balance = historicalPoint +point;//变动后积分
        appUserForPhoe.setAvailablePoint(balance);//可用积分增加
        appUserForPhoe.setTotalPoint(appUserForPhoe.getUserTotalPoint() + point);//总积分增加
        appUserForPhoe.setTransferableInPoint(appUserForPhoe.getTransferableInPoint() + point);//转入积分增加
        appUserService.updateById(appUserForPhoe);
        //构建积分流水记录
        if(point > 0){
            //转入用户
            UserPoint userPoint = new UserPoint();
            userPoint.setType(12);
            userPoint.setHistoricalPoint(lavePoint1);
            userPoint.setHistoricalPoint(historicalPoint);
            userPoint.setVariablePoint(point);
            userPoint.setBalance(appUserForPhoe.getLavePoint());
            userPoint.setBalance(balance);
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(appUserForPhoe.getId());
            userPoint.setObjectId(userid);
            userPointService.save(userPoint);
        }
        Integer lavePoint = appUser.getLavePoint();
        appUser.setLavePoint(appUser.getLavePoint() - point);
        appUser.setTransferablePoint(appUser.getTransferablePoint() - point);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - point);
        Integer historicalPoint2 = appUserForPhoe.getAvailablePoint();//历史积分
        Integer balance2 = historicalPoint - point;//变动后积分
        appUser.setAvailablePoint(balance);//可用积分减少
        appUser.setTransferableOutPoint(appUserForPhoe.getTransferableOutPoint() + point);//转出积分增加
        appUserService.updateById(appUser);
        //构建积分流水记录
        if(point > 0){
            UserPoint userPoint = new UserPoint();
            userPoint.setType(13);
            userPoint.setHistoricalPoint(lavePoint);
            userPoint.setHistoricalPoint(historicalPoint2);
            userPoint.setVariablePoint(point);
            userPoint.setBalance(appUser.getLavePoint());
            userPoint.setBalance(balance2);
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(appUser.getId());
            userPoint.setObjectId(appUserForPhoe.getId());
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java
@@ -14,21 +14,18 @@
    @ApiModelProperty(value = "可消费积分")
    private Integer consumePoint;
    @ApiModelProperty(value = "消费积分数")
    private Integer shopPoint;
    @ApiModelProperty(value = "充值积分")
    private Integer rechargePoint;
    @ApiModelProperty(value = "取消订单积分")
    private Integer sharePoint;
    @ApiModelProperty(value = "充值积分")
    private Integer pullNewPoint;
    private Integer cancelPoint;
    @ApiModelProperty(value = "兑换商品")
    private Integer shopAchievementPoint;
    private Integer expendPoint;
    @ApiModelProperty(value = "转增(转入)")
    private Integer shopSharePoint;
    private Integer transferableInPoint;
    @ApiModelProperty(value = "转增(转出)")
    private Integer giftPoint;
    private Integer transferableOutPoint;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java
@@ -90,10 +90,9 @@
                .eq(OrderGood::getOrderId, orderId));
        String expressJson = tOrder.getExpressJson();
        JSONObject jsonObject = JSONObject.parseObject(expressJson);
        String com = jsonObject.getString("com");
        String num = jsonObject.getString("num");
        Order order = new Order();
        order.setDelivery_mode(1);
@@ -111,8 +110,6 @@
            Goods goods = JSONObject.parseObject(goodJson, Goods.class);
            String name = goods.getName();
            Shipping shipping = new Shipping();
            shipping.setTracking_no(num);
            shipping.setExpress_company(com);
            shipping.setItem_desc(name + "*" + orderGoodNum);
            String phone = maskPhoneNumber(shop.getPhone());
            Contact contact = new Contact();
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -318,9 +318,6 @@
    /**
     * 小程序取消订单
     *
     * @param orderId
     * @return
     */
    @Override
    public R cancel(Long orderId) {
@@ -339,14 +336,9 @@
            return R.fail("订单取消失败");
        }
        order.setOrderStatus(5);
        //todo 商品销售数量
        R r = refundPayMoney(order);
        if (200 == r.getCode()) {
            this.updateById(order);
        }
        R r2 = userPointClient.deleteUserPointCopy(orderId, Arrays.asList(8));//门店业绩
        if (200 != r2.getCode()) { // 项目没有分布式事务,此处报错可能会导致数据不一致
            throw new RuntimeException("订单取消失败");
        }
        return r;
    }
@@ -379,71 +371,82 @@
    /**
     * 返回订单支付金额和回退积分和会员等级
     *
     * @param order
     * 回退积分和返回订单支付金额
     */
    public R refundPayMoney(Order order) {
        //开始退款
        //先回退积分
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if (order.getPoint()>0) {
            //返回订单抵扣积分
            Integer historicalPoint = appUser.getAvailablePoint();
            Integer availablePoint = appUser.getAvailablePoint() + order.getPoint();//可用积分
            Integer cancelPoint = appUser.getCancelPoint() + order.getPoint();//取消订单积分
            appUser.setAvailablePoint(availablePoint);
            appUser.setCancelPoint(cancelPoint);
            appUserClient.editAppUserById(appUser);
            //构建积分流水
            UserPoint userPoint = new UserPoint();
            userPoint.setType(16);//取消订单
            userPoint.setHistoricalPoint(historicalPoint);
            userPoint.setVariablePoint(order.getPoint());
            userPoint.setBalance(availablePoint);
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(order.getAppUserId());
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
        }
        BigDecimal paymentAmount = order.getPaymentAmount();
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if (BigDecimal.ZERO.compareTo(order.getPaymentAmount()) < 0) {//支付的金额是否大于0
            //微信退款
            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback");
            if ("100".equals(refund.getRa_Status())) {
                order.setRefundStatus(1);
                return R.ok();
            } else {
                return R.fail(refund.getRc_CodeMsg());
            if (!"100".equals(refund.getRa_Status())) {
                return R.fail(refund.getRc_CodeMsg());//退款失败
            }
        }
        if (0 != order.getPoint()) {//使用的积分是否为0
            Integer lavePoint = appUser.getAvailablePoint();
            //积分退款
            appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
            appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
            UserPoint userPoint1 = new UserPoint();
            userPoint1.setType(11);
            userPoint1.setObjectId(order.getId());
            List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();//用户积分流水
            Integer transferablePoint = order.getPoint();
            if (data.size() > 0) {
                UserPoint userPoint = data.get(0);
                transferablePoint = Integer.valueOf(userPoint.getExtention());
            }
            //构建积分流水明细
            if (order.getPoint() > 0) {
                UserPoint userPoint = new UserPoint();
                userPoint.setType(11);
                userPoint.setHistoricalPoint(lavePoint);
                userPoint.setVariablePoint(order.getPoint());
                userPoint.setBalance(appUser.getAvailablePoint());
                userPoint.setCreateTime(LocalDateTime.now());
                userPoint.setAppUserId(order.getAppUserId());
                userPoint.setObjectId(order.getId());
                userPointClient.saveUserPoint(userPoint);
            }
            appUserClient.editAppUserById(appUser);
        }
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        orderMapper.updateById(order);
        //todo 退款后店铺积分流水以及退款前店铺积分流水
       /* shopPointClient.deleteShopPointCopy(order.getId(), Arrays.asList(1,2,3));
        shopBalanceStatementClient.deleteShopBalanceStatementCopy(order.getId(), Arrays.asList(1,2,3));
        appUserGiveawayTemporaryClient.delAppUserGiveawayTemporary(order.getId());
        shopGiveawayTemporaryClient.delShopGiveawayTemporary(order.getId());*/
        //商品销售数量
        OrderGood orderGood = orderGoodService.getOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId()));
        goodsClient.editGoodsNum(orderGood.getGoodsId(), -1);
        //获取商品json
        Goods good = JSON.parseObject(orderGood.getGoodJson(), Goods.class);
        //门店减少冻结资金 即减少余额, 冻结资金=余额-可用资金
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        BigDecimal historicalBalance=shop.getBalance();//历史余额
        BigDecimal variableAmount=good.getSellingPrice();//变动金额
        BigDecimal balance=shop.getBalance().subtract(good.getSellingPrice());//变动后余额
        shop.setBalance(balance);
        shopClient.updateShop(shop);
        //门店余额流水记录
        ShopBalanceStatement shopBalanceStatement = new ShopBalanceStatement();
        shopBalanceStatement.setShopId(shop.getId());
        shopBalanceStatement.setShopName(shop.getName());
        shopBalanceStatement.setShopManagerName(shop.getShopManager());
        shopBalanceStatement.setPhone(shop.getPhone());
        shopBalanceStatement.setType(6);//变更类型,订单退款
        shopBalanceStatement.setHistoricalBalance(historicalBalance);
        shopBalanceStatement.setVariableAmount(variableAmount);
        shopBalanceStatement.setCreateTime(LocalDateTime.now());
        shopBalanceStatement.setBalance(balance);
        shopBalanceStatement.setCreateUserId(appUser.getId());
        shopBalanceStatement.setObjectId(order.getId());
        shopBalanceStatementClient.saveShopBalanceStatement(shopBalanceStatement);
        return R.ok();
    }
    /**
     * 取消订单后回调处理
     * 退款后后回调处理
     *
     * @return
     */
@@ -664,7 +667,6 @@
    /**
     * 订单支付
     * todo 用户积分流水情况
     */
    @Override
    public R orderPayment(OrderPayment orderPayment) {
@@ -712,7 +714,7 @@
            return R.fail("支付方式不正确");
        }
        //现金支付的订单总金额
        //订单总金额
        BigDecimal orderMoney = BigDecimal.ZERO;
        //积分支付的订单积分
        Integer orderPoint = 0;
@@ -793,28 +795,27 @@
        //判断积分是否为零,积分支付
        if (0 != order.getPoint()){
            //积分支付
            Integer lavePoint = appUser.getAvailablePoint();
            Integer historicalPoint = appUser.getAvailablePoint();//历史积分
            Integer availablePoint = historicalPoint - orderPoint;//可用积分
            Integer exchangePoint = appUser.getExchangePoint() + orderPoint;//兑换商品消费积分
            //扣减订单支付积分
            appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint);//剩余积分
            appUser.setAvailablePoint(appUser.getAvailablePoint() - orderPoint);//可用积分
            appUser.setAvailablePoint(availablePoint);
            appUser.setExchangePoint(exchangePoint );
            //构建积分流水记录
            if(orderPoint > 0){
                UserPoint userPoint = new UserPoint();
                userPoint.setType(11);
                userPoint.setHistoricalPoint(lavePoint);
                userPoint.setVariablePoint(orderPoint);
                userPoint.setBalance(appUser.getAvailablePoint());
                userPoint.setCreateTime(LocalDateTime.now());
                userPoint.setAppUserId(appUser.getId());
                userPoint.setObjectId(order.getId());
                userPointClient.saveUserPoint(userPoint);
            }
            UserPoint userPoint = new UserPoint();
            userPoint.setType(4);//兑换商品
            userPoint.setHistoricalPoint(historicalPoint);
            userPoint.setVariablePoint(orderPoint);
            userPoint.setBalance(availablePoint);
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(appUser.getId());
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
            //用户积分变动
            appUser.setLastShopTime(LocalDateTime.now());
            appUserClient.editAppUserById(appUser);
/*            //变更等级
            applicationEventPublisher.publishEvent(new PayEvent(JSON.toJSONString(appUser)));*/
        }
        //判断需要支付的金额是否大于0
@@ -842,10 +843,12 @@
        //商品销量增加
        goodsClient.editGoodsNum(orderGood.getGoodsId(), 1);
        //门店增加冻结资金 即增加金额, 冻结资金=余额-可用资金
        //门店增加冻结资金 即增加余额, 冻结资金=余额-可用资金
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        BigDecimal historicalBalance=shop.getBalance();//历史余额
        BigDecimal variableAmount=goods.getSellingPrice();//变动金额
        BigDecimal balance=shop.getBalance().add(goods.getSellingPrice());//变动后余额
        shop.setBalance(balance);
        shop.setOrderNumber(shop.getOrderNumber()+1);
        shopClient.updateShop(shop);
@@ -858,7 +861,7 @@
        shopBalanceStatement.setPhone(shop.getPhone());
        shopBalanceStatement.setType(5);//变更类型,订单收入
        shopBalanceStatement.setHistoricalBalance(historicalBalance);
        shopBalanceStatement.setVariableAmount(goods.getSellingPrice());
        shopBalanceStatement.setVariableAmount(variableAmount);
        shopBalanceStatement.setCreateTime(LocalDateTime.now());
        shopBalanceStatement.setBalance(balance);
        shopBalanceStatement.setCreateUserId(appUser.getId());
@@ -879,7 +882,7 @@
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        BigDecimal paymentMoney = order.getPaymentAmount();
        //构建积分流水记录
        //增加用户消费总金额(微信支付金额)
        appUser.setShopAmount(appUser.getShopAmount().add(paymentMoney).setScale(2, RoundingMode.HALF_EVEN));//消费总金额
        appUser.setLastShopTime(LocalDateTime.now());
        appUserClient.editAppUserById(appUser);
@@ -895,11 +898,14 @@
        OrderGood orderGood = orderGoodService.getOne(new LambdaQueryWrapper<OrderGood>().eq(OrderGood::getOrderId, order.getId()));
        //商品销量增加
        goodsClient.editGoodsNum(orderGood.getGoodsId(), 1);
        Goods goods = JSON.parseObject(orderGood.getGoodJson(), Goods.class);
        //门店增加冻结资金 即增加金额, 冻结资金=余额-可用资金
        Shop shop = shopClient.getShopById(order.getShopId()).getData();
        BigDecimal historicalBalance=shop.getBalance();//历史余额
        BigDecimal balance=shop.getBalance().add(order.getTotalAmount());//变动后余额
        BigDecimal variableAmount=goods.getSellingPrice();//变动余额
        BigDecimal balance=shop.getBalance().add(variableAmount);//变动后余额
        shop.setBalance(balance);
        shop.setOrderNumber(shop.getOrderNumber()+1);
        shopClient.updateShop(shop);
@@ -912,7 +918,7 @@
        shopBalanceStatement.setPhone(shop.getPhone());
        shopBalanceStatement.setType(5);//变更类型,订单收入
        shopBalanceStatement.setHistoricalBalance(historicalBalance);
        shopBalanceStatement.setVariableAmount(order.getTotalAmount());
        shopBalanceStatement.setVariableAmount(variableAmount);
        shopBalanceStatement.setCreateTime(LocalDateTime.now());
        shopBalanceStatement.setBalance(balance);
        shopBalanceStatement.setCreateUserId(appUser.getId());
@@ -924,7 +930,6 @@
    /**
     * 定时任务关闭订单
     * todo 关闭订单前,检查是否先支付过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水,门店余额流水的删除
     */
    @Override
    public void closeOrder() {
@@ -946,6 +951,30 @@
                    log.error("关闭订单失败:{}---->{}", order.getOrderNumber(), JSON.toJSONString(closeOrderResult));
                }
                redisTemplate.opsForZSet().remove("OrderPayment", order.getOrderNumber());
                //关闭订单后,检查是否先有过积分抵扣了,是的话要返回订单已抵扣的积分,以及用户积分流水的删除
                if (order.getPoint()>0) {
                    //返回订单抵扣积分
                    AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
                    Integer availablePoint = appUser.getAvailablePoint();//可用积分
                    Integer variablePoint = order.getPoint();//变动积分
                    Integer balance = appUser.getAvailablePoint() + order.getPoint();//变动后积分
                    Integer cancelPoint = appUser.getCancelPoint() + order.getPoint();//取消订单积分
                    appUser.setAvailablePoint(availablePoint);
                    appUser.setCancelPoint(cancelPoint);
                    //构建积分流水记录
                    UserPoint userPoint = new UserPoint();
                    userPoint.setType(16);//取消订单
                    userPoint.setHistoricalPoint(availablePoint);
                    userPoint.setVariablePoint(variablePoint);
                    userPoint.setBalance(balance);
                    userPoint.setCreateTime(LocalDateTime.now());
                    userPoint.setAppUserId(appUser.getId());
                    userPoint.setObjectId(order.getId());
                    userPointClient.saveUserPoint(userPoint);
                    appUserClient.editAppUserById(appUser);
                }
            }
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/TaskUtil.java
@@ -1,6 +1,7 @@
package com.ruoyi.order.util;
import com.ruoyi.account.api.feignClient.UserPointClient;
import com.ruoyi.order.service.OrderService;
import org.springframework.scheduling.annotation.Scheduled;
@@ -21,10 +22,10 @@
    
    @Resource
    private OrderService orderService;
    //每分钟
    @Scheduled(fixedRate = 60000)
    public void taskMonth() {
        orderService.closeOrder();//定时任务关闭订单
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
@@ -16,6 +16,7 @@
import com.ruoyi.order.vo.OrderSaleNum;
import com.ruoyi.order.vo.VerifiableShopVo;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.enums.PhoneType;
import com.ruoyi.other.mapper.ShopMapper;
import com.ruoyi.other.mapper.ShopScoreMapper;
import com.ruoyi.other.service.*;
@@ -103,6 +104,10 @@
        }
        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
        shopScore.setAppUserId(loginUserApplet.getUserid());
        ShopScore one1 = shopScoreService.getOne(new LambdaQueryWrapper<ShopScore>().eq(ShopScore::getAppUserId, loginUserApplet.getUserid()));
        if (null!=one1){
            return  R.fail("不能重复评分");
        }
        shopScore.setCreateTime(LocalDateTime.now());
        shopScoreService.save(shopScore);
        //计算,更新到门店中
@@ -144,7 +149,7 @@
        if (appUser == null){
            return R.fail("该手机号未注册");
        }
        shop.setShopAllPoint(0);
     /*   shop.setShopAllPoint(0);
        shop.setLowerLevelSharePoint(0);
        shop.setSharePoint(0);
        shop.setServerPoint(0);
@@ -152,12 +157,12 @@
        shop.setGiveawayAllMoney(BigDecimal.ZERO);
        shop.setGiveawayMoney(BigDecimal.ZERO);
        shop.setLowerLevelGiveawayMoney(BigDecimal.ZERO);
        shop.setServerGiveawayMoney(BigDecimal.ZERO);
        shop.setServerGiveawayMoney(BigDecimal.ZERO);*/
        shop.setCanWithdrawMoney(BigDecimal.ZERO);
        shop.setWithdrawMoney(BigDecimal.ZERO);
        shop.setOrderNumber(0);
        shop.setServerOrderNumber(0);
        shop.setCustomOrderNumber(0);
      /*  shop.setServerOrderNumber(0);
        shop.setCustomOrderNumber(0);*/
        shop.setAppUserId(appUser.getId());
        String city = TencentMapUtil.inverseGeographicalAnalysis(shop.getLongitude(), shop.getLatitude(), false);
        if(!StringUtils.hasLength(city)){
@@ -458,9 +463,9 @@
    @ApiOperation(value = "门店列表", tags = {"管理后台-门店管理"})
    public R<IPage<Shop>> list(@ApiParam("页码") @RequestParam("pageNum") Integer pageNum,@ApiParam("每一页数据大小") @RequestParam("pageSize") Integer pageSize,Shop shop){
        IPage<Shop> shopIPage = shopService.getShopList(pageNum, pageSize, shop);
        for (Shop record : shopIPage.getRecords()) {
        /*for (Shop record : shopIPage.getRecords()) {
            record.setLaveUsePoint(record.getLavePoint());
        }
        }*/
        return R.ok(shopIPage);
    }
@@ -531,6 +536,8 @@
                                      @ApiParam("纬度") @RequestParam BigDecimal latitude) {
        return R.ok(shopService.getShopDetail(shopId, longitude, latitude));
    }
@@ -801,76 +808,17 @@
        List<Shop> shopList = shopService.list(queryWrapper);
        BigDecimal serverGiveawayMoney = BigDecimal.ZERO;
        BigDecimal giveawayMoney = BigDecimal.ZERO;
        for (Shop shop : shopList) {
       /* for (Shop shop : shopList) {
            serverGiveawayMoney = serverGiveawayMoney.add(shop.getServerGiveawayMoney());
            giveawayMoney = giveawayMoney.add(shop.getGiveawayMoney().add(shop.getLowerLevelGiveawayMoney()));
        }
        }*/
        Map<String, BigDecimal> map = new HashMap<>();
        map.put("serverGiveawayMoney", serverGiveawayMoney);
        map.put("giveawayMoney", giveawayMoney);
        return R.ok(map);
    }
    /**
     * 获取指定用户的服务商
     * @return
     */
    @GetMapping("/getServiceProvider")
    public R<Shop> getServiceProvider(@RequestParam("appUserId") Long appUserId){
        //向上找获取第一个开店的门店
        List<Shop> list = shopService.list(new LambdaQueryWrapper<Shop>().eq(Shop::getDelFlag, 0).eq(Shop::getStatus, 1));
        AppUser appUser = appUserClient.getAppUserById(appUserId);
        //上级集合,防止循环关联
        Set<Long> pid = new HashSet<>();
        Shop shop = getSuperiorStore(appUser, list, 1, 1, pid);
        return R.ok(shop);
    }
    public Shop getSuperiorStore(AppUser appUser, List<Shop> list, Integer hierarchy, Integer num, Set<Long> pid){
        if(null == appUser.getInviteUserId()){
            return null;
        }
        if(pid.contains(appUser.getInviteUserId())){
            return null;
        }
        AppUser appUser1 = appUserClient.getAppUserById(appUser.getInviteUserId());
        if(null != appUser1){
            Optional<Shop> first = list.stream().filter(shop -> shop.getAppUserId().equals(appUser1.getId())).findFirst();
            if(first.isPresent()){
                if(hierarchy.equals(num)){
                    return first.get();
                }
                num++;
            }
        }
        return getSuperiorStore(appUser1, list, hierarchy, num, pid);
    }
    /**
     * 获取指定用户的高级服务商
     * @return
     */
    @GetMapping("/getSuperiorServiceProvider")
    public R<Shop> getSuperiorServiceProvider(@RequestParam("appUserId") Long appUserId){
        //向上找获取第一个开店的门店
        List<Shop> list = shopService.list(new LambdaQueryWrapper<Shop>().eq(Shop::getDelFlag, 0).eq(Shop::getStatus, 1));
        AppUser appUser = appUserClient.getAppUserById(appUserId);
        //上级集合,防止循环关联
        Set<Long> pid = new HashSet<>();
        Shop shop = getSuperiorStore(appUser, list, 2, 1, pid);
        return R.ok(shop);
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopBalanceStatementServiceImpl.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.other.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.other.api.domain.ShopBalanceStatement;
import com.ruoyi.other.mapper.ShopBalanceStatementMapper;
import com.ruoyi.other.service.ShopBalanceStatementService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Service
public class ShopBalanceStatementServiceImpl extends ServiceImpl<ShopBalanceStatementMapper, ShopBalanceStatement> implements ShopBalanceStatementService {
}
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml
@@ -29,6 +29,7 @@
            ts.longitude,
            ts.latitude,
            ts.status,
            ts.phone,
            (select ROUND(AVG(score), 1) from t_shop_score where shop_id = ts.id) as score
        FROM
            t_shop ts