CouponPushJob.java 8.01 KB
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)为:每天。<br/>
 * 此类会员卡表示用户购买的是每天某个时间段免费(免费时间段字段:valid_start_time-valid_end_time)。<br/>
 * 例如:用户购买了每天的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<String> 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<List<VipNoPushCardCustInfoDTO>> bizResult = vipCardService.queryCouponNoPushInfo(vipPushRequest );
		if(!bizResult.isSuccess()){
			logger(bizResult.getErrMsg());
			return ReturnT.SUCCESS;
		}
		List<VipNoPushCardCustInfoDTO> 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<String,Object> 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);
    }
}