记得上下班打卡 | 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
a1dce53f
Commit
a1dce53f
authored
Apr 06, 2022
by
jiangxiulong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
几个字段null的判断;平均概率除数是未设置概率的总数;当全部设置了概率除数为0的判断;
parent
667c4e8a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
21 additions
and
9 deletions
+21
-9
GoblinNftOrderServiceImpl.java
...service/order/service/impl/GoblinNftOrderServiceImpl.java
+21
-9
No files found.
liquidnet-bus-service/liquidnet-service-order/liquidnet-service-order-impl/src/main/java/com/liquidnet/service/order/service/impl/GoblinNftOrderServiceImpl.java
View file @
a1dce53f
...
...
@@ -73,7 +73,7 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
String
skuId
=
payParam
.
getSkuId
();
int
number
=
1
;
GoblinGoodsSkuInfoVo
skuVo
=
goblinRedisUtils
.
getGoodsSkuInfoVo
(
skuId
);
if
(
null
==
skuVo
||
skuVo
.
getSkuAppear
().
equals
(
"1"
))
{
if
(
null
==
skuVo
||
(
null
!=
skuVo
.
getSkuAppear
()
&&
skuVo
.
getSkuAppear
().
equals
(
"1"
)
))
{
return
ResponseDto
.
failure
(
"该商品不存在~"
);
}
String
spuId
=
skuVo
.
getSpuId
();
...
...
@@ -103,10 +103,10 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return
ResponseDto
.
failure
(
"该商品已停售~"
);
}
// 判断数量限购 盲盒暂时没限购但是要记录购买数量 所以也放在这里 这样既能都记录限购数量又不至于判断处理麻烦
int
limitCount
=
skuVo
.
getBuyLimit
();
Integer
limitCount
=
skuVo
.
getBuyLimit
();
// 是否限购都记录一个购买数量 防止中间增加限购 开始没加后面判断库存减了也是有问题的 或者放在最后也行 因为对单用户限流了
i
nt
buyCount
=
goblinRedisUtils
.
incrSkuCountByUid
(
uid
,
skuId
,
number
);
if
(!
Objects
.
equals
(
0
,
limitCount
))
{
i
f
(
null
!=
limitCount
&&
!
Objects
.
equals
(
0
,
limitCount
))
{
int
buyCount
=
goblinRedisUtils
.
incrSkuCountByUid
(
uid
,
skuId
,
number
);
if
(
buyCount
>
limitCount
)
{
goblinRedisUtils
.
decrSkuCountByUid
(
uid
,
skuId
,
number
);
return
ResponseDto
.
failure
(
"您已超出限购数量~"
);
...
...
@@ -220,17 +220,27 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
return
null
;
}
else
{
// 计算总概率 和 剩余没填概率的平均概率
BigDecimal
sumHitRatio
=
skuInfoVos
.
stream
().
map
(
GoblinGoodsSkuInfoVo:
:
getHitRatio
).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
int
size
=
skuInfoVos
.
size
();
int
size
=
0
;
BigDecimal
sumHitRatio
=
BigDecimal
.
ZERO
;
for
(
GoblinGoodsSkuInfoVo
skuInfoVo
:
skuInfoVos
)
{
if
(
null
==
skuInfoVo
.
getHitRatio
()
||
skuInfoVo
.
getHitRatio
().
compareTo
(
BigDecimal
.
ZERO
)
<=
0
)
{
size
++;
}
else
{
sumHitRatio
=
sumHitRatio
.
add
(
skuInfoVo
.
getHitRatio
());
}
}
/**
* 剔除掉没库存的商品再去算未设置概率商品的平均概率 会导致未设置概率的商品的概率增加
* 如果不剔除掉没库存的商品去算未设置概率商品的平均概率 会导致总概率小于100 如果随机数还是0-100的话就有可能会中奖溢出
* 想保持概率 1.不剔除无库存商品算平均概率 2.随机数最大值为排序后概率的最后一个值
*/
// ************
BigDecimal
avgHitRatio
=
new
BigDecimal
(
100
).
subtract
(
sumHitRatio
).
divide
(
new
BigDecimal
(
size
),
2
,
RoundingMode
.
HALF_UP
);
BigDecimal
avgHitRatio
=
BigDecimal
.
ZERO
;
if
(
size
>
0
)
{
// 说明有未设置抽奖概率的
avgHitRatio
=
new
BigDecimal
(
100
).
subtract
(
sumHitRatio
).
divide
(
new
BigDecimal
(
size
),
2
,
RoundingMode
.
HALF_UP
);
}
// 未设置概率的写入概率
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
int
skuListSize
=
skuInfoVos
.
size
();
for
(
int
i
=
0
;
i
<
skuListSize
;
i
++)
{
GoblinGoodsSkuInfoVo
infoVo
=
skuInfoVos
.
get
(
i
);
if
(
null
==
infoVo
.
getHitRatio
()
||
infoVo
.
getHitRatio
().
compareTo
(
BigDecimal
.
ZERO
)
<=
0
)
{
skuInfoVos
.
get
(
i
).
setHitRatio
(
avgHitRatio
);
...
...
@@ -246,6 +256,8 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
// 根据区块值来获取抽取到的物品索引
double
nextDouble
=
Math
.
random
();
BigDecimal
nextDoubleNew
=
BigDecimal
.
valueOf
(
nextDouble
);
nextDoubleNew
=
nextDoubleNew
.
multiply
(
hitRatioList
.
get
(
hitRatioList
.
size
()
-
1
)).
setScale
(
4
,
RoundingMode
.
HALF_UP
);
hitRatioList
.
add
(
nextDoubleNew
);
Collections
.
sort
(
hitRatioList
);
...
...
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