/** * 訂單監控類 * 定時掃描所有待付款訂單,超時自動取消 * Created by huangbaidong * 2017/3/29. */ @Component public class OrderMonitorJob { @Resource private RedisUtil redisUtil; @Resource private BsdOrderService bsdOrderService; @Resource private BsdDFKOrderCacheManager bsdDFKOrderCacheManager; private boolean isLock = false; /** * 待付款訂單定時掃描類 * 定時掃描所有待付款訂單,超時自動取消 */ public void paymentTimeoutScan() { if(!isLock) { //加鎖,防止定時器重復執行, isLock = true; try { List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll(); if (BlankUtil.isNotEmpty(orders)) { List<String> removeIds = new ArrayList<>();//需要移除的訂單 for (BsdDFKOrderCacheEntity order : orders) { if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) { boolean isExpire = false; if (order.isHasPromotion() == 1) { //如果是有促銷規則的訂單,1小時未支付,自動取消訂單 if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) { isExpire = true; } } else { //如果是沒有促銷規則的訂單,24小時未支付,自動取消訂單 if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) { isExpire = true; } } if (isExpire) { //1、自動取消訂單(操作人ID傳0) bsdOrderService.cancel(order.getId(), 0l); //2、記錄過期的訂單,將訂單從緩存中清除 removeIds.add(order.getId().toString()); System.out.println("------>訂單[" + order.getCode() + "]超時未付款自動取消訂單"); } } else { //不是待付款狀態的訂單,記錄從緩存中清除 removeIds.add(order.getId().toString()); } } //將不是待支付狀態的訂單,以及過期的未支付的訂單從緩存中刪除 if (BlankUtil.isNotEmpty(removeIds)) { bsdDFKOrderCacheManager.removeFromCache(removeIds); } } } finally { //運行完后釋放鎖 isLock = false; } } } }
/**
* 訂單監控類
* 定時掃描所有待付款訂單,超時自動取消
* Created by huangbaidong
* 2017/3/29.
*/
@Component
public class OrderMonitorJob {
@Resource
private RedisUtil redisUtil;
@Resource
private BsdOrderService bsdOrderService;
@Resource
private BsdDFKOrderCacheManager bsdDFKOrderCacheManager;
private boolean isLock = false;
/**
* 待付款訂單定時掃描類
* 定時掃描所有待付款訂單,超時自動取消
*/
public void paymentTimeoutScan() {
if(!isLock) {
//加鎖,防止定時器重復執行,
isLock = true;
try {
List<BsdDFKOrderCacheEntity> orders = bsdDFKOrderCacheManager.getAll();
if (BlankUtil.isNotEmpty(orders)) {
List<String> removeIds = new ArrayList<>();//需要移除的訂單
for (BsdDFKOrderCacheEntity order : orders) {
if (Dictionary.ORDER_STATUS_DFK == order.getOrderStatus()) {
boolean isExpire = false;
if (order.isHasPromotion() == 1) {
//如果是有促銷規則的訂單,1小時未支付,自動取消訂單
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasRulePayTimeout) {
isExpire = true;
}
} else {
//如果是沒有促銷規則的訂單,24小時未支付,自動取消訂單
if (System.currentTimeMillis() - order.getOrderTime().getTime() > CommonConstants.hasNotRulePayTimeout) {
isExpire = true;
}
}
if (isExpire) {
//1、自動取消訂單(操作人ID傳0)
bsdOrderService.cancel(order.getId(), 0l);
//2、記錄過期的訂單,將訂單從緩存中清除
removeIds.add(order.getId().toString());
System.out.println("------>訂單[" + order.getCode() + "]超時未付款自動取消訂單");
}
} else {
//不是待付款狀態的訂單,記錄從緩存中清除
removeIds.add(order.getId().toString());
}
}
//將不是待支付狀態的訂單,以及過期的未支付的訂單從緩存中刪除
if (BlankUtil.isNotEmpty(removeIds)) {
bsdDFKOrderCacheManager.removeFromCache(removeIds);
}
}
} finally {
//運行完后釋放鎖
isLock = false;
}
}
}
}