记得上下班打卡 | git大法好,push需谨慎

Commit 8fc91746 authored by wangyifan's avatar wangyifan

增加partner 退款分布式锁

parent 8d6488fa
......@@ -455,6 +455,12 @@ public class GoblinRedisConst {
*/
public static final String SQB_GOBLIN_ORDER_SN_KEY = PREFIX.concat("sqb:orderSn:");
/**
* 订单退款分布式锁
* {goblin:refund:lock:${orderId}, 1}
*/
public static final String REFUND_ORDER_LOCK = PREFIX.concat("refund:lock:");
/**
* 收钱吧 用户订单列表
*/
......
......@@ -8,6 +8,7 @@ import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.candy.constant.CandyRedisConst;
import com.liquidnet.service.candy.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.dragon.constant.DragonConstant;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinBackOrder;
......@@ -291,27 +292,37 @@ public class GoblinStoreBackOrderServiceImpl implements IGoblinStoreBackOrderSer
if (!orderVo.getMixId().isEmpty()) {
return ResponseDto.failure("组合购商品暂不支持退款");
}
if (hasProcessingBackOrder(orderVo.getOrderId())) {
return ResponseDto.failure("已有退款处理中");
}
// 管理端发起退款:根据子单状态决定「发货前整单自动退」还是「发货后部分退待审核」
List<GoblinOrderSkuVo> orderSkuVos = getOrderSkuVos(orderVo);
// 发货前:所有子单均为 status=2(待发货)→ 强制整单退、含运费、自动调支付
boolean beforeShip = orderSkuVos.stream().allMatch(GoblinRefundHelper::isUnshippedSku);
// 是否允许发起:全部待发货,或至少有一个子单已发货/已完成(status=3/4)
// 注意:若存在已退完子单(status=6)与待发货子单混合(如旧接口部分退后),此处会判为不可退,需单独兼容
boolean canRefund = beforeShip || orderSkuVos.stream().anyMatch(GoblinRefundHelper::isShippedSku);
if (!canRefund) {
return ResponseDto.failure("不可退款");
// 分布式锁防并发重复退款
String lockKey = GoblinRedisConst.REFUND_ORDER_LOCK + param.getOrderId();
if (!redisUtils.redisUtil.lock(lockKey, 1, 30)) {
return ResponseDto.failure("退款处理中,请勿重复操作");
}
try {
if (hasProcessingBackOrder(orderVo.getOrderId())) {
return ResponseDto.failure("已有退款处理中");
}
// 发货前忽略 orderSkuIds,整单退;发货后按入参选择子单(不传则默认整单剩余可退商品)
List<GoblinOrderSkuVo> refundSkuVos = beforeShip ? orderSkuVos : getSelectedOrderSkuVos(orderVo, orderSkuVos, param.getOrderSkuIds());
if (refundSkuVos.isEmpty()) {
return ResponseDto.failure("请选择退款商品");
// 管理端发起退款:根据子单状态决定「发货前整单自动退」还是「发货后部分退待审核」
List<GoblinOrderSkuVo> orderSkuVos = getOrderSkuVos(orderVo);
// 发货前:所有子单均为 status=2(待发货)→ 强制整单退、含运费、自动调支付
boolean beforeShip = orderSkuVos.stream().allMatch(GoblinRefundHelper::isUnshippedSku);
// 是否允许发起:全部待发货,或至少有一个子单已发货/已完成(status=3/4)
// 注意:若存在已退完子单(status=6)与待发货子单混合(如旧接口部分退后),此处会判为不可退,需单独兼容
boolean canRefund = beforeShip || orderSkuVos.stream().anyMatch(GoblinRefundHelper::isShippedSku);
if (!canRefund) {
return ResponseDto.failure("不可退款");
}
// 发货前忽略 orderSkuIds,整单退;发货后按入参选择子单(不传则默认整单剩余可退商品)
List<GoblinOrderSkuVo> refundSkuVos = beforeShip ? orderSkuVos : getSelectedOrderSkuVos(orderVo, orderSkuVos, param.getOrderSkuIds());
if (refundSkuVos.isEmpty()) {
return ResponseDto.failure("请选择退款商品");
}
return createStoreRefundOrder(orderVo, refundSkuVos, beforeShip, param, uid, now, nowStr);
} finally {
redisUtils.redisUtil.uLock(lockKey);
}
return createStoreRefundOrder(orderVo, refundSkuVos, beforeShip, param, uid, now, nowStr);
}
@Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment