记得上下班打卡 | 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
8145d802
Commit
8145d802
authored
Apr 25, 2025
by
wangyifan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
福袋功能-优化结构
parent
cba45393
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
44 deletions
+62
-44
KylinLuckyBagServiceImpl.java
.../service/kylin/service/impl/KylinLuckyBagServiceImpl.java
+62
-44
No files found.
liquidnet-bus-service/liquidnet-service-kylin/liquidnet-service-kylin-impl/src/main/java/com/liquidnet/service/kylin/service/impl/KylinLuckyBagServiceImpl.java
View file @
8145d802
...
...
@@ -9,6 +9,8 @@ import com.liquidnet.commons.lang.util.DateUtil;
import
com.liquidnet.service.base.ErrorMapping
;
import
com.liquidnet.service.kylin.constant.KylinRedisConst
;
import
com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo
;
import
com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo
;
import
com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo
;
import
com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo
;
import
com.liquidnet.service.kylin.entity.KylinLuckyBag
;
import
com.liquidnet.service.kylin.entity.KylinLuckyBagActivity
;
...
...
@@ -150,8 +152,17 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
* @param vo
* @return
*/
private
List
<
KylinRewardUser
>
getRandomRewardCode
(
OrderDetailsVo
vo
,
String
luckyBagId
)
{
String
lockKey
=
KylinRedisConst
.
LUCKY_BAG_CODE_LOCK
+
luckyBagId
;
public
List
<
KylinRewardUser
>
getRandomRewardCode
(
OrderDetailsVo
vo
,
String
luckyBagId
)
{
final
int
limitTotal
=
vo
.
getOrderTicketVo
().
getNumber
();
final
KylinOrderTicketVo
orderTicketVo
=
vo
.
getOrderTicketVo
();
final
String
orderId
=
orderTicketVo
.
getOrderTicketsId
();
if
(
limitTotal
<=
0
)
{
log
.
error
(
"[getRandomRewardCode] 用户订单购买数量错误, orderId: {}."
,
orderId
);
return
Collections
.
emptyList
();
}
final
String
lockKey
=
KylinRedisConst
.
LUCKY_BAG_CODE_LOCK
+
luckyBagId
;
try
{
// 1. 获取分布式锁,防止并发问题
boolean
locked
=
redisUtil
.
lock
(
lockKey
,
1
,
30
);
...
...
@@ -160,21 +171,9 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
return
Collections
.
emptyList
();
}
final
int
limitTotal
=
vo
.
getOrderTicketVo
().
getNumber
();
if
(
limitTotal
<=
0
)
{
log
.
error
(
"[getRandomRewardCode] 用户订单购买数量错误, orderId: {}."
,
vo
.
getOrderTicketVo
().
getOrderTicketsId
());
return
Collections
.
emptyList
();
}
LambdaQueryWrapper
<
KylinRewardCode
>
lambdaQueryWrapper
=
new
QueryWrapper
<
KylinRewardCode
>().
lambda
()
.
eq
(
KylinRewardCode:
:
getLuckyBagId
,
luckyBagId
)
.
eq
(
KylinRewardCode:
:
getState
,
1
)
.
last
(
true
,
"ORDER BY RAND() limit "
+
limitTotal
);
//2. 搜索兑换码
List
<
KylinRewardCode
>
rewardCodes
=
kylinRewardCodeMapper
.
selectList
(
lambdaQueryWrapper
);
if
(
rewardCodes
.
isEmpty
()
||
rewardCodes
.
size
()
<
limitTotal
)
{
List
<
KylinRewardCode
>
rewardCodes
=
getAvailableRewardCodes
(
luckyBagId
,
limitTotal
);
if
(
rewardCodes
.
size
()
<
limitTotal
)
{
log
.
error
(
"[getRandomRewardCode] 兑换码不足, luckyBagId: {}, need total: {}."
,
luckyBagId
,
limitTotal
);
// 报警
String
msg
=
String
.
format
(
"福袋ID [%s] 兑换码不足,请及时补充."
,
luckyBagId
);
...
...
@@ -182,42 +181,61 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
return
Collections
.
emptyList
();
}
//3. 写入
List
<
KylinRewardUser
>
rewardUsers
=
new
ArrayList
<>(
limitTotal
);
return
assignRewardCodesToUser
(
orderTicketVo
.
getUserId
(),
orderId
,
luckyBagId
,
rewardCodes
,
orderTicketVo
.
getEntitiesVoList
());
}
catch
(
Exception
e
)
{
log
.
error
(
"error"
,
e
);
// 报警
iFeishuBotService
.
sendTextMessage
(
"error: "
+
e
.
getMessage
());
return
Collections
.
emptyList
();
}
finally
{
redisUtil
.
uLock
(
lockKey
);
}
}
public
List
<
KylinRewardUser
>
assignRewardCodesToUser
(
String
uid
,
String
orderId
,
String
luckyBagId
,
List
<
KylinRewardCode
>
rewardCodes
,
List
<
KylinOrderTicketEntitiesVo
>
entities
)
{
List
<
KylinRewardUser
>
rewardUsers
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
rewardCodes
.
size
();
i
++)
{
KylinRewardCode
rewardCode
=
rewardCodes
.
get
(
i
);
rewardCode
.
setState
(
0
);
int
updateResult
=
kylinRewardCodeMapper
.
updateById
(
rewardCode
);
if
(
updateResult
>
0
)
{
KylinRewardUser
user
=
new
KylinRewardUser
();
user
.
setUid
(
vo
.
getOrderTicketVo
().
getUserId
());
user
.
setLuckyBagId
(
luckyBagId
);
user
.
setOrderId
(
vo
.
getOrderTicketVo
().
getOrderTicketsId
());
user
.
setOrderTicketEntitiesId
(
vo
.
getOrderTicketVo
().
getEntitiesVoList
().
get
(
i
).
getOrderTicketEntitiesId
());
user
.
setCode
(
rewardCode
.
getCode
());
user
.
setState
(
1
);
user
.
setCreatedAt
(
LocalDateTime
.
now
());
user
.
setUpdatedAt
(
LocalDateTime
.
now
());
if
(
kylinRewardCodeMapper
.
updateById
(
rewardCode
)
>
0
)
{
KylinRewardUser
user
=
buildRewardUser
(
uid
,
orderId
,
luckyBagId
,
entities
.
get
(
i
).
getOrderTicketEntitiesId
(),
rewardCode
.
getCode
());
kylinRewardUserMapper
.
insert
(
user
);
rewardUsers
.
add
(
user
);
log
.
info
(
"[getRandomRewardCode] 兑换码分配成功, luckyBagId: {}, orderId: {}, code: {}."
,
luckyBagId
,
vo
.
getOrderTicketVo
().
getOrderTicketsId
()
,
rewardCode
.
getCode
());
log
.
info
(
"[assignRewardCodesToUser] 分配成功, luckyBagId: {}, orderId: {}, code: {}"
,
luckyBagId
,
orderId
,
rewardCode
.
getCode
());
}
else
{
log
.
error
(
"[getRandomRewardCode] 兑换码分配失败, luckyBagId: {}, orderId: {}."
,
luckyBagId
,
vo
.
getOrderTicketVo
().
getOrderTicketsId
());
// 报警
String
msg
=
String
.
format
(
"福袋ID [%s] 分配兑换码失败:用户ID [%s] 的订单ID [%s] 已分配了 [%s] 个,应分配 [%s] 个。"
,
luckyBagId
,
vo
.
getOrderTicketVo
().
getUserId
(),
vo
.
getOrderTicketVo
().
getOrderTicketsId
(),
rewardUsers
.
size
(),
limitTotal
);
log
.
error
(
"[assignRewardCodesToUser] 分配失败, luckyBagId: {}, orderId: {}"
,
luckyBagId
,
orderId
);
String
msg
=
String
.
format
(
"福袋ID [%s] 分配兑换码失败:用户ID [%s] 的订单ID [%s] 已分配 [%s] 个,应分配 [%s] 个。"
,
luckyBagId
,
uid
,
orderId
,
rewardUsers
.
size
(),
rewardCodes
.
size
());
iFeishuBotService
.
sendTextMessage
(
msg
);
}
}
return
rewardUsers
;
}
catch
(
Exception
e
)
{
log
.
error
(
"error"
,
e
);
// 报警
iFeishuBotService
.
sendTextMessage
(
"error: "
+
e
.
getMessage
());
return
Collections
.
emptyList
();
}
finally
{
redisUtil
.
uLock
(
lockKey
);
}
private
KylinRewardUser
buildRewardUser
(
String
uid
,
String
orderId
,
String
luckyBagId
,
String
orderTicketEntitiesId
,
String
code
)
{
KylinRewardUser
user
=
new
KylinRewardUser
();
user
.
setUid
(
uid
);
user
.
setLuckyBagId
(
luckyBagId
);
user
.
setOrderId
(
orderId
);
user
.
setOrderTicketEntitiesId
(
orderTicketEntitiesId
);
user
.
setCode
(
code
);
user
.
setState
(
1
);
user
.
setCreatedAt
(
LocalDateTime
.
now
());
user
.
setUpdatedAt
(
LocalDateTime
.
now
());
return
user
;
}
private
List
<
KylinRewardCode
>
getAvailableRewardCodes
(
String
luckyBagId
,
int
limitTotal
)
{
LambdaQueryWrapper
<
KylinRewardCode
>
wrapper
=
new
QueryWrapper
<
KylinRewardCode
>().
lambda
()
.
eq
(
KylinRewardCode:
:
getLuckyBagId
,
luckyBagId
)
.
eq
(
KylinRewardCode:
:
getState
,
1
)
.
last
(
true
,
"ORDER BY RAND() LIMIT "
+
limitTotal
);
return
kylinRewardCodeMapper
.
selectList
(
wrapper
);
}
/**
...
...
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