随机单下单后,24小时未接单,自动将订单进行退款

This commit is contained in:
starrySky
2024-08-15 14:42:56 +08:00
parent af7f7c0fe5
commit 80c6a151da
6 changed files with 104 additions and 11 deletions

View File

@@ -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<String> 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<>());
}
}
}

View File

@@ -51,7 +51,7 @@ public interface IPlayBalanceDetailsInfoService extends IService<PlayBalanceDeta
* @param userId 用户ID
* @param balanceBeforeOperation 操作前余额
* @param balanceAfterOperation 操作后余额
* @param operationType 操作类型0:充值;1:消费)
* @param operationType 操作类型0:充值;1:消费,2:服务;3:退款
* @param operationAction 操作动作
* @param balanceMoney 操作金额
* @param giftAmount 赠送金额

View File

@@ -108,7 +108,7 @@ public interface IPlayCustomUserInfoService extends IService<PlayCustomUserInfoE
* @param userId 用户ID
* @param balanceBeforeOperation 操作前余额
* @param balanceAfterOperation 操作后余额
* @param operationType 操作类型0:充值;1:消费;2:服务)
* @param operationType 操作类型0:充值;1:消费;2:服务;3:退款
* @param operationAction 操作动作
* @param balanceMoney 操作金额
* @param giftAmount 赠送金额

View File

@@ -275,7 +275,7 @@ public class PlayCustomUserInfoServiceImpl extends ServiceImpl<PlayCustomUserInf
PlayCustomUserInfoEntity entity = new PlayCustomUserInfoEntity();
entity.setId(userId);
entity.setAccountBalance(balanceAfterOperation);
entity.setAccountState(balanceAfterOperation.compareTo(new BigDecimal(0)) > 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);

View File

@@ -75,6 +75,9 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
@Resource
private WxCustomMpService wxCustomMpService;
@Resource
private IPlayCustomUserInfoService customUserInfoService;
@Override
public List<PlayOrderInfoEntity> getTotalOrderInfo(String tenantId) {
@@ -722,31 +725,34 @@ public class PlayOrderInfoServiceImpl extends ServiceImpl<PlayOrderInfoMapper, P
@Override
@Transactional(rollbackFor = Exception.class)
public void updateStateTo4(String operatorByType, String operatorBy, String orderId, String refundReason, List<String> 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);

View File

@@ -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("下单成功");
}