diff --git a/play-admin/src/main/java/com/starry/admin/common/task/OverdueOrderHandlerTask.java b/play-admin/src/main/java/com/starry/admin/common/task/OverdueOrderHandlerTask.java new file mode 100644 index 0000000..de9b834 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/task/OverdueOrderHandlerTask.java @@ -0,0 +1,80 @@ +package com.starry.admin.common.task; + +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; +import com.starry.admin.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Set; + +/** + * 超时未接单的订单退款处理任务 + * + * @author admin + * @since 2024/8/15 13:24 + **/ +@Slf4j +@Component +public class OverdueOrderHandlerTask { + + private static final String QUEUE_KEY = "random_order_queue"; + + private static final int MAX_TIME = 24 * 60 * 40; + + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private IPlayOrderInfoService playOrderInfoService; + + public void enqueue(String message) { + enqueue(message, MAX_TIME); + } + + public void enqueue(String message, long delaySeconds) { + long score = System.currentTimeMillis() / 1000 + delaySeconds; + stringRedisTemplate.opsForZSet().add(QUEUE_KEY, message, score); + } + + /** + * 每秒钟检测,判断任务是否到期 + * + * @author admin + * @since 2024/8/15 13:47 + **/ + @Scheduled(fixedRate = 1000) + public void processMessages() { + long now = System.currentTimeMillis() / 1000; + Set messages = stringRedisTemplate.opsForZSet().rangeByScore(QUEUE_KEY, 0, now); + if (messages == null) { + return; + } + for (String message : messages) { + log.info("处理消息{}", message); + // 处理消息 + // 订单退款 + String[] strs = message.split("_"); + orderHandler(strs[0], strs[1]); + // 移除已经处理的消息 + stringRedisTemplate.opsForZSet().remove(QUEUE_KEY, message); + } + } + + public void orderHandler(String orderId, String tenantId) { + SecurityUtils.setTenantId(tenantId); + PlayOrderInfoEntity orderInfo = playOrderInfoService.getById(orderId); + if (orderInfo == null) { + return; + } + // 如果订单未接单,进行退款处理 + if ("0".equals(orderInfo.getOrderStatus())) { + playOrderInfoService.updateStateTo4("2", "admin", orderInfo.getId(), "订单长时间未接单", new ArrayList<>()); + } + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java index 2bd13ee..b00de45 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java @@ -51,7 +51,7 @@ public interface IPlayBalanceDetailsInfoService extends IService 0 ? "`" : "0"); + entity.setAccountState(balanceAfterOperation.compareTo(new BigDecimal(0)) > 0 ? "1" : "0"); this.baseMapper.updateById(entity); //记录余额变更记录 playBalanceDetailsInfoService.insertBalanceDetailsInfo("1", userId, balanceBeforeOperation, balanceAfterOperation, operationType, operationAction, balanceMoney, giftAmount, orderId); diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java index 3e1dd87..77c3ec8 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java @@ -75,6 +75,9 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl getTotalOrderInfo(String tenantId) { @@ -722,31 +725,34 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl images) { - PlayOrderInfoEntity entity = this.selectOrderInfoById(orderId); + PlayOrderInfoEntity orderInfo = this.selectOrderInfoById(orderId); if ("0".equals(operatorByType)) { - if (!entity.getPurchaserBy().equals(operatorBy)) { + if (!orderInfo.getPurchaserBy().equals(operatorBy)) { throw new CustomException("只能操作本人订单"); } } if ("1".equals(operatorByType)) { - if (!entity.getAcceptBy().equals(operatorBy)) { + if (!orderInfo.getAcceptBy().equals(operatorBy)) { throw new CustomException("只能操作本人订单"); } } // 取消订单(必须订单未接单或者为开始状态) - if (!entity.getOrderStatus().equals(OrderConstant.ORDER_STATUS_0) && !entity.getOrderStatus().equals(OrderConstant.ORDER_STATUS_1)) { + if (!orderInfo.getOrderStatus().equals(OrderConstant.ORDER_STATUS_0) && !orderInfo.getOrderStatus().equals(OrderConstant.ORDER_STATUS_1)) { throw new CustomException("订单状态异常,无法取消"); } // 修改订单状态 this.baseMapper.updateById(new PlayOrderInfoEntity(orderId, OrderConstant.ORDER_STATUS_4)); + // 用户增加余额 + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.getById(orderInfo.getPurchaserBy()); + customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().add(orderInfo.getOrderMoney()), "3", "订单退款", orderInfo.getOrderMoney(), BigDecimal.ZERO, orderId); // 取消订单后,记录退款信息 PlayOrderRefundInfoEntity orderRefundInfo = new PlayOrderRefundInfoEntity(); orderRefundInfo.setOrderId(orderId); - orderRefundInfo.setCustomId(entity.getPurchaserBy()); - orderRefundInfo.setClerkId(entity.getAcceptBy()); - orderRefundInfo.setPayMethod(entity.getPayMethod()); + orderRefundInfo.setCustomId(orderInfo.getPurchaserBy()); + orderRefundInfo.setClerkId(orderInfo.getAcceptBy()); + orderRefundInfo.setPayMethod(orderInfo.getPayMethod()); orderRefundInfo.setRefundType("0"); - orderRefundInfo.setRefundAmount(entity.getFinalAmount()); + orderRefundInfo.setRefundAmount(orderInfo.getFinalAmount()); orderRefundInfo.setRefundReason(refundReason); orderRefundInfo.setRefundByType(operatorByType); orderRefundInfo.setRefundById(operatorBy); diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java index cd9ac12..7279e98 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java @@ -9,6 +9,7 @@ import com.starry.admin.common.aspect.CustomUserLogin; import com.starry.admin.common.conf.ThreadLocalRequestDetail; import com.starry.admin.common.exception.CustomException; import com.starry.admin.common.exception.ServiceException; +import com.starry.admin.common.task.OverdueOrderHandlerTask; import com.starry.admin.modules.clerk.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clerk.service.IPlayClerkCommodityService; import com.starry.admin.modules.clerk.service.IPlayClerkUserInfoService; @@ -48,6 +49,7 @@ import com.starry.admin.modules.weichat.entity.user.PlayCustomUserReturnDetailVo import com.starry.admin.modules.weichat.service.WxCustomMpService; import com.starry.admin.modules.weichat.service.WxCustomUserService; import com.starry.admin.utils.MoneyUtils; +import com.starry.admin.utils.SecurityUtils; import com.starry.common.result.R; import com.starry.common.utils.ConvertUtil; import com.starry.common.utils.IdUtils; @@ -118,6 +120,9 @@ public class WxCustomController { @Resource private WxCustomMpService wxCustomMpService; + @Resource + OverdueOrderHandlerTask overdueOrderHandlerTask; + /** * 根据店员ID查询店员详细信息 @@ -347,6 +352,8 @@ public class WxCustomController { // playOrderInfoService.createRandomOrder(orderId, customUserInfo.getId(), commodityInfo.getCommodityPrice(), String.valueOf(vo.getCommodityQuantity()), commodityInfo.getServiceDuration(), commodityInfo.getCommodityName(), money, money, customId, vo.getRemark(), vo.getWeiChatCode()); // 顾客减少余额 customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "1", "下单-随机单", money, BigDecimal.ZERO, orderId); + // 记录订单,指定指定未接单后,进行退款处理 + overdueOrderHandlerTask.enqueue(orderId + "_" + SecurityUtils.getTenantId()); // 下单成功后,先根据用户条件进行随机分配 return R.ok("下单成功"); }