Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Q
qk_backend
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
quanku
qk_backend
Commits
ec6b7d76
Commit
ec6b7d76
authored
Mar 13, 2024
by
shiyu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
定时作业
parent
0dbb0f88
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
138 additions
and
16 deletions
+138
-16
ch-dao/src/main/java/com/wwdz/ch/db/dao/distribution/DistributionOrderDao.java
...com/wwdz/ch/db/dao/distribution/DistributionOrderDao.java
+3
-0
ch-dao/src/main/java/com/wwdz/ch/db/dto/request/distribution/DistributionOrderRequestDto.java
...dto/request/distribution/DistributionOrderRequestDto.java
+11
-0
ch-dao/src/main/java/com/wwdz/ch/db/impl/distribution/DistributionOrderDaoImpl.java
...wdz/ch/db/impl/distribution/DistributionOrderDaoImpl.java
+13
-0
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/distribution/DistributionOrderServiceImpl.java
...ch/wx/impl/distribution/DistributionOrderServiceImpl.java
+5
-1
ch-wx-api/src/main/java/com/wwdz/ch/wx/job/AutoSendMsgJob.java
...-api/src/main/java/com/wwdz/ch/wx/job/AutoSendMsgJob.java
+106
-15
No files found.
ch-dao/src/main/java/com/wwdz/ch/db/dao/distribution/DistributionOrderDao.java
View file @
ec6b7d76
...
@@ -5,6 +5,7 @@ import com.wwdz.ch.db.domain.distribution.DistributionOrder;
...
@@ -5,6 +5,7 @@ import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import
com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto
;
import
com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
public
interface
DistributionOrderDao
{
public
interface
DistributionOrderDao
{
...
@@ -81,6 +82,8 @@ public interface DistributionOrderDao {
...
@@ -81,6 +82,8 @@ public interface DistributionOrderDao {
List
<
DistributionOrder
>
findByPage
(
DistributionOrderRequestDto
dto
);
List
<
DistributionOrder
>
findByPage
(
DistributionOrderRequestDto
dto
);
List
<
DistributionOrder
>
findList
(
Date
startTime
,
Date
endTime
);
/**
/**
* 统计商品卖出数量
* 统计商品卖出数量
* @param itemId
* @param itemId
...
...
ch-dao/src/main/java/com/wwdz/ch/db/dto/request/distribution/DistributionOrderRequestDto.java
View file @
ec6b7d76
...
@@ -132,4 +132,15 @@ public class DistributionOrderRequestDto extends BaseRequestDto implements Entit
...
@@ -132,4 +132,15 @@ public class DistributionOrderRequestDto extends BaseRequestDto implements Entit
* 退款接口请求秘钥
* 退款接口请求秘钥
*/
*/
private
String
secret
;
private
String
secret
;
private
Date
startTime
;
private
Date
endTime
;
/**
* 订单类型
* 1 一口价
* 2 竞价
*/
private
Integer
type
;
}
}
ch-dao/src/main/java/com/wwdz/ch/db/impl/distribution/DistributionOrderDaoImpl.java
View file @
ec6b7d76
...
@@ -103,6 +103,19 @@ public class DistributionOrderDaoImpl implements DistributionOrderDao {
...
@@ -103,6 +103,19 @@ public class DistributionOrderDaoImpl implements DistributionOrderDao {
return
distributionOrderMapper
.
selectByExample
(
example
);
return
distributionOrderMapper
.
selectByExample
(
example
);
}
}
@Override
public
List
<
DistributionOrder
>
findList
(
Date
startTime
,
Date
endTime
)
{
DistributionOrderExample
example
=
new
DistributionOrderExample
();
DistributionOrderExample
.
Criteria
criteria
=
example
.
createCriteria
();
//竞拍
criteria
.
andTypeEqualTo
(
2
);
//待付款
criteria
.
andStateEqualTo
(
1
);
criteria
.
andCreateTimeGreaterThanOrEqualTo
(
startTime
);
criteria
.
andCreateTimeLessThanOrEqualTo
(
endTime
);
criteria
.
andPayTimeIsNull
();
return
distributionOrderMapper
.
selectByExample
(
example
);
}
@Override
@Override
public
Long
countSelledNum
(
long
itemId
)
{
public
Long
countSelledNum
(
long
itemId
)
{
...
...
ch-wx-api/src/main/java/com/wwdz/ch/wx/impl/distribution/DistributionOrderServiceImpl.java
View file @
ec6b7d76
...
@@ -627,7 +627,11 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
...
@@ -627,7 +627,11 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
distributionOrderVo
.
setPayEndTime
(
time
);
distributionOrderVo
.
setPayEndTime
(
time
);
//查询订单利润
//查询订单利润
DistributorProfit
distributorProfit
=
distributorProfitDao
.
findByIdOfDistributor
(
distributionOrder
.
getDistributionOrderId
(),
distributionOrder
.
getSellerId
());
DistributorProfit
distributorProfit
=
distributorProfitDao
.
findByIdOfDistributor
(
distributionOrder
.
getDistributionOrderId
(),
distributionOrder
.
getSellerId
());
if
(
distributorProfit
!=
null
)
{
distributionOrderVo
.
setProfit
(
PriceUtil
.
convertPriceFenToYuan
(
distributorProfit
.
getProfit
()));
distributionOrderVo
.
setProfit
(
PriceUtil
.
convertPriceFenToYuan
(
distributorProfit
.
getProfit
()));
}
else
{
distributionOrderVo
.
setProfit
(
"0"
);
}
distributionOrderVoList
.
add
(
distributionOrderVo
);
distributionOrderVoList
.
add
(
distributionOrderVo
);
});
});
return
Result
.
success
(
PageSearchResult
.
of
(
pageInfo
,
distributionOrderVoList
));
return
Result
.
success
(
PageSearchResult
.
of
(
pageInfo
,
distributionOrderVoList
));
...
...
ch-wx-api/src/main/java/com/wwdz/ch/wx/job/AutoSendMsgJob.java
View file @
ec6b7d76
package
com.wwdz.ch.wx.job
;
package
com.wwdz.ch.wx.job
;
import
com.wwdz.ch.core.notify.AliSmsSender
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.core.type.Result
;
import
com.wwdz.ch.core.util.PriceUtil
;
import
com.wwdz.ch.core.util.PriceUtil
;
import
com.wwdz.ch.core.util.RedisUtils
;
import
com.wwdz.ch.core.util.StringUtil
;
import
com.wwdz.ch.core.util.StringUtil
;
import
com.wwdz.ch.db.dao.distribution.AuctionConfigDao
;
import
com.wwdz.ch.db.dao.distribution.AuctionConfigDao
;
import
com.wwdz.ch.db.dao.distribution.AuctionRecordDao
;
import
com.wwdz.ch.db.dao.distribution.AuctionRecordDao
;
...
@@ -15,6 +17,7 @@ import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
...
@@ -15,6 +17,7 @@ import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import
com.wwdz.ch.wx.entity.AuctionOfferNoticeMsg
;
import
com.wwdz.ch.wx.entity.AuctionOfferNoticeMsg
;
import
com.wwdz.ch.wx.service.distribution.DistributionOrderService
;
import
com.wwdz.ch.wx.service.distribution.DistributionOrderService
;
import
com.wwdz.ch.wx.service.distribution.SendMsgService
;
import
com.wwdz.ch.wx.service.distribution.SendMsgService
;
import
com.xxdxxs.utils.DateUtils
;
import
com.xxdxxs.utils.StringUtils
;
import
com.xxdxxs.utils.StringUtils
;
import
org.redisson.api.RLock
;
import
org.redisson.api.RLock
;
import
org.redisson.api.RedissonClient
;
import
org.redisson.api.RedissonClient
;
...
@@ -25,6 +28,9 @@ import org.springframework.scheduling.annotation.Scheduled;
...
@@ -25,6 +28,9 @@ import org.springframework.scheduling.annotation.Scheduled;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
java.time.Duration
;
import
java.time.Instant
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
...
@@ -39,6 +45,15 @@ public class AutoSendMsgJob {
...
@@ -39,6 +45,15 @@ public class AutoSendMsgJob {
private
final
static
String
QUANKU_AUTO_SEND_MSG_KEY
=
"QUANKU_AUTO_SEND_MSG_KEY"
;
private
final
static
String
QUANKU_AUTO_SEND_MSG_KEY
=
"QUANKU_AUTO_SEND_MSG_KEY"
;
//即将截拍提醒,标识key
private
final
static
String
QUANKU_ABORT_END_KEY
=
"QUANKU_ABORT_END_KEY:"
;
//12小时后未付款提醒,标识key
private
final
static
String
QUANKU_NOT_PAY_FIRST_KEY
=
"QUANKU_NOT_PAY_FIRST_KEY:"
;
//23小时后未付款提醒,标识key
private
final
static
String
QUANKU_NOT_PAY_SECOND_KEY
=
"QUANKU_NOT_PAY_SECOND_KEY:"
;
@Autowired
@Autowired
DistributionOrderService
distributionOrderService
;
DistributionOrderService
distributionOrderService
;
...
@@ -60,10 +75,16 @@ public class AutoSendMsgJob {
...
@@ -60,10 +75,16 @@ public class AutoSendMsgJob {
@Autowired
@Autowired
SendMsgService
sendMsgService
;
SendMsgService
sendMsgService
;
@Autowired
AliSmsSender
aliSmsSender
;
@Autowired
RedisUtils
redisUtils
;
/**
/**
* 隔5分钟运行一次
* 隔5分钟运行一次
*/
*/
//
@Scheduled(fixedDelay = 1000 * 60 * 5)
@Scheduled
(
fixedDelay
=
1000
*
60
*
5
)
public
void
execute
()
{
public
void
execute
()
{
RLock
lock
=
redissonClient
.
getLock
(
QUANKU_AUTO_SEND_MSG_KEY
);
RLock
lock
=
redissonClient
.
getLock
(
QUANKU_AUTO_SEND_MSG_KEY
);
if
(!
lock
.
tryLock
())
{
if
(!
lock
.
tryLock
())
{
...
@@ -87,6 +108,9 @@ public class AutoSendMsgJob {
...
@@ -87,6 +108,9 @@ public class AutoSendMsgJob {
SupplierItem
supplierItem
=
supplierItemDao
.
findById
(
itemId
);
SupplierItem
supplierItem
=
supplierItemDao
.
findById
(
itemId
);
AuctionRecord
lastRecord
=
auctionRecordDao
.
findLastedRecord
(
itemId
);
AuctionRecord
lastRecord
=
auctionRecordDao
.
findLastedRecord
(
itemId
);
for
(
long
userId
:
userIds
)
{
for
(
long
userId
:
userIds
)
{
//检查缓存中是否已有该商品的标识,已有标识该商品已发送过通知
String
abortEndKey
=
QUANKU_ABORT_END_KEY
+
itemId
+
":"
+
userId
;
if
(!
redisUtils
.
hasKey
(
abortEndKey
))
{
String
userOpenId
=
sendMsgService
.
getOpenIdByUserId
(
userId
);
String
userOpenId
=
sendMsgService
.
getOpenIdByUserId
(
userId
);
if
(
com
.
xxdxxs
.
utils
.
StringUtils
.
hasLength
(
userOpenId
))
{
if
(
com
.
xxdxxs
.
utils
.
StringUtils
.
hasLength
(
userOpenId
))
{
AuctionOfferNoticeMsg
auctionOfferNoticeMsg
=
new
AuctionOfferNoticeMsg
();
AuctionOfferNoticeMsg
auctionOfferNoticeMsg
=
new
AuctionOfferNoticeMsg
();
...
@@ -95,24 +119,91 @@ public class AutoSendMsgJob {
...
@@ -95,24 +119,91 @@ public class AutoSendMsgJob {
auctionOfferNoticeMsg
.
setItemId
(
supplierItem
.
getId
());
auctionOfferNoticeMsg
.
setItemId
(
supplierItem
.
getId
());
auctionOfferNoticeMsg
.
setItemName
(
supplierItem
.
getName
());
auctionOfferNoticeMsg
.
setItemName
(
supplierItem
.
getName
());
auctionOfferNoticeMsg
.
setAuctionEndTime
(
auctionConfig
.
getRealEndTime
());
auctionOfferNoticeMsg
.
setAuctionEndTime
(
auctionConfig
.
getRealEndTime
());
sendMsgService
.
aboutToEndMsg
(
auctionOfferNoticeMsg
);
Result
result
=
sendMsgService
.
aboutToEndMsg
(
auctionOfferNoticeMsg
);
if
(!
result
.
getSuccess
())
{
String
msg
=
"您出过价的拍品"
+
supplierItem
.
getName
()
+
",将在1小时内结束,请前往\"换藏小程序\"查看。"
;
aliSmsSender
.
sendAuctionWithTemplate
(
userId
,
msg
);
}
}
else
{
}
else
{
logger
.
info
(
">>>>> 用户id :{}, 获取openid失败,无法通知参与出价的用户即将截拍的信息 <<<<<"
,
userId
);
String
msg
=
"您出过价的拍品"
+
supplierItem
.
getName
()
+
",将在1小时内结束,请前往\"换藏小程序\"查看。"
;
//发送短信
aliSmsSender
.
sendAuctionWithTemplate
(
userId
,
msg
);
logger
.
info
(
"================商品id:{}, 将在1小时内结束,提醒短信发送成功 =============="
,
supplierItem
.
getId
());
}
redisUtils
.
set
(
abortEndKey
,
itemId
,
3600
);
}
}
}
}
}
}
});
});
//
//处理生成订单后12小时后没有付款的订单
Date
now
=
new
Date
();
Instant
startInstant
=
now
.
toInstant
().
minus
(
Duration
.
ofHours
(
13
));
Date
startTime
=
Date
.
from
(
startInstant
);
Instant
endInstant
=
startTime
.
toInstant
().
plus
(
Duration
.
ofHours
(
1
));
Date
endTime
=
Date
.
from
(
endInstant
);
handleNotPayOrderList
(
startTime
,
endTime
,
1
);
//查询生成订单后23小时后没有付款的订单
Instant
secondStartInstant
=
now
.
toInstant
().
minus
(
Duration
.
ofHours
(
24
));
Date
secondStartTime
=
Date
.
from
(
secondStartInstant
);
Instant
secondEndInstant
=
secondStartTime
.
toInstant
().
plus
(
Duration
.
ofHours
(
1
));
Date
secondEndTime
=
Date
.
from
(
secondEndInstant
);
handleNotPayOrderList
(
secondStartTime
,
secondEndTime
,
2
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
logger
.
error
(
"同步item增量数据到ES error {}"
,
e
);
logger
.
error
(
"同步item增量数据到ES error {}"
,
e
);
}
finally
{
}
finally
{
if
(
lock
!=
null
&&
lock
.
isHeldByCurrentThread
())
{
if
(
lock
!=
null
&&
lock
.
isHeldByCurrentThread
())
{
lock
.
unlock
();
lock
.
unlock
();
logger
.
info
(
"======================== 线程id: {} ,
检测截拍的商品,自动创建订单
执行结束, 释放锁成功 ========================"
,
Thread
.
currentThread
().
getId
());
logger
.
info
(
"======================== 线程id: {} ,
自动发送拍卖通知任务
执行结束, 释放锁成功 ========================"
,
Thread
.
currentThread
().
getId
());
}
}
}
}
}
}
/**
* 催未付款的用户
* @param startTime
* @param endTime
*/
private
void
handleNotPayOrderList
(
Date
startTime
,
Date
endTime
,
int
num
)
{
logger
.
info
(
">>>>> 未付款订单查询时间范围: {} 至 {} <<<<<"
,
DateUtils
.
toString
(
startTime
),
DateUtils
.
toString
(
endTime
));
List
<
DistributionOrder
>
distributionOrderList
=
distributionOrderDao
.
findList
(
startTime
,
endTime
);
for
(
DistributionOrder
distributionOrder
:
distributionOrderList
)
{
//检查缓存中是否有标识,有则表示已经发送过对应消息
String
key
=
null
;
if
(
num
==
1
)
{
key
=
QUANKU_NOT_PAY_FIRST_KEY
+
distributionOrder
.
getDistributionOrderId
();
}
else
{
key
=
QUANKU_NOT_PAY_SECOND_KEY
+
distributionOrder
.
getDistributionOrderId
();
}
if
(!
redisUtils
.
hasKey
(
key
))
{
Instant
instant
=
distributionOrder
.
getCreateTime
().
toInstant
().
plus
(
Duration
.
ofHours
(
24
));
Date
payEndTime
=
Date
.
from
(
instant
);
SupplierItem
supplierItem
=
supplierItemDao
.
findById
(
distributionOrder
.
getItemId
());
long
userId
=
distributionOrder
.
getBuyerId
();
String
userOpenId
=
sendMsgService
.
getOpenIdByUserId
(
userId
);
if
(
com
.
xxdxxs
.
utils
.
StringUtils
.
hasLength
(
userOpenId
))
{
AuctionOfferNoticeMsg
auctionOfferNoticeMsg
=
new
AuctionOfferNoticeMsg
();
auctionOfferNoticeMsg
.
setCurrentPrice
(
PriceUtil
.
convertPriceFenToYuan
(
distributionOrder
.
getAmount
()));
auctionOfferNoticeMsg
.
setOpenId
(
userOpenId
);
auctionOfferNoticeMsg
.
setItemId
(
supplierItem
.
getId
());
auctionOfferNoticeMsg
.
setItemName
(
supplierItem
.
getName
());
auctionOfferNoticeMsg
.
setPayEndTime
(
payEndTime
);
Result
result
=
sendMsgService
.
prePayMsg
(
auctionOfferNoticeMsg
);
if
(!
result
.
getSuccess
())
{
//发短信
String
msg
=
"您已中拍"
+
supplierItem
.
getName
()
+
",成交价是"
+
PriceUtil
.
convertPriceFenToYuan
(
distributionOrder
.
getAmount
())
+
"元,请在"
+
DateUtils
.
toString
(
payEndTime
)
+
"前完成付款,请前往\"换藏小程序\"查看。"
;
aliSmsSender
.
sendAuctionWithTemplate
(
userId
,
msg
);
}
}
else
{
String
msg
=
"您已中拍"
+
supplierItem
.
getName
()
+
",成交价是"
+
PriceUtil
.
convertPriceFenToYuan
(
distributionOrder
.
getAmount
())
+
"元,请在"
+
DateUtils
.
toString
(
payEndTime
)
+
"前完成付款,请前往\"换藏小程序\"查看。"
;
aliSmsSender
.
sendAuctionWithTemplate
(
userId
,
msg
);
logger
.
info
(
"================订单号:{}, 催付款短信通知发送成功 =============="
,
distributionOrder
.
getDistributionOrderId
());
}
redisUtils
.
set
(
key
,
distributionOrder
.
getDistributionOrderId
(),
3600
*
24
);
}
}
}
}
}
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