记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
董敬伟
liquidnet-bus-v1
Commits
8fc91746
Commit
8fc91746
authored
Jun 17, 2026
by
wangyifan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加partner 退款分布式锁
parent
8d6488fa
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
34 additions
and
17 deletions
+34
-17
GoblinRedisConst.java
...m/liquidnet/service/goblin/constant/GoblinRedisConst.java
+6
-0
GoblinStoreBackOrderServiceImpl.java
.../service/impl/manage/GoblinStoreBackOrderServiceImpl.java
+28
-17
No files found.
liquidnet-bus-api/liquidnet-service-goblin-api/src/main/java/com/liquidnet/service/goblin/constant/GoblinRedisConst.java
View file @
8fc91746
...
...
@@ -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:"
);
/**
* 收钱吧 用户订单列表
*/
...
...
liquidnet-bus-service/liquidnet-service-goblin/liquidnet-service-goblin-impl/src/main/java/com/liquidnet/service/goblin/service/impl/manage/GoblinStoreBackOrderServiceImpl.java
View file @
8fc91746
...
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment