ChargerUnDealMsgPushJob.java 9.81 KB
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<String> 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<TpEEmployeeCharge> onlineEmployeeChargeList = tpEEmployeeChargeDao.queryOnlineEmployeeChargeList(request);
    	for (TpEEmployeeCharge employeeCharge : onlineEmployeeChargeList) {
    		PDATokenInfoDTO pdaInfoByToken = PdaTokenCacheUtil.getPDAInfoByToken(employeeCharge.getToken());
    		List<String> parkAreaCodes = pdaInfoByToken.getDutyRosterInfoDTOS().stream().map(item->item.getBerthRangeNo()).collect(Collectors.toList());
//    		try {
//    			//1、入场扫牌
//        		/**未录入车辆*/
//        		List<BerthInfoVO> 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<String> chargerCodes = new HashSet<>();
//    				chargerCodes.add(employeeCharge.getChargerCode());
//    				jpushpda.setChargerCodes(chargerCodes);
//        			jPushService.sendPushPDAMsg(jpushpda);
//        		}
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
    		try {
    			//2、出场结算
        		/**在停车辆*/
        		List<BerthInfoVO> 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<Integer> 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<String> 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<BerthInfoVO> queryBerthsInfoByStatus(BaseInfo baseInfo, List<String> parkAreaCodes, int berthState) {
        QueryBerthByRangeNosRequest queryBerthByRangeNosRequest = new QueryBerthByRangeNosRequest();
        queryBerthByRangeNosRequest.setBaseRequest(baseInfo);
        queryBerthByRangeNosRequest.setBerthState(berthState);
        queryBerthByRangeNosRequest.setParkAreaCodes(parkAreaCodes);
        queryBerthByRangeNosRequest.setSysCode("zteits-park");
        BizResult<List<BerthsDTO>> bizResult = tpPBerthsQueryService.queryBerthInfoByRangeNos(queryBerthByRangeNosRequest );

        List<BerthInfoVO> 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;
    }
}