Commit ec6b7d76 authored by shiyu's avatar shiyu

定时作业

parent 0dbb0f88
......@@ -5,6 +5,7 @@ import com.wwdz.ch.db.domain.distribution.DistributionOrder;
import com.wwdz.ch.db.dto.request.distribution.DistributionOrderRequestDto;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface DistributionOrderDao {
......@@ -81,6 +82,8 @@ public interface DistributionOrderDao {
List<DistributionOrder> findByPage(DistributionOrderRequestDto dto);
List<DistributionOrder> findList(Date startTime, Date endTime);
/**
* 统计商品卖出数量
* @param itemId
......
......@@ -132,4 +132,15 @@ public class DistributionOrderRequestDto extends BaseRequestDto implements Entit
* 退款接口请求秘钥
*/
private String secret;
private Date startTime;
private Date endTime;
/**
* 订单类型
* 1 一口价
* 2 竞价
*/
private Integer type;
}
......@@ -103,6 +103,19 @@ public class DistributionOrderDaoImpl implements DistributionOrderDao {
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
public Long countSelledNum(long itemId) {
......
......@@ -627,7 +627,11 @@ public class DistributionOrderServiceImpl implements DistributionOrderService {
distributionOrderVo.setPayEndTime(time);
//查询订单利润
DistributorProfit distributorProfit = distributorProfitDao.findByIdOfDistributor(distributionOrder.getDistributionOrderId(), distributionOrder.getSellerId());
distributionOrderVo.setProfit(PriceUtil.convertPriceFenToYuan(distributorProfit.getProfit()));
if (distributorProfit != null) {
distributionOrderVo.setProfit(PriceUtil.convertPriceFenToYuan(distributorProfit.getProfit()));
} else {
distributionOrderVo.setProfit("0");
}
distributionOrderVoList.add(distributionOrderVo);
});
return Result.success(PageSearchResult.of(pageInfo, distributionOrderVoList));
......
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.util.PriceUtil;
import com.wwdz.ch.core.util.RedisUtils;
import com.wwdz.ch.core.util.StringUtil;
import com.wwdz.ch.db.dao.distribution.AuctionConfigDao;
import com.wwdz.ch.db.dao.distribution.AuctionRecordDao;
......@@ -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.service.distribution.DistributionOrderService;
import com.wwdz.ch.wx.service.distribution.SendMsgService;
import com.xxdxxs.utils.DateUtils;
import com.xxdxxs.utils.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
......@@ -25,6 +28,9 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
......@@ -39,6 +45,15 @@ public class AutoSendMsgJob {
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
DistributionOrderService distributionOrderService;
......@@ -60,10 +75,16 @@ public class AutoSendMsgJob {
@Autowired
SendMsgService sendMsgService;
@Autowired
AliSmsSender aliSmsSender;
@Autowired
RedisUtils redisUtils;
/**
* 隔5分钟运行一次
*/
// @Scheduled(fixedDelay = 1000 * 60 * 5)
@Scheduled(fixedDelay = 1000 * 60 * 5)
public void execute() {
RLock lock = redissonClient.getLock(QUANKU_AUTO_SEND_MSG_KEY);
if (!lock.tryLock()) {
......@@ -87,32 +108,102 @@ public class AutoSendMsgJob {
SupplierItem supplierItem = supplierItemDao.findById(itemId);
AuctionRecord lastRecord = auctionRecordDao.findLastedRecord(itemId);
for (long userId : userIds) {
String userOpenId = sendMsgService.getOpenIdByUserId(userId);
if (com.xxdxxs.utils.StringUtils.hasLength(userOpenId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(lastRecord.getPrice()));
auctionOfferNoticeMsg.setOpenId(userOpenId);
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setAuctionEndTime(auctionConfig.getRealEndTime());
sendMsgService.aboutToEndMsg(auctionOfferNoticeMsg);
} else {
logger.info(">>>>> 用户id :{}, 获取openid失败,无法通知参与出价的用户即将截拍的信息 <<<<<", userId);
//发送短信
//检查缓存中是否已有该商品的标识,已有标识该商品已发送过通知
String abortEndKey = QUANKU_ABORT_END_KEY + itemId + ":" + userId;
if (!redisUtils.hasKey(abortEndKey)) {
String userOpenId = sendMsgService.getOpenIdByUserId(userId);
if (com.xxdxxs.utils.StringUtils.hasLength(userOpenId)) {
AuctionOfferNoticeMsg auctionOfferNoticeMsg = new AuctionOfferNoticeMsg();
auctionOfferNoticeMsg.setCurrentPrice(PriceUtil.convertPriceFenToYuan(lastRecord.getPrice()));
auctionOfferNoticeMsg.setOpenId(userOpenId);
auctionOfferNoticeMsg.setItemId(supplierItem.getId());
auctionOfferNoticeMsg.setItemName(supplierItem.getName());
auctionOfferNoticeMsg.setAuctionEndTime(auctionConfig.getRealEndTime());
Result result = sendMsgService.aboutToEndMsg(auctionOfferNoticeMsg);
if (!result.getSuccess()) {
String msg = "您出过价的拍品" + supplierItem.getName() + ",将在1小时内结束,请前往\"换藏小程序\"查看。";
aliSmsSender.sendAuctionWithTemplate(userId, msg);
}
} else {
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) {
logger.error("同步item增量数据到ES error {}", e);
} finally {
if (lock != null && lock.isHeldByCurrentThread()) {
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);
}
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment