|
|
package com.yohoufo.order.service.quartz;
|
|
|
|
|
|
import com.yoho.quartz.annotation.JobType;
|
|
|
import com.yoho.quartz.annotation.MisfiredPolicy;
|
|
|
import com.yoho.quartz.annotation.YhJobDef;
|
|
|
import com.yoho.quartz.domain.JobProcessResult;
|
|
|
import com.yoho.quartz.job.YhJob;
|
|
|
import com.yohobuy.ufo.model.order.common.OrderAttributes;
|
|
|
import com.yohobuy.ufo.model.order.common.OrderStatus;
|
|
|
import com.yohobuy.ufo.model.order.constants.ConfirmDesc;
|
|
|
import com.yohoufo.common.utils.DateUtil;
|
|
|
import com.yohoufo.common.utils.PageHelper;
|
|
|
import com.yohoufo.dal.order.BuyerOrderGoodsMapper;
|
|
|
import com.yohoufo.dal.order.BuyerOrderViewMapper;
|
|
|
import com.yohoufo.dal.order.OrdersPayMapper;
|
|
|
import com.yohoufo.dal.order.SellerOrderGoodsMapper;
|
|
|
import com.yohoufo.dal.order.model.BuyerOrder;
|
|
|
import com.yohoufo.dal.order.model.BuyerOrderGoods;
|
|
|
import com.yohoufo.dal.order.model.OrdersPay;
|
|
|
import com.yohoufo.dal.order.model.SellerOrderGoods;
|
|
|
import com.yohoufo.order.model.dto.DTNode;
|
|
|
import com.yohoufo.order.service.cache.OrderCacheService;
|
|
|
import com.yohoufo.order.service.impl.BuyerOrderCancelService;
|
|
|
import com.yohoufo.order.service.proxy.InBoxFacade;
|
|
|
import com.yohoufo.order.utils.LoggerUtils;
|
|
|
import lombok.experimental.Builder;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* Created by chao.chen on 2019/2/18.
|
|
|
*/
|
|
|
@Service
|
|
|
@YhJobDef(jobName = "PreSaleOrderNoticeScheduler", desc = "卖家的预售商品是否发货处理", cron = "0 0/5 * * * ?",
|
|
|
misfiredPolicy = MisfiredPolicy.SMART_POLICY, jobType = JobType.CRON, jobGroup = "ufo-gateway")
|
|
|
public class PreSaleOrderJob implements YhJob {
|
|
|
|
|
|
private final Logger logger = LoggerUtils.getBuyerOrderLogger();
|
|
|
|
|
|
@Autowired
|
|
|
private BuyerOrderViewMapper buyerOrderViewMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private OrdersPayMapper ordersPayMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private BuyerOrderCancelService buyerOrderCancelService;
|
|
|
|
|
|
@Autowired
|
|
|
private OrderCacheService orderCacheService;
|
|
|
|
|
|
@Autowired
|
|
|
private SellerOrderGoodsMapper sellerOrderGoodsMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private BuyerOrderGoodsMapper buyerOrderGoodsMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private InBoxFacade inBoxFacade;
|
|
|
|
|
|
|
|
|
private static final long CACHE_EXPIRED_TIME = 24*3600L;
|
|
|
|
|
|
@Override
|
|
|
public JobProcessResult process(String s) {
|
|
|
logger.info("in PreSaleOrderJob.process");
|
|
|
final OrderStatus tos = OrderStatus.HAS_PAYED;
|
|
|
Integer status = tos.getCode();
|
|
|
final OrderAttributes toa = OrderAttributes.ADVANCE_SALE;
|
|
|
int oa = toa.getCode();
|
|
|
int cnt = buyerOrderViewMapper.selectAllCntByAttr(status, oa);
|
|
|
|
|
|
if (cnt==0){
|
|
|
return null;
|
|
|
}
|
|
|
final int pageSize = 10;
|
|
|
|
|
|
int pageTotal = PageHelper.getPageTotal(cnt, pageSize);
|
|
|
Integer lastId = null;
|
|
|
|
|
|
List<BuyerOrder> bos;
|
|
|
|
|
|
//TODO 第35天 自动超时取消
|
|
|
|
|
|
// 查询条件 预售 + 支付完成(待卖家发货)+ 支付时间到当前时间的差值在(0,35] 单位:天
|
|
|
|
|
|
//TODO 第31天开始 到34天,通知剩余发货时间
|
|
|
List<BuyerOrder> over35DaysBOs = new ArrayList<>(cnt);
|
|
|
List<BuyerOrderWrapper> from30To34BOs = new ArrayList<>(cnt);
|
|
|
final int currentSencond = DateUtil.getCurrentTimeSecond();
|
|
|
|
|
|
for(int i=0; i<pageTotal; i++){
|
|
|
bos = buyerOrderViewMapper.selectAllByAttr(status, oa, lastId, pageSize);
|
|
|
if (Objects.nonNull(bos)){
|
|
|
Node node = processSub(bos, currentSencond);
|
|
|
over35DaysBOs.addAll(node.over35DaysBOs);
|
|
|
from30To34BOs.addAll(node.from30To34BOs);
|
|
|
lastId = node.lastId;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
for(BuyerOrder needCancelBO : over35DaysBOs){
|
|
|
//TODO 调用自动取消
|
|
|
logger.info("in PreSaleOrderJob cancelForSellerSendOutTimeout BuyerOrder {}", needCancelBO);
|
|
|
buyerOrderCancelService.cancelForSellerSendOutTimeout(needCancelBO.getUid(), needCancelBO.getOrderCode(), 0, null);
|
|
|
}
|
|
|
final String nowDateStr = DateUtil.getOnlyDate(new Date(), DateUtil.yyyyMMdd);
|
|
|
|
|
|
|
|
|
for(BuyerOrderWrapper needNoticBO : from30To34BOs){
|
|
|
BuyerOrder bo = needNoticBO.buyerOrder;
|
|
|
//TODO 查Redis 是否存在,没有->计算剩余时间 发消息, 存Redis;
|
|
|
logger.info("in PreSaleOrderJob notice Seller deliver date is closed dead time, BuyerOrder {}", bo);
|
|
|
Long orderCode = bo.getOrderCode() ;
|
|
|
Integer times = orderCacheService.getOrderDeliverNoticeTimes(orderCode, nowDateStr);
|
|
|
if (times==null){
|
|
|
//todo 发送通知
|
|
|
int leftTime = 35*3600 - needNoticBO.diffSeconds;
|
|
|
DTNode node = DTNode.calBySeconds(leftTime);
|
|
|
//todo 35天走配置
|
|
|
int leftHours = node.days * 24 + node.hours + node.minutes/30;
|
|
|
BuyerOrderGoods bog = buyerOrderGoodsMapper.selectOnlyByOrderCode(orderCode);
|
|
|
SellerOrderGoods sog = sellerOrderGoodsMapper.selectByPrimaryKey(bog.getSkup());
|
|
|
inBoxFacade.sellerDeliverNotice(sog, orderCode, 2, leftHours);
|
|
|
times = 1;
|
|
|
orderCacheService.cacheOrderDeliverNoticeTimes(orderCode, nowDateStr, times, CACHE_EXPIRED_TIME);
|
|
|
}else{
|
|
|
logger.info("has send deliver notice , orderCode {} nowDateStr {}", orderCode, nowDateStr);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
|
|
|
static final int secondsOf35Days = secondsOfDays(35), secondsOf31Days = secondsOfDays(31);
|
|
|
|
|
|
Node processSub(List<BuyerOrder> bos, int currentSencond){
|
|
|
BuyerOrder lastBO = null;
|
|
|
Node node = new Node(bos.size());
|
|
|
List<BuyerOrder> over35DaysBOs = node.over35DaysBOs;
|
|
|
List<BuyerOrderWrapper> from30To34BOs = node.from30To34BOs;
|
|
|
if (Objects.nonNull(lastBO=bos.get(bos.size()-1))){
|
|
|
node.lastId = lastBO.getId();
|
|
|
}
|
|
|
|
|
|
Map<Long, BuyerOrder> orderCodes2BoMap = bos.parallelStream()
|
|
|
.collect(Collectors.toMap(BuyerOrder::getOrderCode, Function.identity()));
|
|
|
List<OrdersPay> ops = ordersPayMapper.selectAllByOrderCodes(orderCodes2BoMap.keySet());
|
|
|
for(OrdersPay op : ops){
|
|
|
Integer payTime = op.getCreateTime();
|
|
|
int diff = currentSencond-payTime;
|
|
|
//超过35天
|
|
|
if (diff>=secondsOf35Days){
|
|
|
over35DaysBOs.add(orderCodes2BoMap.get(op.getOrderCode()));
|
|
|
}else {
|
|
|
//超过30天(第31天),不到35天
|
|
|
if (diff>=secondsOf31Days) {
|
|
|
BuyerOrder buyerOrder = orderCodes2BoMap.get(op.getOrderCode());
|
|
|
BuyerOrderWrapper bow = BuyerOrderWrapper.builder().buyerOrder(buyerOrder)
|
|
|
.diffSeconds(diff).build();
|
|
|
from30To34BOs.add(bow);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return node;
|
|
|
}
|
|
|
|
|
|
@Builder
|
|
|
private static class BuyerOrderWrapper{
|
|
|
BuyerOrder buyerOrder;
|
|
|
int diffSeconds;
|
|
|
}
|
|
|
|
|
|
private static class Node{
|
|
|
Integer lastId;
|
|
|
List<BuyerOrder> over35DaysBOs ;
|
|
|
List<BuyerOrderWrapper> from30To34BOs ;
|
|
|
Node(int cnt){
|
|
|
over35DaysBOs = new ArrayList<>(cnt);
|
|
|
from30To34BOs = new ArrayList<>(cnt);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private static int secondsOfDays(int days){
|
|
|
return days * 24 * 3600;
|
|
|
}
|
|
|
} |
...
|
...
|
|