package com.zteits.pay.job;
import java.util.*;
import com.clouds.common.config.IrainConfigure;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.clouds.common.cache.park.IRainPkNoRelationCacheUtil;
import com.clouds.common.utils.DateUtil;
import com.clouds.common.utils.ExceptionUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.constants.BasicEnum;
import com.zteits.clouds.api.dto.bill.billingrule.param.SaveCouponPushLogReq;
import com.zteits.clouds.api.dto.bill.vipcard.VipNoPushCardCustInfoDTO;
import com.zteits.clouds.api.dto.bill.vipcard.param.VipPushRequest;
import com.zteits.clouds.api.service.bill.coupon.CouponPushLogService;
import com.zteits.clouds.api.service.bill.vipcard.VipCardService;
import com.zteits.pay.util.HttpClientTutorial;
/**
* 需求描述:
* 会员卡(t_vip_card)特征日标识(special_day_type)为:每天。
* 此类会员卡表示用户购买的是每天某个时间段免费(免费时间段字段:valid_start_time-valid_end_time)。
* 例如:用户购买了每天的8:00:00-18:00:00免费的会员卡,如果今天该车辆限行,该用户今天停一天是不应该收费的。
* 和艾润协商的结果是:在前一天给该车辆下发个优惠券,表示今天一天不收费。
*
* Copyright: Copyright (c) 2017 zteits
*
* @ClassName: CouponPushJob
* @Description:
* @version: v1.0.0
* @author: zhaowg
* @date: 2018年3月30日 下午4:15:19
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2018年3月30日 zhaowg v1.0.0 创建
*/
@Component
public class CouponPushJob {
private static final Logger logger = LoggerFactory.getLogger(CouponPushJob.class);
@Autowired
private VipCardService vipCardService;
@Autowired
private CouponPushLogService couponPushLogService;
@XxlJob(value="CouponPushJob")
public ReturnT execute(String... params) throws Exception {
String param = XxlJobHelper.getJobParam();
if (StringUtils.isNotEmpty(param) && params == null) {
params = param.split(",");
}
logger("开始执行需要推送优惠券JOB");
//1-今天;2-明天
String type = "2";
if (null != params && params.length > 0) {
type = params[0];
}
Date date = null;
if("1".equals(type)){
date = new Date();
}else{
//明天
Calendar ca = Calendar.getInstance();
ca.add(Calendar.DAY_OF_YEAR, 1);
date = ca.getTime();
}
logger.info("查询日期:"+DateUtil.getDateString(date, DateUtil.DATETIME_FORMAT));
VipPushRequest vipPushRequest = new VipPushRequest();
vipPushRequest.setSysCode(BasicEnum.SYS_CODE.getValue());
vipPushRequest.setPushDate(date);
BizResult> bizResult = vipCardService.queryCouponNoPushInfo(vipPushRequest );
if(!bizResult.isSuccess()){
logger(bizResult.getErrMsg());
return ReturnT.SUCCESS;
}
List cardCustInfoDTOs = bizResult.getData();
if(CollectionUtils.isEmpty(cardCustInfoDTOs)){
logger("没有需要推送优惠券的车辆信息");
return ReturnT.SUCCESS;
}
logger("查询到需要推送的优惠券车辆信息条数为:"+cardCustInfoDTOs.size());
for (int i = 0; i < cardCustInfoDTOs.size(); i++) {
VipNoPushCardCustInfoDTO cardCustInfoDTO = cardCustInfoDTOs.get(i);
logger("开始推送第"+i+"条:"+cardCustInfoDTO.getCarNumber()+","+cardCustInfoDTO.getPlNo());
this.pushCoupon(cardCustInfoDTO.getCarNumber(),cardCustInfoDTO.getPlNo(),cardCustInfoDTO.getId(),type);
}
return ReturnT.SUCCESS;
}
/**
* 推送优惠券给艾润
* @param carNumber
* @param plNo
* 2018年4月2日 zhaowg
*/
private void pushCoupon(String carNumber, String plNo,Long cardParkCustRelId,String type) {
Map param = new HashMap<>();
IrainConfigure.irainRequestParams(param);
String serialnumber = UUID.randomUUID().toString();
param.put("serial_number", serialnumber);
param.put("vpl_number", carNumber);
String irainPlNo = IRainPkNoRelationCacheUtil.getIRainPayPkNoByPlNo(plNo);
param.put("park_code",irainPlNo );
//优惠券类型:0小时,1金额 2次数 3时间段优惠
int couponType = 3;
param.put("coupon_type", couponType);
//优惠券值:0时长(分钟),2次数 3钱数(分)
int couponValue = 0;
param.put("coupon_value",couponValue);
//开始时间
Integer addDay = "1".equals(type)?0:1;
Calendar start_calendar = Calendar.getInstance();
start_calendar.add(Calendar.DAY_OF_YEAR, addDay); //明天
start_calendar.set(Calendar.HOUR_OF_DAY, 0);
start_calendar.set(Calendar.MINUTE, 0);
start_calendar.set(Calendar.SECOND, 0);
Date startTime = start_calendar.getTime();
param.put("time_start",startTime.getTime()/1000);
//结束时间
Calendar end_calendar = Calendar.getInstance();
end_calendar.add(Calendar.DAY_OF_YEAR, addDay); //明天
end_calendar.set(Calendar.HOUR_OF_DAY, 23);
end_calendar.set(Calendar.MINUTE, 59);
end_calendar.set(Calendar.SECOND, 59);
Date endTime = end_calendar.getTime();
param.put("time_end", endTime.getTime()/1000);
//开始调用艾润接口推送
String rs = "";
//推送状态 1:推送成功 -1:推送失败
String pushState = "-1";
SaveCouponPushLogReq req = new SaveCouponPushLogReq();
req.setCardParkCustRelId(cardParkCustRelId);
req.setCarNumber(carNumber);
req.setCouponType(couponType+"");
req.setCouponValue(couponValue+"");
req.setPlNo(plNo);
req.setSerialNumber(serialnumber);
req.setTimeStart(startTime);
req.setTimeEnd(endTime);
logger("优惠券通知请求信息:"+JSONObject.toJSONString(param));
try{
for (int i = 0; i < 3; i++) {
if (StringUtils.isBlank(rs)) {
rs = HttpClientTutorial.httpPostRequest(IrainConfigure.getIrain_url() + "/coupon/Issued",param);
}else{
break;
}
}
req.setResponseMsg(rs);
logger("优惠券通知艾润返回信息为:"+rs);
if(StringUtils.isBlank(rs)){
logger("艾润返回数据为空");
req.setPushState(-1);
return;
}
JSONObject jsobj = JSONObject.parseObject(rs);
//0:失败,1:成功
if (!jsobj.get("status").toString().equals("0")) {
//成功
pushState = "1";
logger("该车牌:"+carNumber+",艾润停车场:"+irainPlNo+"下发成功");
//获取优惠券id
String coupon_id = jsobj.getJSONObject("data").getString("coupon_id");
req.setOutCouponId(coupon_id);
}else{
//失败
pushState = "-1";
logger("该车牌:"+carNumber+",艾润停车场:"+irainPlNo+"下发失败");
}
req.setPushState(Integer.valueOf(pushState));
}catch(Exception e){
req.setPushState(-1);
req.setResponseMsg(ExceptionUtil.getTrace(e));
}finally{
//记录日志
try{
req.setSysCode(BasicEnum.SYS_CODE.getValue());
couponPushLogService.insertCouponPushLog(req);
}catch (Exception e) {
logger("日志记录失败");
}
}
}
private void logger(String msg){
XxlJobHelper.log(msg);
logger.info(msg);
}
}