ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
@@ -52,6 +52,12 @@ log.error("获取用户祖籍列表失败:{}", cause.getMessage()); throw new RuntimeException("获取用户祖籍列表失败"); } @Override public R<AppUser> getSuperiorLeader(Long id) { return R.fail("获取直帮上级用户失败"); } @Override public R<Long> getVipCount(Long userId, Integer vipId) { log.error("获取直推会员数失败:{}", cause.getMessage()); ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -46,6 +46,9 @@ @GetMapping("/appletLogin/getUserAncestorList") R<List<AppUser>> getUserAncestorList(@RequestParam("id") Long id); @GetMapping("/appletLogin/getSuperiorLeader") R<AppUser> getSuperiorLeader(@RequestParam("id") Long id); @PostMapping("/app-user/getVipCount") ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/OrderGood.java
@@ -77,7 +77,11 @@ @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)") @TableField("superior_type") private Integer superiorType; @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)") @TableField("superior_price_type") private Integer superiorPriceType; @ApiModelProperty(value = "核销门店可获得服务费") @TableField("servuce_shop_charges") private BigDecimal servuceShopCharges; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsVip.java
@@ -72,6 +72,10 @@ @TableField("superior_type") private Integer superiorType; @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)") @TableField("superior_price_type") private Integer superiorPriceType; @ApiModelProperty(value = "核销门店可获得服务费") @TableField("servuce_shop_charges") private BigDecimal servuceShopCharges; ruoyi-modules/ruoyi-job/pom.xml
@@ -16,6 +16,12 @@ </description> <dependencies> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-modules-order</artifactId> <version>3.6.2</version> </dependency> <!-- SpringCloud Alibaba Nacos --> <dependency> ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/AfterSalesTask.java
@@ -1,5 +1,6 @@ package com.ruoyi.job.task; import com.ruoyi.order.service.CommissionService; import lombok.extern.log4j.Log4j2; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -12,6 +13,8 @@ public class AfterSalesTask { @Resource private RedisTemplate<String, String> redisTemplate; @Resource private CommissionService commissionService; /** * 计算佣金(设置每分钟执行一次) @@ -22,6 +25,7 @@ // 从延迟队列中获取需要处理的订单 Set<String> orderIds = redisTemplate.opsForZSet().rangeByScore("delay_queue:commission", 0, now); if (orderIds != null && !orderIds.isEmpty()) { commissionService.calculationCommission(orderIds); // 处理完后移除已处理的订单 redisTemplate.opsForZSet().removeRangeByScore("delay_queue:commission", 0, now); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -290,6 +290,17 @@ 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); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java
@@ -62,4 +62,9 @@ * 获取用户的祖籍列表 */ List<AppUser> getUserAncestorList(Long id,List<AppUser> list); /** * 获取指定用户的直帮上级用户(消费用户绑定的上级,最近一个用户会员类型为【创业者】的用户) */ AppUser getSuperiorLeader(Long id); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -360,4 +360,19 @@ 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 { getSuperiorLeader(inviteUserId); } return null; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/CommissionService.java
@@ -2,11 +2,12 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Set; public interface CommissionService { // 计算佣金 void calculationCommission(List<Long> orderIds); void calculationCommission(Set<String> orderIds); void addToCommissionDelayQueue(Long orderId, LocalDateTime afterSalesDeadline); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/CommissionServiceImpl.java
@@ -20,6 +20,7 @@ import java.time.ZoneId; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @Service @@ -49,7 +50,7 @@ } @Override public void calculationCommission(List<Long> orderIds) { public void calculationCommission(Set<String> orderIds) { List<OrderGood> orderGoods = orderGoodService.list(new LambdaQueryWrapper<OrderGood>() .in(OrderGood::getOrderId, orderIds)); @@ -77,32 +78,51 @@ throw new RuntimeException("获取用户信息失败"); } Long inviteUserId = appUser.getInviteUserId(); // 直推上级用户 AppUser inviteUser = appUserClient.getAppUserById(inviteUserId); // 获取直帮上级用户 R<AppUser> superiorLeaderR = appUserClient.getSuperiorLeader(appUserId); if (!R.isSuccess(superiorLeaderR)) { throw new RuntimeException("获取直帮上级信息失败"); } AppUser superiorLeader = superiorLeaderR.getData(); for (OrderGood og : v) {// 累计分销金额 // 上级分销金额 if (inviteUser != null){ // 直推上级分佣金额 Integer superiorType = og.getSuperiorType(); if (superiorType == 1 && inviteUser != null){ // 分佣金额 BigDecimal superiorSubcommission = og.getSuperiorSubcommission(); BigDecimal totalDistributionAmount = inviteUser.getTotalDistributionAmount(); totalDistributionAmount = totalDistributionAmount.add(superiorSubcommission); // Integer superiorType = og.getSuperiorType(); inviteUser.setTotalDistributionAmount(totalDistributionAmount); // 分佣积分 Integer sharePoint = inviteUser.getSharePoint(); if (superiorType == 1) { Integer superiorRebatePoints = og.getSuperiorRebatePoints(); sharePoint = sharePoint + superiorRebatePoints; inviteUser.setSharePoint(sharePoint); appUserClient.editAppUserById(inviteUser); }else // 直帮上级分佣金额 if (superiorType == 2 && superiorLeader != null){ // 分佣金额 BigDecimal superiorSubcommission = og.getSuperiorSubcommission(); BigDecimal totalDistributionAmount = superiorLeader.getTotalDistributionAmount(); totalDistributionAmount = totalDistributionAmount.add(superiorSubcommission); superiorLeader.setTotalDistributionAmount(totalDistributionAmount); // 分佣积分 Integer sharePoint = superiorLeader.getSharePoint(); Integer superiorRebatePoints = og.getSuperiorRebatePoints(); sharePoint = sharePoint + superiorRebatePoints; } else if (superiorType == 2) { superiorLeader.setSharePoint(sharePoint); } else { continue; appUserClient.editAppUserById(superiorLeader); } inviteUser.setTotalDistributionAmount(totalDistributionAmount); inviteUser.setSharePoint(sharePoint); } // 门店分销金额 og.getBoundShopCharges(); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -101,6 +101,8 @@ Goods goods = this.getById(goodsId); GoodsVO goodsVO = new GoodsVO(); BeanUtils.copyBeanProp(goodsVO, goods); goodsVO.setGoodsId(goods.getId()); goodsVO.setGoodsName(goods.getName()); goodsVO.setSellingPrice(sellingPrice); goodsVO.setIntegral(integral); return goodsVO;