package com.zteits.park.job; import com.clouds.common.cache.pda.PdaTokenCacheUtil; import com.clouds.common.constants.RedisKeyEnum; import com.clouds.common.constants.TimeConstants; import com.clouds.common.redis.RedisCacheUtil; import com.clouds.common.utils.ResultUtils; import com.google.common.collect.Lists; 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.bean.BaseInfo; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.constants.OrderStateEnum; import com.zteits.clouds.api.apibase.constants.ParkStateEnum; import com.zteits.clouds.api.dto.clouds.param.QueryEmployeeRequest; import com.zteits.clouds.api.dto.park.dto.BerthsDTO; import com.zteits.clouds.api.dto.pay.param.JPushMsgForPDARequest; import com.zteits.clouds.api.dto.pda.dto.PDATokenInfoDTO; import com.zteits.clouds.api.dto.pda.msgpush.PDAMsgTypeEnum; import com.zteits.clouds.api.dto.pda.param.ChargerLoginRequest; import com.zteits.clouds.api.dto.pda.param.QueryBerthByRangeNosRequest; import com.zteits.clouds.api.dto.rocketmq.order.parkorder.pdainout.vo.BerthInfoVO; import com.zteits.clouds.api.service.order.parkorder.query.PubParkOrderQueryService; import com.zteits.clouds.api.service.pay.JPushService; import com.zteits.park.biz.berths.query.TpPBerthsQueryServiceImpl; import com.zteits.park.dao.TpEEmployeeChargeDao; import com.zteits.park.domain.TpEEmployeeCharge; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * * @ClassName: ChargerUnDealMsgPushJob.java * @Description: TODO * @author pingkang * @version V1.0 * @Date 2020年7月23日 下午3:15:28 */ @Component public class ChargerUnDealMsgPushJob{ @Autowired private TpEEmployeeChargeDao tpEEmployeeChargeDao; @Autowired private TpPBerthsQueryServiceImpl tpPBerthsQueryService; @Autowired private JPushService jPushService; @Autowired private RedisCacheUtil redisCacheUtil; @Autowired private PubParkOrderQueryService pubParkOrderQueryService; @XxlJob("ChargerUnDealMsgPushJob") public ReturnT execute(String... params) throws Exception { String param = XxlJobHelper.getJobParam(); if (StringUtils.isNotEmpty(param) && params == null) { params = param.split(","); } QueryEmployeeRequest request = new QueryEmployeeRequest(); request.setChargerType(ChargerLoginRequest.ChargerTypeForPDA); request.setOrgId(10003L); List onlineEmployeeChargeList = tpEEmployeeChargeDao.queryOnlineEmployeeChargeList(request); for (TpEEmployeeCharge employeeCharge : onlineEmployeeChargeList) { PDATokenInfoDTO pdaInfoByToken = PdaTokenCacheUtil.getPDAInfoByToken(employeeCharge.getToken()); List parkAreaCodes = pdaInfoByToken.getDutyRosterInfoDTOS().stream().map(item->item.getBerthRangeNo()).collect(Collectors.toList()); // try { // //1、入场扫牌 // /**未录入车辆*/ // List noInParkberthInfoVOs = queryBerthsInfoByStatus(null, parkAreaCodes,QueryBerthByRangeNosRequest.HaveCarAndNoOrder); // int toDoInParkSize = noInParkberthInfoVOs.size(); // if(toDoInParkSize > 0 && pushInterceptor(employeeCharge.getToken(), PDAMsgTypeEnum.TODO_IN_PARK_TASK, toDoInParkSize)){//推送 // JPushMsgForPDARequest jpushpda = new JPushMsgForPDARequest(); // jpushpda.setPdaMsgTypeEnum(PDAMsgTypeEnum.TODO_IN_PARK_TASK); // jpushpda.setParkState(ParkStateEnum.IN.getValue()); // jpushpda.setSysCode("PARK"); // jpushpda.setTodoParkTaskSize(toDoInParkSize); // Set chargerCodes = new HashSet<>(); // chargerCodes.add(employeeCharge.getChargerCode()); // jpushpda.setChargerCodes(chargerCodes); // jPushService.sendPushPDAMsg(jpushpda); // } // } catch (Exception e) { // e.printStackTrace(); // } try { //2、出场结算 /**在停车辆*/ List berthInfoVOs = queryBerthsInfoByStatus(null, parkAreaCodes,QueryBerthByRangeNosRequest.HaveCarAndOrder); for (BerthInfoVO berthInfoVO : berthInfoVOs) { //如果车主已支付,不再判断是否是0元出场 if(berthInfoVO.isAppIsPayed()){ berthInfoVO.setShowApplyOut(false); }else{ // QueryOutParkFeeByOrderIdRequest orderRequest = new QueryOutParkFeeByOrderIdRequest(); // orderRequest.setSysCode("zteits-park"); // orderRequest.setTerminalSourceEnum(TerminalSourceEnum.PDA); // orderRequest.setOrderId(berthInfoVO.getOrderId()); // BizResult result = pubParkOrderQueryService.queryEqpOrUserOutTypeByOrderId(orderRequest); // if(result.isSuccess() && result.getData().equals(1)){//车主申请离场 // berthInfoVO.setShowApplyOut(true); // }else{ // berthInfoVO.setShowApplyOut(false); // } String zeroPayed = redisCacheUtil.get(RedisKeyEnum.PARK_ZERO_PAY_ORDER_ID.key() + berthInfoVO.getOrderId()); berthInfoVO.setShowApplyOut(false); if(StringUtils.isNotEmpty(zeroPayed)){ berthInfoVO.setShowApplyOut(true); } } } long toDoOutParkSize = berthInfoVOs.stream().filter(e -> (e.isAppIsPayed() || e.isEqpcheckOut() || e.isShowApplyOut())).count(); if(toDoOutParkSize > 0 && pushInterceptor(employeeCharge.getToken(), PDAMsgTypeEnum.TODO_OUT_PARK_TASK, (int)toDoOutParkSize)){//推送 JPushMsgForPDARequest jpushpda = new JPushMsgForPDARequest(); jpushpda.setPdaMsgTypeEnum(PDAMsgTypeEnum.TODO_OUT_PARK_TASK); jpushpda.setParkState(ParkStateEnum.OUT.getValue()); jpushpda.setSysCode("PARK"); jpushpda.setTodoParkTaskSize((int)toDoOutParkSize); Set chargerCodes = new HashSet<>(); chargerCodes.add(employeeCharge.getChargerCode()); jpushpda.setChargerCodes(chargerCodes); jPushService.sendPushPDAMsg(jpushpda); } } catch (Exception e) { e.printStackTrace(); } } return ReturnT.SUCCESS; } /** * 消息推送拦截规则:连续5次推送的待处理任务数相同,则不再推送提醒,除非待处理任务数变化。 * * @param token * @param pdaMsgTypeEnum * @param toDoParkSize * @return */ private boolean pushInterceptor(String token, PDAMsgTypeEnum pdaMsgTypeEnum,Integer toDoParkSize){ String key = token + "_" + pdaMsgTypeEnum.value().toString(); String value = redisCacheUtil.get(key); if(value == null){ redisCacheUtil.put(key,toDoParkSize + "_1", TimeConstants.SECOND_1_HOUR); return Boolean.TRUE; }else{ List vlist = Arrays.asList(value.split("_")); Integer oldToDoParkSize = Integer.parseInt(vlist.get(0).toString()); Integer pushSize = Integer.parseInt(vlist.get(1).toString()); if(!oldToDoParkSize.equals(toDoParkSize)){ redisCacheUtil.put(key, toDoParkSize + "_1", TimeConstants.SECOND_1_HOUR); return Boolean.TRUE; } if(pushSize < 5){ pushSize ++; redisCacheUtil.put(key, toDoParkSize + "_" + pushSize, TimeConstants.SECOND_1_HOUR); return Boolean.TRUE; } return Boolean.FALSE; } } /** * copy from com.zteits.pda.portal.web.pda.CommonService.queryBerthsInfoByStatus * 查询车位信息 * @param baseInfo * @param parkAreaCodes * @return */ public List queryBerthsInfoByStatus(BaseInfo baseInfo, List parkAreaCodes, int berthState) { QueryBerthByRangeNosRequest queryBerthByRangeNosRequest = new QueryBerthByRangeNosRequest(); queryBerthByRangeNosRequest.setBaseRequest(baseInfo); queryBerthByRangeNosRequest.setBerthState(berthState); queryBerthByRangeNosRequest.setParkAreaCodes(parkAreaCodes); queryBerthByRangeNosRequest.setSysCode("zteits-park"); BizResult> bizResult = tpPBerthsQueryService.queryBerthInfoByRangeNos(queryBerthByRangeNosRequest ); List berthInfoVOs = Lists.newArrayList(); ResultUtils.getBizResultData(bizResult).forEach(item->{ BerthInfoVO berthInfoVO = new BerthInfoVO(); BeanUtils.copyProperties(item, berthInfoVO); berthInfoVO.setBerthStatus(berthState+""); berthInfoVO.setEqpcheckOut(false); //判断在停车辆是否已经地磁检测出场 if(berthState == QueryBerthByRangeNosRequest.HaveCarAndOrder){ //判断依据:地磁上报的出场时间大于pda录入的进场时间,则取地磁上报的出场时间,否在取当前时间 add zwg 20180710 if(item.getEqpOutTime()!=null && item.getEqpOutTime().after(item.getPdaInTime())){ berthInfoVO.setEqpcheckOut(true); } } //车主是否已经支付 if((OrderStateEnum.PAYED.value()+"").equals(item.getPayStatus())){ berthInfoVO.setAppIsPayed(true); }else{ berthInfoVO.setAppIsPayed(false); } berthInfoVOs.add(berthInfoVO); }); return berthInfoVOs; } }