ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/RemoteOrderGoodsFallbackFactory.java
@@ -8,6 +8,7 @@ import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; import java.util.Set; @Slf4j public class RemoteOrderGoodsFallbackFactory implements FallbackFactory<RemoteOrderGoodsClient> { @@ -40,6 +41,11 @@ public R<Void> subscribe(Long id, Integer technicianId) { return R.fail("预约失败"); } @Override public R<Void> calculationCommission(Set<String> orderIds) { return R.fail("计算佣金失败"); } }; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/RemoteOrderGoodsClient.java
@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; import java.util.Set; @FeignClient(contextId = "RemoteOrderGoodsClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderGoodsFallbackFactory.class) public interface RemoteOrderGoodsClient { @@ -46,4 +47,10 @@ */ @PostMapping("/order/subscribe") public R<Void> subscribe(@RequestParam(value = "id" , required = false) Long id ,@RequestParam(value = "technicianId", required = false) Integer technicianId); /** * 预约技师 */ @PostMapping("/commission/calculationCommission") public R<Void> calculationCommission(@RequestBody Set<String> orderIds); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/PointSetting.java
@@ -7,7 +7,6 @@ import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -41,23 +40,23 @@ @ApiModelProperty(value = "拉新人积分") @TableField("new_point") private BigDecimal newPoint; private Integer newPoint; @ApiModelProperty(value = "每日分享积分") @TableField("every_share_point") private BigDecimal everySharePoint; private Integer everySharePoint; @ApiModelProperty(value = "每日签到积分") @TableField("sign_point") private BigDecimal signPoint; private Integer signPoint; @ApiModelProperty(value = "使用一小时积分") @TableField("hour_point") private BigDecimal hourPoint; private Integer hourPoint; @ApiModelProperty(value = "注册积分") @TableField("regis_point") private BigDecimal regisPoint; private Integer regisPoint; @ApiModelProperty(value = "注册积分 1开0关") @TableField("regis_point_open") @@ -69,7 +68,7 @@ @ApiModelProperty(value = "消费积分") @TableField("buy_point") private BigDecimal buyPoint; private Integer buyPoint; @ApiModelProperty(value = "消费积分积分 1开0关") @TableField("buy_point_open") @@ -81,7 +80,7 @@ @ApiModelProperty(value = "返佣积分") @TableField("share_point") private BigDecimal sharePoint; private Integer sharePoint; @ApiModelProperty(value = "返佣积分 1开0关") @TableField("share_point_open") @@ -93,7 +92,7 @@ @ApiModelProperty(value = "门店返佣积分") @TableField("shop_share_point") private BigDecimal shopSharePoint; private Integer shopSharePoint; @ApiModelProperty(value = "门店返佣积分 1开0关") @TableField("shop_share_point_open") @@ -117,7 +116,7 @@ @ApiModelProperty(value = "技师业绩积分") @TableField("person_point") private BigDecimal personPoint; private Integer personPoint; @ApiModelProperty(value = "技师业绩积分 1开0关") @TableField("person_point_open") @@ -141,7 +140,7 @@ @ApiModelProperty(value = "注册积分") @TableField("get_regis_point") private BigDecimal getRegisPoint; private Integer getRegisPoint; @ApiModelProperty(value = "注册积分 1开0关") @TableField("get_regis_point_open") @@ -153,7 +152,7 @@ @ApiModelProperty(value = "做工积分") @TableField("work_point") private BigDecimal workPoint; private Integer workPoint; @ApiModelProperty(value = "做工积分 1开0关") @TableField("work_point_open") ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TechnicianSubscribe.java
@@ -68,13 +68,10 @@ @TableField("create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "订单id") private Long orderId; @TableField(exist = false) private String idStr; @TableField(exist = false) private Long orderId; public void setId(Long id) { ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/TechnicianClientFallbackFactory.java
@@ -19,11 +19,6 @@ public R<Void> updateStatus(Integer status, Long subscribeId) { return R.fail("跟新技师预约状态失败:" + cause.getMessage()); } @Override public R<TechnicianSubscribe> getSubscribeByOrderId(Long orderId) { return R.fail("根据订单id获取预约信息失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/TechnicianClient.java
@@ -18,7 +18,4 @@ @PutMapping("/technician-subscribe/updateStatus") R<Void> updateStatus(@RequestParam("status") Integer status, @RequestParam("subscribeId") Long subscribeId); @GetMapping("/technician-subscribe/getSubscribeByOrderId") R<TechnicianSubscribe> getSubscribeByOrderId(@RequestParam("orderId") Long orderId); } ruoyi-modules/ruoyi-job/pom.xml
@@ -19,10 +19,16 @@ <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-modules-order</artifactId> <version>3.6.2</version> <artifactId>ruoyi-api-account</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-other</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-order</artifactId> </dependency> <!-- SpringCloud Alibaba Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/AfterSalesTask.java
@@ -1,5 +1,7 @@ package com.ruoyi.job.task; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.feignClient.RemoteOrderGoodsClient; import com.ruoyi.order.service.CommissionService; import lombok.extern.log4j.Log4j2; import org.springframework.data.redis.core.RedisTemplate; @@ -8,13 +10,13 @@ import javax.annotation.Resource; import java.util.Set; @Component("ryTask") @Component("afterSalesTask") @Log4j2 public class AfterSalesTask { @Resource private RedisTemplate<String, String> redisTemplate; @Resource private CommissionService commissionService; private RemoteOrderGoodsClient remoteOrderGoodsClient; /** * 计算佣金(设置每分钟执行一次) @@ -25,7 +27,10 @@ // 从延迟队列中获取需要处理的订单 Set<String> orderIds = redisTemplate.opsForZSet().rangeByScore("delay_queue:commission", 0, now); if (orderIds != null && !orderIds.isEmpty()) { commissionService.calculationCommission(orderIds); R<Void> r = remoteOrderGoodsClient.calculationCommission(orderIds); if (R.isError(r)) { log.error("计算佣金失败,订单号:{},错误信息:{}", orderIds, r.getMsg()); } // 处理完后移除已处理的订单 redisTemplate.opsForZSet().removeRangeByScore("delay_queue:commission", 0, now); } ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/TechnicianSubscribe.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.job.task; import com.ruoyi.other.api.feignClient.TechnicianClient; import lombok.extern.log4j.Log4j2; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Set; @Component("technicianSubscribe") @Log4j2 public class TechnicianSubscribe { @Resource private TechnicianClient technicianClient; @Resource private RedisTemplate<String, String> redisTemplate; public void updateStatus() { long now = System.currentTimeMillis() / 1000; // 获取当前时间戳(秒) Set<String> subscribeIds = redisTemplate.opsForZSet().rangeByScore("delay_queue:subscribe", 0, now); if (subscribeIds != null) { subscribeIds.forEach(subscribeId -> { technicianClient.updateStatus(2, Long.valueOf(subscribeId)); }); } } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AgentApplicationServiceImpl.java
@@ -45,6 +45,7 @@ AppUser appUser = appUserService.getById(loginUserApplet.getUserid()); agentApplication.setAppUserId(loginUserApplet.getUserid()); agentApplication.setStatus(1); agentApplication.setApplicationTime(LocalDateTime.now()); agentApplication.setShopPoint(appUser.getShopPoint()); agentApplication.setSharePoint(appUser.getSharePoint()); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -4,9 +4,9 @@ import com.alibaba.fastjson.JSONObject; 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.AppUserShop; import com.ruoyi.account.mapper.AppUserMapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.AppUserShopService; import com.ruoyi.account.util.weChat.WXCore; @@ -16,7 +16,9 @@ import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.other.api.domain.PointSetting; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.feignClient.PointSettingClient; import com.ruoyi.other.api.feignClient.ShopClient; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; @@ -56,6 +58,9 @@ @Resource private SysUserClient sysUserClient; @Resource private PointSettingClient pointSettingClient; @@ -258,7 +263,16 @@ appUser.setTotalRedPacketAmount(BigDecimal.ZERO); appUser.setTotalDistributionAmount(BigDecimal.ZERO); appUser.setBalance(BigDecimal.ZERO); appUser.setLavePoint(0); R<PointSetting> pointSettingR = pointSettingClient.getPointSetting(1); if (R.isError(pointSettingR)){ throw new RuntimeException("获取积分设置失败"); } PointSetting pointSetting = pointSettingR.getData(); if (pointSetting == null){ throw new RuntimeException("积分设置不存在"); } appUser.setLavePoint(pointSetting.getGetRegisPoint()); //根据平台的配置未达标,则标注为可修改推广人 appUser.setChangePromoter(0); appUser.setLongitude(registerAccount.getLongitude()); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/CommissionController.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.order.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.service.CommissionService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.Set; @RestController @RequestMapping("commission") public class CommissionController { @Resource private CommissionService commissionService; @PostMapping("/calculationCommission") public R<Void> calculationCommission(@RequestBody Set<String> orderIds){ commissionService.calculationCommission(orderIds); return R.ok(); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/CommissionServiceImpl.java
@@ -13,6 +13,7 @@ import com.ruoyi.order.model.OrderGood; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -50,6 +51,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public void calculationCommission(Set<String> orderIds) { List<OrderGood> orderGoods = orderGoodService.list(new LambdaQueryWrapper<OrderGood>() .in(OrderGood::getOrderId, orderIds)); @@ -63,6 +65,8 @@ if (order.getIsCommission() == 1) { continue; } order.setIsCommission(1); orderService.updateById(order); R<Shop> r = shopClient.getShopById(order.getShopId()); if (!R.isSuccess(r)) { throw new RuntimeException("获取门店信息失败"); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -142,12 +142,6 @@ } technician = shopdetail.getData(); } R<TechnicianSubscribe> subscribeR = technicianClient.getSubscribeByOrderId(orderId); if (!R.isSuccess(subscribeR)){ throw new ServiceException("获取预约信息失败"); } TechnicianSubscribe subscribe = subscribeR.getData(); Shop shop = shopR.getData(); orderDetailVO.setId(order.getId()); orderDetailVO.setOrderStatus(order.getOrderStatus()); @@ -172,7 +166,6 @@ orderDetailVO.setLatitude(shop.getLatitude()); orderDetailVO.setShopId(shop.getId()); orderDetailVO.setTechnicianName(technician.getName()); orderDetailVO.setTechnicianSubscribeId(String.valueOf(subscribe.getId())); return orderDetailVO; } @@ -216,18 +209,6 @@ order.setOrderStatus(OrderStatus.COMPLETED.getCode()); orderMapper.updateById(order); Integer orderType = order.getOrderType(); if (orderType.equals(OrderType.SERVICE.getCode())){ R<TechnicianSubscribe> subscribeR = technicianClient.getSubscribeByOrderId(order.getId()); if (R.isError(subscribeR)){ throw new ServiceException("获取预约信息失败"); } TechnicianSubscribe subscribe = subscribeR.getData(); subscribe.setStatus(2); R<Void> r = technicianClient.updateStatus(subscribe.getStatus(), subscribe.getId()); if (R.isError(r)){ throw new ServiceException("更新预约状态失败"); } } // 售后设置 R<BaseSetting> baseSettingR = baseSettingClient.getBaseSetting(5); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java
@@ -104,13 +104,5 @@ return R.ok(technicianSubscribeService.getTechnicianSubscribeByUser(page, SecurityUtils.getUserId(), status)); } @GetMapping("/getSubscribeByOrderId") @ApiOperation(value = "根据订单id获取预约信息", notes = "根据订单id获取预约信息", tags = {"后台-技师预约管理-根据订单id获取预约信息"}) public R<TechnicianSubscribe> getSubscribeByOrderId(@ApiParam(value = "订单id") @RequestParam Long orderId) { return R.ok(technicianSubscribeService.getOne(new LambdaQueryWrapper<TechnicianSubscribe>() .eq(TechnicianSubscribe::getOrderId, orderId))); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
@@ -11,10 +11,12 @@ import com.ruoyi.other.mapper.TechnicianSubscribeMapper; import com.ruoyi.other.service.TechnicianSubscribeService; import com.ruoyi.other.vo.TechnicianSubscribeVO; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; /** @@ -31,6 +33,8 @@ private TechnicianSubscribeMapper technicianSubscribeMapper; @Resource private RemoteOrderGoodsClient orderGoodsClient; @Resource private RedisTemplate<String, String> redisTemplate; @Override public List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long shopId, Integer status) { @@ -43,20 +47,17 @@ @Override public void subscribe(TechnicianSubscribe subscribe) { if (StringUtils.isNotEmpty(subscribe.getIdStr())){ subscribe.setId(Long.parseLong(subscribe.getIdStr())); technicianSubscribeMapper.updateById(subscribe); }else { Long userId = SecurityUtils.getUserId(); subscribe.setAppUserId(userId); subscribe.setStatus(TechnicianStatus.UNSUBSCRIBE.getCode()); subscribe.setDelFlag(0); subscribe.setCreateTime(LocalDateTime.now()); technicianSubscribeMapper.insert(subscribe); } if (subscribe.getTechnicianId() != null){ Long userId = SecurityUtils.getUserId(); subscribe.setAppUserId(userId); subscribe.setStatus(TechnicianStatus.UNSUBSCRIBE.getCode()); subscribe.setDelFlag(0); subscribe.setCreateTime(LocalDateTime.now()); technicianSubscribeMapper.insert(subscribe); if (subscribe.getOrderId() != null){ orderGoodsClient.subscribe(subscribe.getOrderId(), subscribe.getTechnicianId()); } LocalDateTime subscribeTime = subscribe.getSubscribeTime(); long deadlineTimestamp = subscribeTime.atZone(ZoneId.systemDefault()).toEpochSecond(); redisTemplate.opsForZSet().add("delay_queue:subscribe", subscribe.getId().toString(), deadlineTimestamp); } }