Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gxpt_ht
Overview
Overview
Details
Activity
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
pseer
gxpt_ht
Commits
5bbff7b3
Commit
5bbff7b3
authored
Oct 11, 2024
by
吕明尚
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改验券幂等
parent
a35eee80
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
301 additions
and
295 deletions
+301
-295
pom.xml
share-common/pom.xml
+0
-6
RedisLockUtil.java
...ommon/src/main/java/share/common/utils/RedisLockUtil.java
+75
-0
RepeatSubmit.java
...on/src/main/java/share/common/utils/aop/RepeatSubmit.java
+0
-14
RepeatSubmitAspect.java
.../main/java/share/common/utils/aop/RepeatSubmitAspect.java
+0
-61
QPServiceImpl.java
...rc/main/java/share/system/service/impl/QPServiceImpl.java
+107
-101
TiktokServiceImpl.java
...ain/java/share/system/service/impl/TiktokServiceImpl.java
+119
-113
No files found.
share-common/pom.xml
View file @
5bbff7b3
...
...
@@ -177,11 +177,6 @@
<version>
1.4.9
</version>
</dependency>
<dependency>
<groupId>
com.google.guava
</groupId>
<artifactId>
guava
</artifactId>
<version>
21.0
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
share-common/src/main/java/share/common/utils/RedisLockUtil.java
0 → 100644
View file @
5bbff7b3
package
share
.
common
.
utils
;
import
org.springframework.data.redis.core.RedisCallback
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Objects
;
/**
* @ClassName RedisLockUtil
* @Description 使用redis做锁
* @Author Wangyujie
* @Version V1.1.0
*/
@Component
public
class
RedisLockUtil
{
@Resource
RedisTemplate
<
String
,
Object
>
redisTemplate
;
/**
* 获取锁Key
*
* @param prefix 前缀
* @param name 名称
* @return
*/
public
static
String
getFullKey
(
String
prefix
,
String
name
)
{
return
prefix
+
"_"
+
name
;
}
/**
* 获取锁,true 则得到锁,false 已被锁定
*
* @param lockName 锁名称
* @param lockExoire 锁时间毫秒
* @return
*/
public
Boolean
getLock
(
String
lockName
,
Integer
lockExoire
)
{
return
(
Boolean
)
redisTemplate
.
execute
((
RedisCallback
<?>)
connection
->
{
// 获取时间毫秒值
long
expireAt
=
System
.
currentTimeMillis
()
+
lockExoire
+
1
;
// 获取锁
Boolean
acquire
=
connection
.
setNX
(
lockName
.
getBytes
(),
String
.
valueOf
(
expireAt
).
getBytes
());
if
(
acquire
)
{
return
true
;
}
else
{
byte
[]
bytes
=
connection
.
get
(
lockName
.
getBytes
());
// 非空判断
if
(
Objects
.
nonNull
(
bytes
)
&&
bytes
.
length
>
0
)
{
long
expireTime
=
Long
.
parseLong
(
new
String
(
bytes
));
// 如果锁已经过期
if
(
expireTime
<
System
.
currentTimeMillis
())
{
// 重新加锁,防止死锁
byte
[]
set
=
connection
.
getSet
(
lockName
.
getBytes
(),
String
.
valueOf
(
System
.
currentTimeMillis
()
+
lockExoire
+
1
).
getBytes
());
return
Long
.
parseLong
(
new
String
(
set
))
<
System
.
currentTimeMillis
();
}
}
}
return
false
;
});
}
/**
* 删除锁
*
* @param lockName
*/
public
void
delLock
(
String
lockName
)
{
redisTemplate
.
delete
(
lockName
);
}
}
share-common/src/main/java/share/common/utils/aop/RepeatSubmit.java
deleted
100644 → 0
View file @
a35eee80
package
share
.
common
.
utils
.
aop
;
import
java.lang.annotation.*
;
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
@Inherited
public
@interface
RepeatSubmit
{
String
key
()
default
""
;
}
share-common/src/main/java/share/common/utils/aop/RepeatSubmitAspect.java
deleted
100644 → 0
View file @
a35eee80
package
share
.
common
.
utils
.
aop
;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
org.apache.commons.lang3.StringUtils
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.reflect.MethodSignature
;
import
org.springframework.stereotype.Component
;
import
java.lang.reflect.Method
;
import
java.util.concurrent.TimeUnit
;
@Aspect
@Component
public
class
RepeatSubmitAspect
{
private
static
final
Cache
<
String
,
Object
>
CACHES
=
CacheBuilder
.
newBuilder
()
// 最大缓存 设置为1000个
.
maximumSize
(
1000
)
// 设置写缓存后1s过期
.
expireAfterWrite
(
1
,
TimeUnit
.
SECONDS
)
.
build
();
@Around
(
"execution(public * *(..)) && @annotation(share.common.utils.aop.RepeatSubmit))"
)
public
Object
interceptor
(
ProceedingJoinPoint
pjp
)
{
MethodSignature
signature
=
(
MethodSignature
)
pjp
.
getSignature
();
Method
method
=
signature
.
getMethod
();
RepeatSubmit
repeatSubmit
=
method
.
getAnnotation
(
RepeatSubmit
.
class
);
String
key
=
getKey
(
repeatSubmit
.
key
(),
pjp
.
getArgs
());
if
(
StringUtils
.
isNotBlank
(
key
))
{
if
(
CACHES
.
getIfPresent
(
key
)
!=
null
)
{
throw
new
RuntimeException
(
"请勿重复请求"
);
}
// 如果是第一次请求,就将key 当前对象压入缓存中
CACHES
.
put
(
key
,
key
);
}
try
{
return
pjp
.
proceed
();
}
catch
(
Throwable
throwable
)
{
throw
new
RuntimeException
(
"服务器异常!"
);
}
}
/**
* key 的生成策略
*
* @param keyExpress 表达式
* @param args 参数
* @return 生成的key
*/
private
String
getKey
(
String
keyExpress
,
Object
[]
args
)
{
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
keyExpress
=
keyExpress
.
replace
(
"arg["
+
i
+
"]"
,
args
[
i
].
toString
());
}
return
keyExpress
;
}
}
share-system/src/main/java/share/system/service/impl/QPServiceImpl.java
View file @
5bbff7b3
...
...
@@ -32,7 +32,7 @@ import share.common.core.redis.RedisUtil;
import
share.common.enums.*
;
import
share.common.exception.base.BaseException
;
import
share.common.utils.DateUtils
;
import
share.common.utils.
aop.RepeatSubmit
;
import
share.common.utils.
RedisLockUtil
;
import
share.system.domain.SConsumer
;
import
share.system.domain.SConsumerCoupon
;
import
share.system.domain.SCoupon
;
...
...
@@ -78,6 +78,9 @@ public class QPServiceImpl implements QPService {
private
RedisUtil
redisUtil
;
@Autowired
private
RedisLockUtil
redisLockUtil
;
@Autowired
private
ISStoreService
storeService
;
//默认门槛时长
...
...
@@ -101,115 +104,118 @@ public class QPServiceImpl implements QPService {
* 用户验卷接口
*/
@Override
@RepeatSubmit
(
key
=
"美团验卷"
)
public
String
consumeByUser
(
String
code
,
String
storeId
,
String
status
)
throws
Exception
{
//获取用户信息
SConsumer
user
=
FrontTokenComponent
.
getWxSConsumerEntry
();
if
(
ObjectUtil
.
isNull
(
user
))
{
throw
new
BaseException
(
"您的登录已过期,请先登录"
);
}
LambdaQueryWrapper
<
SStore
>
sStoreLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sStoreLambdaQueryWrapper
.
eq
(
SStore:
:
getId
,
storeId
);
SStore
sStore
=
storeService
.
getOne
(
sStoreLambdaQueryWrapper
);
if
(
ObjectUtils
.
isEmpty
(
sStore
)
||
StoreStatusEnum
.
STOP
.
getIndex
().
equals
(
sStore
.
getStatus
()))
{
throw
new
Exception
(
"门店维护中,请联系客服"
);
}
if
(
StringUtils
.
isEmpty
(
sStore
.
getOpenShopUuid
()))
{
throw
new
Exception
(
"门店未授权,请联系客服"
);
}
//验券准备
TuangouReceiptPrepareResponseEntity
prepare
=
prepare
(
code
.
trim
(),
sStore
.
getOpenShopUuid
(),
status
);
//查询领取记录表
LambdaQueryWrapper
<
SConsumerCoupon
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
SConsumerCoupon:
:
getCouponCode
,
code
);
queryWrapper
.
eq
(
SConsumerCoupon:
:
getUseStatus
,
UserStatusEnum
.
UNUSED
.
getCode
());
queryWrapper
.
eq
(
SConsumerCoupon:
:
getIsDelete
,
YesNoEnum
.
no
.
getIndex
());
SConsumerCoupon
unUsedCoupon
=
isConsumerCouponService
.
getOne
(
queryWrapper
);
if
(
ObjectUtils
.
isNotEmpty
(
unUsedCoupon
))
{
throw
new
Exception
(
"该券码已被使用"
);
}
//根据优惠卷名称查询优惠劵配置 查询list,取第一个
SConsumerCoupon
sConsumerCoupon
=
new
SConsumerCoupon
();
sConsumerCoupon
.
setConsumerId
(
user
.
getId
());
sConsumerCoupon
.
setDealId
(
prepare
.
getDeal_id
());
sConsumerCoupon
.
setStoreId
(
sStore
.
getId
());
sConsumerCoupon
.
setCouponCode
(
code
);
sConsumerCoupon
.
setName
(
prepare
.
getDeal_title
());
sConsumerCoupon
.
setSourceType
(
SourceTypeEnum
.
CHECK
.
getCode
());
sConsumerCoupon
.
setPlatformType
(
PlatformTypeEnum
.
MEITUAN
.
getCode
());
sConsumerCoupon
.
setUseStatus
(
UserStatusEnum
.
UNUSED
.
getCode
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setCreateTime
(
new
Date
());
sConsumerCoupon
.
setOriginalPrice
(
BigDecimal
.
valueOf
(
prepare
.
getDeal_marketprice
()));
Stream
<
TuangouReceiptPreparePaymentDetail
>
tuangouReceiptPreparePaymentDetailStream
=
prepare
.
getPayment_detail
().
stream
().
filter
(
o
->
o
.
getAmount_type
().
equals
(
10L
)
||
o
.
getAmount_type
().
equals
(
23L
)
||
o
.
getAmount_type
().
equals
(
25L
)
||
o
.
getAmount_type
().
equals
(
26L
)
||
o
.
getAmount_type
().
equals
(
29L
));
BigDecimal
couponPayPrice
=
tuangouReceiptPreparePaymentDetailStream
.
map
(
o
->
o
.
getAmount
()).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
sConsumerCoupon
.
setCouponPayPrice
(
couponPayPrice
);
//查询美团团购信息
List
<
TuangouDealQueryShopDealResponseEntity
>
groupActivities
=
queryshopdeal
(
sStore
.
getOpenShopUuid
());
groupActivities
.
forEach
(
o
->
{
//套餐名称相同并且在售卖中
if
(
prepare
.
getDealgroup_id
().
equals
(
o
.
getDealgroup_id
()))
{
Date
receiptEndDate
=
DateUtil
.
parse
(
o
.
getReceipt_end_date
(),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
);
Date
receiptBeginDate
=
DateUtil
.
parse
(
o
.
getReceipt_begin_date
(),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
);
sConsumerCoupon
.
setStartDate
(
receiptBeginDate
);
sConsumerCoupon
.
setEndDate
(
receiptEndDate
);
Boolean
lock
=
redisLockUtil
.
getLock
(
String
.
valueOf
(
user
.
getId
()),
1000
);
if
(
lock
)
{
LambdaQueryWrapper
<
SStore
>
sStoreLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sStoreLambdaQueryWrapper
.
eq
(
SStore:
:
getId
,
storeId
);
SStore
sStore
=
storeService
.
getOne
(
sStoreLambdaQueryWrapper
);
if
(
ObjectUtils
.
isEmpty
(
sStore
)
||
StoreStatusEnum
.
STOP
.
getIndex
().
equals
(
sStore
.
getStatus
()))
{
throw
new
Exception
(
"门店维护中,请联系客服"
);
}
});
if
(
ObjectUtils
.
isEmpty
(
sConsumerCoupon
.
getStartDate
()))
{
//获取本日的00:00:00
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
calendar
.
set
(
Calendar
.
MINUTE
,
0
);
calendar
.
set
(
Calendar
.
SECOND
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Date
startOfDay
=
calendar
.
getTime
();
sConsumerCoupon
.
setStartDate
(
startOfDay
);
}
if
(
ObjectUtils
.
isEmpty
(
sConsumerCoupon
.
getEndDate
()))
{
//当前时间加上一年
sConsumerCoupon
.
setEndDate
(
DateUtils
.
addYears
(
new
Date
(),
1
));
}
List
<
SCoupon
>
sCoupons
=
isCouponService
.
selectSCouponByDealgroupId
(
prepare
.
getDealgroup_id
());
SCoupon
sCoupon
=
null
;
if
(!
CollectionUtils
.
isEmpty
(
sCoupons
))
{
sCoupon
=
sCoupons
.
get
(
0
);
}
if
(
ObjectUtils
.
isEmpty
(
sCoupon
))
{
sConsumerCoupon
.
setDealgroupId
(
prepare
.
getDealgroup_id
());
sConsumerCoupon
.
setCouponType
(
CouponTypeEnum
.
CASH
.
getCode
());
sConsumerCoupon
.
setStoreType
(
StoreType
.
getCodeList
());
sConsumerCoupon
.
setRoomType
(
RoomType
.
getCodeList
());
if
(
StringUtils
.
isEmpty
(
sStore
.
getOpenShopUuid
()))
{
throw
new
Exception
(
"门店未授权,请联系客服"
);
}
//查询领取记录表
LambdaQueryWrapper
<
SConsumerCoupon
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
queryWrapper
.
eq
(
SConsumerCoupon:
:
getCouponCode
,
code
);
queryWrapper
.
eq
(
SConsumerCoupon:
:
getUseStatus
,
UserStatusEnum
.
UNUSED
.
getCode
());
queryWrapper
.
eq
(
SConsumerCoupon:
:
getIsDelete
,
YesNoEnum
.
no
.
getIndex
());
SConsumerCoupon
unUsedCoupon
=
isConsumerCouponService
.
getOne
(
queryWrapper
);
if
(
ObjectUtils
.
isNotEmpty
(
unUsedCoupon
))
{
throw
new
Exception
(
"该券码已被使用"
);
}
//验券准备
TuangouReceiptPrepareResponseEntity
prepare
=
prepare
(
code
.
trim
(),
sStore
.
getOpenShopUuid
(),
status
);
//根据优惠卷名称查询优惠劵配置 查询list,取第一个
SConsumerCoupon
sConsumerCoupon
=
new
SConsumerCoupon
();
sConsumerCoupon
.
setConsumerId
(
user
.
getId
());
sConsumerCoupon
.
setDealId
(
prepare
.
getDeal_id
());
sConsumerCoupon
.
setStoreId
(
sStore
.
getId
());
sConsumerCoupon
.
setCouponCode
(
code
);
sConsumerCoupon
.
setName
(
prepare
.
getDeal_title
());
sConsumerCoupon
.
setSourceType
(
SourceTypeEnum
.
CHECK
.
getCode
());
sConsumerCoupon
.
setPlatformType
(
PlatformTypeEnum
.
MEITUAN
.
getCode
());
sConsumerCoupon
.
setUseStatus
(
UserStatusEnum
.
UNUSED
.
getCode
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setMinDuration
(
DEFAULT_MIN_DURATION
);
sConsumerCoupon
.
setMaxDuration
(
DEFAULT_MAX_DURATION
);
sConsumerCoupon
.
setDuration
(
DEFAULT_DURATION
);
sConsumerCoupon
.
setMinPrice
(
DEFAULT_MIN_PRICE
);
sConsumerCoupon
.
setCouponTimeStart
(
DEFAULT_START_TIME
);
sConsumerCoupon
.
setCouponTimeEnd
(
DEFAULT_END_TIME
);
sConsumerCoupon
.
setSalePrice
(
sConsumerCoupon
.
getCouponPayPrice
());
}
else
{
sConsumerCoupon
.
setCouponId
(
sCoupon
.
getId
());
sConsumerCoupon
.
setCouponType
(
sCoupon
.
getCouponType
());
sConsumerCoupon
.
setStoreType
(
sCoupon
.
getStoreType
());
sConsumerCoupon
.
setRoomType
(
sCoupon
.
getRoomType
());
sConsumerCoupon
.
setMinDuration
(
sCoupon
.
getMinDuration
());
sConsumerCoupon
.
setMaxDuration
(
sCoupon
.
getMaxDuration
());
sConsumerCoupon
.
setDuration
(
sCoupon
.
getDuration
());
sConsumerCoupon
.
setMinPrice
(
sCoupon
.
getMinPrice
());
sConsumerCoupon
.
setCouponTimeStart
(
sCoupon
.
getValidStartTime
());
sConsumerCoupon
.
setCouponTimeEnd
(
sCoupon
.
getValidEndTime
());
sConsumerCoupon
.
setOrderType
(
sCoupon
.
getOrderType
());
sConsumerCoupon
.
setDealgroupId
(
sCoupon
.
getDealgroupId
());
sConsumerCoupon
.
setStoreIds
(
sCoupon
.
getStoreIds
());
sConsumerCoupon
.
setPackIds
(
sCoupon
.
getPackIds
());
sConsumerCoupon
.
setWeeks
(
sCoupon
.
getWeeks
());
sConsumerCoupon
.
setRemark
(
sCoupon
.
getRemark
());
sConsumerCoupon
.
setSalePrice
(
sCoupon
.
getSalePrice
());
sConsumerCoupon
.
setCreateTime
(
new
Date
());
sConsumerCoupon
.
setOriginalPrice
(
BigDecimal
.
valueOf
(
prepare
.
getDeal_marketprice
()));
Stream
<
TuangouReceiptPreparePaymentDetail
>
tuangouReceiptPreparePaymentDetailStream
=
prepare
.
getPayment_detail
().
stream
().
filter
(
o
->
o
.
getAmount_type
().
equals
(
10L
)
||
o
.
getAmount_type
().
equals
(
23L
)
||
o
.
getAmount_type
().
equals
(
25L
)
||
o
.
getAmount_type
().
equals
(
26L
)
||
o
.
getAmount_type
().
equals
(
29L
));
BigDecimal
couponPayPrice
=
tuangouReceiptPreparePaymentDetailStream
.
map
(
o
->
o
.
getAmount
()).
reduce
(
BigDecimal
.
ZERO
,
BigDecimal:
:
add
);
sConsumerCoupon
.
setCouponPayPrice
(
couponPayPrice
);
//查询美团团购信息
List
<
TuangouDealQueryShopDealResponseEntity
>
groupActivities
=
queryshopdeal
(
sStore
.
getOpenShopUuid
());
groupActivities
.
forEach
(
o
->
{
//套餐名称相同并且在售卖中
if
(
prepare
.
getDealgroup_id
().
equals
(
o
.
getDealgroup_id
()))
{
Date
receiptEndDate
=
DateUtil
.
parse
(
o
.
getReceipt_end_date
(),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
);
Date
receiptBeginDate
=
DateUtil
.
parse
(
o
.
getReceipt_begin_date
(),
DatePattern
.
NORM_DATETIME_MINUTE_PATTERN
);
sConsumerCoupon
.
setStartDate
(
receiptBeginDate
);
sConsumerCoupon
.
setEndDate
(
receiptEndDate
);
}
});
if
(
ObjectUtils
.
isEmpty
(
sConsumerCoupon
.
getStartDate
()))
{
//获取本日的00:00:00
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
calendar
.
set
(
Calendar
.
MINUTE
,
0
);
calendar
.
set
(
Calendar
.
SECOND
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Date
startOfDay
=
calendar
.
getTime
();
sConsumerCoupon
.
setStartDate
(
startOfDay
);
}
if
(
ObjectUtils
.
isEmpty
(
sConsumerCoupon
.
getEndDate
()))
{
//当前时间加上一年
sConsumerCoupon
.
setEndDate
(
DateUtils
.
addYears
(
new
Date
(),
1
));
}
List
<
SCoupon
>
sCoupons
=
isCouponService
.
selectSCouponByDealgroupId
(
prepare
.
getDealgroup_id
());
SCoupon
sCoupon
=
null
;
if
(!
CollectionUtils
.
isEmpty
(
sCoupons
))
{
sCoupon
=
sCoupons
.
get
(
0
);
}
if
(
ObjectUtils
.
isEmpty
(
sCoupon
))
{
sConsumerCoupon
.
setDealgroupId
(
prepare
.
getDealgroup_id
());
sConsumerCoupon
.
setCouponType
(
CouponTypeEnum
.
CASH
.
getCode
());
sConsumerCoupon
.
setStoreType
(
StoreType
.
getCodeList
());
sConsumerCoupon
.
setRoomType
(
RoomType
.
getCodeList
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setMinDuration
(
DEFAULT_MIN_DURATION
);
sConsumerCoupon
.
setMaxDuration
(
DEFAULT_MAX_DURATION
);
sConsumerCoupon
.
setDuration
(
DEFAULT_DURATION
);
sConsumerCoupon
.
setMinPrice
(
DEFAULT_MIN_PRICE
);
sConsumerCoupon
.
setCouponTimeStart
(
DEFAULT_START_TIME
);
sConsumerCoupon
.
setCouponTimeEnd
(
DEFAULT_END_TIME
);
sConsumerCoupon
.
setSalePrice
(
sConsumerCoupon
.
getCouponPayPrice
());
}
else
{
sConsumerCoupon
.
setCouponId
(
sCoupon
.
getId
());
sConsumerCoupon
.
setCouponType
(
sCoupon
.
getCouponType
());
sConsumerCoupon
.
setStoreType
(
sCoupon
.
getStoreType
());
sConsumerCoupon
.
setRoomType
(
sCoupon
.
getRoomType
());
sConsumerCoupon
.
setMinDuration
(
sCoupon
.
getMinDuration
());
sConsumerCoupon
.
setMaxDuration
(
sCoupon
.
getMaxDuration
());
sConsumerCoupon
.
setDuration
(
sCoupon
.
getDuration
());
sConsumerCoupon
.
setMinPrice
(
sCoupon
.
getMinPrice
());
sConsumerCoupon
.
setCouponTimeStart
(
sCoupon
.
getValidStartTime
());
sConsumerCoupon
.
setCouponTimeEnd
(
sCoupon
.
getValidEndTime
());
sConsumerCoupon
.
setOrderType
(
sCoupon
.
getOrderType
());
sConsumerCoupon
.
setDealgroupId
(
sCoupon
.
getDealgroupId
());
sConsumerCoupon
.
setStoreIds
(
sCoupon
.
getStoreIds
());
sConsumerCoupon
.
setPackIds
(
sCoupon
.
getPackIds
());
sConsumerCoupon
.
setWeeks
(
sCoupon
.
getWeeks
());
sConsumerCoupon
.
setRemark
(
sCoupon
.
getRemark
());
sConsumerCoupon
.
setSalePrice
(
sCoupon
.
getSalePrice
());
}
isConsumerCouponService
.
insertSConsumerCoupon
(
sConsumerCoupon
);
//核销美团券
qpService
.
consume
(
code
.
trim
(),
1
,
sStore
.
getOpenShopUuid
(),
status
);
return
"验劵成功"
;
}
isConsumerCouponService
.
insertSConsumerCoupon
(
sConsumerCoupon
);
//核销美团券
// qpService.consume(code.trim(), 1, sStore.getOpenShopUuid(), status);
return
"验劵成功"
;
throw
new
RuntimeException
(
"验劵失败"
);
}
@Override
...
...
share-system/src/main/java/share/system/service/impl/TiktokServiceImpl.java
View file @
5bbff7b3
...
...
@@ -20,7 +20,7 @@ import org.springframework.util.CollectionUtils;
import
share.common.core.redis.RedisUtil
;
import
share.common.enums.*
;
import
share.common.exception.base.BaseException
;
import
share.common.utils.
aop.RepeatSubmit
;
import
share.common.utils.
RedisLockUtil
;
import
share.system.domain.SConsumer
;
import
share.system.domain.SConsumerCoupon
;
import
share.system.domain.SCoupon
;
...
...
@@ -55,6 +55,9 @@ public class TiktokServiceImpl implements TiktokService {
private
RedisUtil
redisUtil
;
@Autowired
private
RedisLockUtil
redisLockUtil
;
@Autowired
private
ISStoreService
storeService
;
@Autowired
...
...
@@ -352,39 +355,40 @@ public class TiktokServiceImpl implements TiktokService {
}
@Override
@RepeatSubmit
(
key
=
"抖音验卷"
)
public
String
consumeByUser
(
String
code
,
String
storeId
)
throws
Exception
{
SConsumer
user
=
FrontTokenComponent
.
getWxSConsumerEntry
();
if
(
ObjectUtil
.
isNull
(
user
))
{
throw
new
BaseException
(
"您的登录已过期,请先登录"
);
}
LambdaQueryWrapper
<
SStore
>
sStoreLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sStoreLambdaQueryWrapper
.
eq
(
SStore:
:
getId
,
storeId
);
SStore
sStore
=
storeService
.
getOne
(
sStoreLambdaQueryWrapper
);
if
(
ObjectUtils
.
isEmpty
(
sStore
)
||
StoreStatusEnum
.
STOP
.
getIndex
().
equals
(
sStore
.
getStatus
()))
{
throw
new
Exception
(
"门店维护中,请联系客服"
);
}
if
(
StringUtils
.
isEmpty
(
sStore
.
getTiktokPoiId
()))
{
throw
new
Exception
(
"门店未授权,请联系客服"
);
}
if
(
code
.
startsWith
(
"https://v.douyin.com/"
)
|
code
.
length
()
==
15
|
code
.
length
()
==
12
)
{
try
{
TiktokCouponDto
tiktokCouponDto
=
new
TiktokCouponDto
();
if
(
code
.
startsWith
(
"https://v.douyin.com/"
))
{
tiktokCouponDto
.
setEncryptedData
(
code
);
}
else
{
tiktokCouponDto
.
setCode
(
code
);
}
tiktokCouponDto
.
setPoiId
(
sStore
.
getTiktokPoiId
());
JSONObject
prepare
=
prepare
(
tiktokCouponDto
);
JSONArray
certificates
=
prepare
.
getJSONArray
(
"certificates"
);
if
(
CollectionUtils
.
isEmpty
(
certificates
))
{
throw
new
Exception
(
"该券码已被使用"
);
}
Object
o
=
certificates
.
get
(
0
);
JSONObject
entries
=
new
JSONObject
(
o
);
JSONObject
sku
=
entries
.
getJSONObject
(
"sku"
);
JSONObject
amount
=
entries
.
getJSONObject
(
"amount"
);
Boolean
lock
=
redisLockUtil
.
getLock
(
String
.
valueOf
(
user
.
getId
()),
1000
);
if
(
lock
)
{
LambdaQueryWrapper
<
SStore
>
sStoreLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sStoreLambdaQueryWrapper
.
eq
(
SStore:
:
getId
,
storeId
);
SStore
sStore
=
storeService
.
getOne
(
sStoreLambdaQueryWrapper
);
if
(
ObjectUtils
.
isEmpty
(
sStore
)
||
StoreStatusEnum
.
STOP
.
getIndex
().
equals
(
sStore
.
getStatus
()))
{
throw
new
Exception
(
"门店维护中,请联系客服"
);
}
if
(
StringUtils
.
isEmpty
(
sStore
.
getTiktokPoiId
()))
{
throw
new
Exception
(
"门店未授权,请联系客服"
);
}
if
(
code
.
startsWith
(
"https://v.douyin.com/"
)
|
code
.
length
()
==
15
|
code
.
length
()
==
12
)
{
try
{
TiktokCouponDto
tiktokCouponDto
=
new
TiktokCouponDto
();
if
(
code
.
startsWith
(
"https://v.douyin.com/"
))
{
tiktokCouponDto
.
setEncryptedData
(
code
);
}
else
{
tiktokCouponDto
.
setCode
(
code
);
}
tiktokCouponDto
.
setPoiId
(
sStore
.
getTiktokPoiId
());
JSONObject
prepare
=
prepare
(
tiktokCouponDto
);
JSONArray
certificates
=
prepare
.
getJSONArray
(
"certificates"
);
if
(
CollectionUtils
.
isEmpty
(
certificates
))
{
throw
new
Exception
(
"该券码已被使用"
);
}
Object
o
=
certificates
.
get
(
0
);
JSONObject
entries
=
new
JSONObject
(
o
);
JSONObject
sku
=
entries
.
getJSONObject
(
"sku"
);
JSONObject
amount
=
entries
.
getJSONObject
(
"amount"
);
// //查询领取记录表
// LambdaQueryWrapper<SConsumerCoupon> queryWrapper = new LambdaQueryWrapper<>();
// queryWrapper.eq(SConsumerCoupon::getCouponCode, entries.getStr("encrypted_code"));
...
...
@@ -394,93 +398,95 @@ public class TiktokServiceImpl implements TiktokService {
// if (ObjectUtils.isNotEmpty(unUsedCoupon)) {
// throw new RuntimeException("该券已被领取");
// }
TiktokCouponDto
couponDto
=
new
TiktokCouponDto
();
couponDto
.
setVerifyToken
(
prepare
.
getStr
(
"verify_token"
));
couponDto
.
setPoiId
(
sStore
.
getTiktokPoiId
());
List
<
String
>
codes
=
new
ArrayList
<>();
List
<
JSONObject
>
list
=
certificates
.
toList
(
JSONObject
.
class
);
//获取List中的encrypted_code
list
.
stream
().
forEach
(
e
->
{
codes
.
add
(
e
.
getStr
(
"encrypted_code"
));
});
couponDto
.
setEncryptedCodes
(
codes
);
JSONObject
verify
=
verify
(
couponDto
);
JSONArray
verifyResults
=
verify
.
getJSONArray
(
"verify_results"
);
verifyResults
.
forEach
(
item
->
{
JSONObject
verifyResult
=
new
JSONObject
(
item
);
String
originCode
=
verifyResult
.
getStr
(
"origin_code"
);
SConsumerCoupon
sConsumerCoupon
=
new
SConsumerCoupon
();
sConsumerCoupon
.
setConsumerId
(
user
.
getId
());
sConsumerCoupon
.
setStoreId
(
sStore
.
getId
());
sConsumerCoupon
.
setCouponCode
(
originCode
);
sConsumerCoupon
.
setEncryptedCode
(
entries
.
getStr
(
"encrypted_code"
));
sConsumerCoupon
.
setName
(
sku
.
getStr
(
"title"
));
sConsumerCoupon
.
setSourceType
(
SourceTypeEnum
.
CHECK
.
getCode
());
sConsumerCoupon
.
setPlatformType
(
PlatformTypeEnum
.
TIKTOK
.
getCode
());
sConsumerCoupon
.
setUseStatus
(
UserStatusEnum
.
UNUSED
.
getCode
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setCreateTime
(
new
Date
());
Integer
originalAmount
=
amount
.
getInt
(
"list_market_amount"
);
sConsumerCoupon
.
setOriginalPrice
(
BigDecimal
.
valueOf
(
originalAmount
/
100
));
sConsumerCoupon
.
setCouponPayPrice
(
BigDecimal
.
valueOf
(
amount
.
getInt
(
"pay_amount"
)
/
100
));
//时间戳转年月日时分秒
sConsumerCoupon
.
setEndDate
(
new
Date
(
entries
.
getInt
(
"expire_time"
)
*
1000L
));
//获取本日的00:00:00
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
calendar
.
set
(
Calendar
.
MINUTE
,
0
);
calendar
.
set
(
Calendar
.
SECOND
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Date
startOfDay
=
calendar
.
getTime
();
sConsumerCoupon
.
setStartDate
(
startOfDay
);
LambdaQueryWrapper
<
SCoupon
>
sCouponLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sCouponLambdaQueryWrapper
.
eq
(
SCoupon:
:
getTiktokSkuId
,
sku
.
getStr
(
"sku_id"
));
List
<
SCoupon
>
sCoupons
=
isCouponService
.
list
(
sCouponLambdaQueryWrapper
);
SCoupon
sCoupon
=
null
;
if
(!
CollectionUtils
.
isEmpty
(
sCoupons
))
{
sCoupon
=
sCoupons
.
get
(
0
);
}
if
(
ObjectUtils
.
isEmpty
(
sCoupon
))
{
sConsumerCoupon
.
setTiktokSkuId
(
sku
.
getStr
(
"sku_id"
));
sConsumerCoupon
.
setCouponType
(
CouponTypeEnum
.
CASH
.
getCode
());
sConsumerCoupon
.
setStoreType
(
StoreType
.
getCodeList
());
sConsumerCoupon
.
setRoomType
(
RoomType
.
getCodeList
());
TiktokCouponDto
couponDto
=
new
TiktokCouponDto
();
couponDto
.
setVerifyToken
(
prepare
.
getStr
(
"verify_token"
));
couponDto
.
setPoiId
(
sStore
.
getTiktokPoiId
());
List
<
String
>
codes
=
new
ArrayList
<>();
List
<
JSONObject
>
list
=
certificates
.
toList
(
JSONObject
.
class
);
//获取List中的encrypted_code
list
.
stream
().
forEach
(
e
->
{
codes
.
add
(
e
.
getStr
(
"encrypted_code"
));
});
couponDto
.
setEncryptedCodes
(
codes
);
JSONObject
verify
=
verify
(
couponDto
);
JSONArray
verifyResults
=
verify
.
getJSONArray
(
"verify_results"
);
verifyResults
.
forEach
(
item
->
{
JSONObject
verifyResult
=
new
JSONObject
(
item
);
String
originCode
=
verifyResult
.
getStr
(
"origin_code"
);
SConsumerCoupon
sConsumerCoupon
=
new
SConsumerCoupon
();
sConsumerCoupon
.
setConsumerId
(
user
.
getId
());
sConsumerCoupon
.
setStoreId
(
sStore
.
getId
());
sConsumerCoupon
.
setCouponCode
(
originCode
);
sConsumerCoupon
.
setEncryptedCode
(
entries
.
getStr
(
"encrypted_code"
));
sConsumerCoupon
.
setName
(
sku
.
getStr
(
"title"
));
sConsumerCoupon
.
setSourceType
(
SourceTypeEnum
.
CHECK
.
getCode
());
sConsumerCoupon
.
setPlatformType
(
PlatformTypeEnum
.
TIKTOK
.
getCode
());
sConsumerCoupon
.
setUseStatus
(
UserStatusEnum
.
UNUSED
.
getCode
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setMinDuration
(
DEFAULT_MIN_DURATION
);
sConsumerCoupon
.
setMaxDuration
(
DEFAULT_MAX_DURATION
);
sConsumerCoupon
.
setDuration
(
DEFAULT_DURATION
);
sConsumerCoupon
.
setMinPrice
(
DEFAULT_MIN_PRICE
);
sConsumerCoupon
.
setCouponTimeStart
(
DEFAULT_START_TIME
);
sConsumerCoupon
.
setCouponTimeEnd
(
DEFAULT_END_TIME
);
sConsumerCoupon
.
setSalePrice
(
sConsumerCoupon
.
getCouponPayPrice
());
}
else
{
sConsumerCoupon
.
setCouponId
(
sCoupon
.
getId
());
sConsumerCoupon
.
setCouponType
(
sCoupon
.
getCouponType
());
sConsumerCoupon
.
setStoreType
(
sCoupon
.
getStoreType
());
sConsumerCoupon
.
setRoomType
(
sCoupon
.
getRoomType
());
sConsumerCoupon
.
setMinDuration
(
sCoupon
.
getMinDuration
());
sConsumerCoupon
.
setMaxDuration
(
sCoupon
.
getMaxDuration
());
sConsumerCoupon
.
setDuration
(
sCoupon
.
getDuration
());
sConsumerCoupon
.
setMinPrice
(
sCoupon
.
getMinPrice
());
sConsumerCoupon
.
setCouponTimeStart
(
sCoupon
.
getValidStartTime
());
sConsumerCoupon
.
setCouponTimeEnd
(
sCoupon
.
getValidEndTime
());
sConsumerCoupon
.
setOrderType
(
sCoupon
.
getOrderType
());
sConsumerCoupon
.
setTiktokSkuId
(
sCoupon
.
getTiktokSkuId
());
sConsumerCoupon
.
setStoreIds
(
sCoupon
.
getStoreIds
());
sConsumerCoupon
.
setPackIds
(
sCoupon
.
getPackIds
());
sConsumerCoupon
.
setWeeks
(
sCoupon
.
getWeeks
());
sConsumerCoupon
.
setRemark
(
sCoupon
.
getRemark
());
sConsumerCoupon
.
setSalePrice
(
sCoupon
.
getSalePrice
());
}
isConsumerCouponService
.
insertSConsumerCoupon
(
sConsumerCoupon
);
});
}
catch
(
RuntimeException
e
)
{
throw
new
RuntimeException
(
e
);
sConsumerCoupon
.
setCreateTime
(
new
Date
());
Integer
originalAmount
=
amount
.
getInt
(
"list_market_amount"
);
sConsumerCoupon
.
setOriginalPrice
(
BigDecimal
.
valueOf
(
originalAmount
/
100
));
sConsumerCoupon
.
setCouponPayPrice
(
BigDecimal
.
valueOf
(
amount
.
getInt
(
"pay_amount"
)
/
100
));
//时间戳转年月日时分秒
sConsumerCoupon
.
setEndDate
(
new
Date
(
entries
.
getInt
(
"expire_time"
)
*
1000L
));
//获取本日的00:00:00
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
HOUR_OF_DAY
,
0
);
calendar
.
set
(
Calendar
.
MINUTE
,
0
);
calendar
.
set
(
Calendar
.
SECOND
,
0
);
calendar
.
set
(
Calendar
.
MILLISECOND
,
0
);
Date
startOfDay
=
calendar
.
getTime
();
sConsumerCoupon
.
setStartDate
(
startOfDay
);
LambdaQueryWrapper
<
SCoupon
>
sCouponLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
sCouponLambdaQueryWrapper
.
eq
(
SCoupon:
:
getTiktokSkuId
,
sku
.
getStr
(
"sku_id"
));
List
<
SCoupon
>
sCoupons
=
isCouponService
.
list
(
sCouponLambdaQueryWrapper
);
SCoupon
sCoupon
=
null
;
if
(!
CollectionUtils
.
isEmpty
(
sCoupons
))
{
sCoupon
=
sCoupons
.
get
(
0
);
}
if
(
ObjectUtils
.
isEmpty
(
sCoupon
))
{
sConsumerCoupon
.
setTiktokSkuId
(
sku
.
getStr
(
"sku_id"
));
sConsumerCoupon
.
setCouponType
(
CouponTypeEnum
.
CASH
.
getCode
());
sConsumerCoupon
.
setStoreType
(
StoreType
.
getCodeList
());
sConsumerCoupon
.
setRoomType
(
RoomType
.
getCodeList
());
sConsumerCoupon
.
setCreateBy
(
String
.
valueOf
(
user
.
getId
()));
sConsumerCoupon
.
setMinDuration
(
DEFAULT_MIN_DURATION
);
sConsumerCoupon
.
setMaxDuration
(
DEFAULT_MAX_DURATION
);
sConsumerCoupon
.
setDuration
(
DEFAULT_DURATION
);
sConsumerCoupon
.
setMinPrice
(
DEFAULT_MIN_PRICE
);
sConsumerCoupon
.
setCouponTimeStart
(
DEFAULT_START_TIME
);
sConsumerCoupon
.
setCouponTimeEnd
(
DEFAULT_END_TIME
);
sConsumerCoupon
.
setSalePrice
(
sConsumerCoupon
.
getCouponPayPrice
());
}
else
{
sConsumerCoupon
.
setCouponId
(
sCoupon
.
getId
());
sConsumerCoupon
.
setCouponType
(
sCoupon
.
getCouponType
());
sConsumerCoupon
.
setStoreType
(
sCoupon
.
getStoreType
());
sConsumerCoupon
.
setRoomType
(
sCoupon
.
getRoomType
());
sConsumerCoupon
.
setMinDuration
(
sCoupon
.
getMinDuration
());
sConsumerCoupon
.
setMaxDuration
(
sCoupon
.
getMaxDuration
());
sConsumerCoupon
.
setDuration
(
sCoupon
.
getDuration
());
sConsumerCoupon
.
setMinPrice
(
sCoupon
.
getMinPrice
());
sConsumerCoupon
.
setCouponTimeStart
(
sCoupon
.
getValidStartTime
());
sConsumerCoupon
.
setCouponTimeEnd
(
sCoupon
.
getValidEndTime
());
sConsumerCoupon
.
setOrderType
(
sCoupon
.
getOrderType
());
sConsumerCoupon
.
setTiktokSkuId
(
sCoupon
.
getTiktokSkuId
());
sConsumerCoupon
.
setStoreIds
(
sCoupon
.
getStoreIds
());
sConsumerCoupon
.
setPackIds
(
sCoupon
.
getPackIds
());
sConsumerCoupon
.
setWeeks
(
sCoupon
.
getWeeks
());
sConsumerCoupon
.
setRemark
(
sCoupon
.
getRemark
());
sConsumerCoupon
.
setSalePrice
(
sCoupon
.
getSalePrice
());
}
isConsumerCouponService
.
insertSConsumerCoupon
(
sConsumerCoupon
);
});
}
catch
(
RuntimeException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
else
{
throw
new
RuntimeException
(
"券码格式错误"
);
}
}
else
{
throw
new
RuntimeException
(
"券码格式错误"
);
return
"验卷成功"
;
}
return
"验卷成功"
;
throw
new
RuntimeException
(
"验劵失败"
)
;
}
@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