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); } }