package com.zteits.park.job;
import org.apache.commons.lang3.StringUtils;
import com.clouds.common.cache.sys.SysCodeValueCacheUtil;
import com.clouds.common.constants.CodeValKindEnum;
import com.clouds.common.constants.CodeValueEnum;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.zteits.clouds.api.apibase.constants.DataStatusEnum;
import com.zteits.clouds.api.apibase.constants.OrderStateEnum;
import com.zteits.clouds.api.apibase.constants.PsIsOccupyEnum;
import com.zteits.clouds.api.apibase.exception.AppException;
import com.zteits.park.dao.ParkingSharedDao;
import com.zteits.park.domain.TdPParkingShare;
import com.zteits.park.domain.TdPParkingShareExample;
import com.zteits.park.service.sharedparking.oper.SharedParkingJobOperService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
/**
* 共享车位预约,进场,出场相关定时
* .
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: SharedParkingJob
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年4月17日 上午10:09:48
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年4月17日 zhaowg v1.0.0 创建
*/
@Component
public class SharedParkingJob{
private static final Logger logger = LoggerFactory.getLogger(SharedParkingJob.class);
@Autowired
private ParkingSharedDao parkingSharedDao;
@Autowired
private SharedParkingJobOperService sharedParkingJobOperService;
@XxlJob("sharedParkingJob")
public ReturnT execute(String... params) throws Exception {
String param = XxlJobHelper.getJobParam();
if (StringUtils.isNotEmpty(param) && params == null) {
params = param.split(",");
}
log("预订-15分钟内未支付担保费,取消订单");
this.reservationOrderCancelJob();
log("进场-超过最迟入场时间未入场");
this.inParkingOverTimeJob();
log("出场-有出场费用且15分钟内没有支付的,则视为欠费");
this.outParkingNoPayedJob();
return ReturnT.SUCCESS;
}
/**
* 出场-待支付,且距离出场时间超过15分钟没有支付时,修改订单为欠费
*
* 2018年4月17日 zhaowg
*/
private void outParkingNoPayedJob() {
try{
sharedParkingJobOperService.outParkingNoPayedJob();
}catch (Exception e) {
if(e instanceof AppException){
AppException ex = (AppException)e;
log("修改出场未支付订单失败:"+ex.getErrMsg());
}else{
log("修改出场未支付订单失败:"+e.getMessage());
}
e.printStackTrace();
}
}
/**
* 超过最迟进场时间仍未进场的,修改订单为完成,有担保费的不退,没有担保费的,计费,修改订单为欠费
*
* 2018年4月17日 zhaowg
*/
private void inParkingOverTimeJob() {
log("查询超过最迟进场时间仍未进场的共享车位订单");
String allowLastestInParkDuration = SysCodeValueCacheUtil.queryCodeNameByCodeValue(CodeValKindEnum.SHARED_PARKING_COMMON_SET, CodeValueEnum.ALLOW_LASTEST_INPARK_DURATION,(30*60)+"");
Integer allowLastestInParkDurationInt = Integer.valueOf(allowLastestInParkDuration);
log("距离预约入场时间超过:"+allowLastestInParkDurationInt+"秒仍未入场的关闭订单");
//当前时间往前推指定的分钟
Date allowLastestInParkDate = new Date(new Date().getTime()-allowLastestInParkDurationInt*1000);
TdPParkingShareExample example = new TdPParkingShareExample();
example.createCriteria()
.andPsOrderStateEqualTo(OrderStateEnum.PAYED.value())//已经支付完担保费
.andPsPreInTimeLessThan(allowLastestInParkDate)//超过最迟入场时间
.andPsIsOccupyEqualTo(PsIsOccupyEnum.RENT_NO_CAR.getCode())//未进场
.andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());//有效数据
List parkingShares = parkingSharedDao.selectByExample(example );
if(CollectionUtils.isEmpty(parkingShares)){
log("未查询到超过最迟入场时间的订单");
return;
}
log("一共查询到超过最迟入场时间订单条数:"+parkingShares.size());
for (TdPParkingShare tdPParkingShare : parkingShares) {
log("开始修改超过最迟入场时间的订单:"+tdPParkingShare.getPsOrderId());
try{
sharedParkingJobOperService.inParkingOverTimeJob(tdPParkingShare);
}catch (Exception e) {
if(e instanceof AppException){
AppException ex = (AppException)e;
log("修改超过最迟入场时间的订单:"+tdPParkingShare.getPsOrderId()+"失败:"+ex.getErrMsg());
}else{
log("修改超过最迟入场时间的订单:"+tdPParkingShare.getPsOrderId()+"失败:"+e.getMessage());
}
e.printStackTrace();
}
}
}
/**
* 取消预订订单,配合共享车位预订功能,当有担保费,且距离下单时间超过15分钟没有支付时,后台自动取消该订单
*
* 2018年4月17日 zhaowg
*/
private void reservationOrderCancelJob(){
log("查询允许取消的共享车位订单");
String allowCancelDuration = SysCodeValueCacheUtil.queryCodeNameByCodeValue(CodeValKindEnum.SHARED_PARKING_COMMON_SET, CodeValueEnum.ALLOW_CANCEL_DURATION,(30*60)+"");
Long allowCancelTimeInt = Long.valueOf(allowCancelDuration);
log("距离下单时间未超过:"+allowCancelTimeInt+"秒可以取消订单");
//当前时间往前推指定的分钟
Date allowCancelOrderDate = new Date(new Date().getTime()-allowCancelTimeInt*1000);
TdPParkingShareExample example = new TdPParkingShareExample();
example.createCriteria()
.andPsPreActFeeGreaterThan(0L)//担保费大于0
.andPsOrderStateEqualTo(OrderStateEnum.WAIT_PAY.value())//订单状态为待支付
.andPsPreCreateTimeLessThan(allowCancelOrderDate)//距离下单时间已经超过规定时间
.andPsIsOccupyEqualTo(PsIsOccupyEnum.RENT_NO_CAR.getCode())//预订-未进场
.andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());//有效数据
List parkingShares = parkingSharedDao.selectByExample(example );
if(CollectionUtils.isEmpty(parkingShares)){
log("未查询到允许取消的订单");
return;
}
log("一共查询到允许取消订单条数:"+parkingShares.size());
for (TdPParkingShare tdPParkingShare : parkingShares) {
log("开始取消订单:"+tdPParkingShare.getPsOrderId());
try{
sharedParkingJobOperService.reservationOrderCancelJob(tdPParkingShare);
}catch (Exception e) {
if(e instanceof AppException){
AppException ex = (AppException)e;
log("取消订单:"+tdPParkingShare.getPsOrderId()+"失败:"+ex.getErrMsg());
}else{
log("取消订单:"+tdPParkingShare.getPsOrderId()+"失败:"+e.getMessage());
}
e.printStackTrace();
}
}
}
private void log(String msg){
XxlJobHelper.log(msg);
logger.info(msg);
}
}