Blame view

zteits-job/src/main/java/com/zteits/job/task/getfreeberths/PublicGetRealFreeBerthsJob.java 6.9 KB
3a404b2a   zhaowg   空闲车位获取和推送
1
2
  package com.zteits.job.task.getfreeberths;
  
9e9e2f3e   zhaowg   空闲车位数更新优化
3
4
5
6
7
8
9
10
11
12
  import java.io.IOException;
  import java.time.Duration;
  import java.time.LocalTime;
  import java.util.ArrayList;
  import java.util.List;
  import java.util.Map;
  import java.util.function.Function;
  import java.util.stream.Collectors;
  import java.util.stream.Stream;
  
3a404b2a   zhaowg   空闲车位获取和推送
13
  import com.alibaba.fastjson.JSON;
3a404b2a   zhaowg   空闲车位获取和推送
14
  import com.clouds.common.cache.park.ParkingLotCacheUtil;
9e9e2f3e   zhaowg   空闲车位数更新优化
15
16
  import com.zteits.clouds.api.apibase.constants.DataStatusEnum;
  import com.zteits.job.task.getfreeberths.base.ThirdFreeBerthServiceRoute;
3a404b2a   zhaowg   空闲车位获取和推送
17
18
19
20
21
22
23
24
25
26
  import com.zteits.job.task.getfreeberths.param.IarinParkInfo;
  import com.zteits.job.task.getfreeberths.param.UpdateFreeByIrainRes;
  import com.zteits.job.util.HttpClientTutorial;
  import org.apache.commons.lang3.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.scheduling.annotation.Scheduled;
  import org.springframework.stereotype.Component;
3a404b2a   zhaowg   空闲车位获取和推送
27
  
9e9e2f3e   zhaowg   空闲车位数更新优化
28
29
30
31
32
33
34
35
36
37
38
  import com.clouds.common.cache.park.ParkFreeBerthsCacheUtil;
  import com.xiaoleilu.hutool.util.CollectionUtil;
  import com.zteits.clouds.api.apibase.constants.SourceTypeEnum;
  import com.zteits.clouds.api.dto.order.parkorder.param.pushfreeberths.PushFreeBerthsChangeRequest;
  import com.zteits.clouds.api.dto.rocketmq.datacollection.freeberths.FreeBerthsChangeMsgVO;
  import com.zteits.job.dao.park.ParkFreeBerthDao;
  import com.zteits.job.dao.park.ParkingLotDao;
  import com.zteits.job.domain.ParkingLot;
  import com.zteits.job.domain.ParkingLotExample;
  import com.zteits.job.task.getfreeberths.param.GetRealFreeBerthsDO;
  import org.springframework.util.CollectionUtils;
3a404b2a   zhaowg   空闲车位获取和推送
39
40
41
  
  /**
   * 调用道闸接口,获取真实的空闲车位数
3a404b2a   zhaowg   空闲车位获取和推送
42
   * .<br/>
9e9e2f3e   zhaowg   空闲车位数更新优化
43
   *
3a404b2a   zhaowg   空闲车位获取和推送
44
   * Copyright: Copyright (c) 2017  zteits
9e9e2f3e   zhaowg   空闲车位数更新优化
45
   *
3a404b2a   zhaowg   空闲车位获取和推送
46
   * @ClassName: GetRealFreeBerthsJob
9e9e2f3e   zhaowg   空闲车位数更新优化
47
   * @Description:
3a404b2a   zhaowg   空闲车位获取和推送
48
49
50
51
52
53
54
55
   * @version: v1.0.0
   * @author: zhaowg
   * @date: 2018511 下午5:47:42
   * Modification History:
   * Date             Author          Version            Description
   *---------------------------------------------------------*
   * 2018511      zhaowg           v1.0.0               创建
   */
9e9e2f3e   zhaowg   空闲车位数更新优化
56
  
3a404b2a   zhaowg   空闲车位获取和推送
57
  @Component
9e9e2f3e   zhaowg   空闲车位数更新优化
58
59
60
61
62
  public class PublicGetRealFreeBerthsJob{
  	private static final Logger logger = LoggerFactory.getLogger(PublicGetRealFreeBerthsJob.class);
  	//艾润北京西城空闲车位接口地址
  	@Value("${irain.bjxc.getfreeberthNum}")
  	private String irainBjxcGetfreeberthNumUrl;
3a404b2a   zhaowg   空闲车位获取和推送
63
64
65
66
  	@Autowired
  	private ParkingLotDao parkingLotDao;
  	@Autowired
  	private ParkFreeBerthDao parkFreeBerthDao;
9e9e2f3e   zhaowg   空闲车位数更新优化
67
  	@Autowired
92f28088   xiejianpeng   空闲车位查询定时任务
68
69
  	private PublicDealFreeBerths publicDealFreeBerths;
  	@Autowired
9e9e2f3e   zhaowg   空闲车位数更新优化
70
      private Map<String,CallThirdQueryFreeBerthService> thirdBerthServiceMap;
92f28088   xiejianpeng   空闲车位查询定时任务
71
  
3a404b2a   zhaowg   空闲车位获取和推送
72
73
74
75
76
77
78
  	/**
  	 * 间隔10秒执行一次
  	 *
  	 * 201854 zhaowg
  	 */
  	@Scheduled(fixedDelay=10000)
  	public void execute(){
9e9e2f3e   zhaowg   空闲车位数更新优化
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  		logger.info("查询道闸的停车场");
  		//数据来源类型:1-艾润;2-路测;3-捷商;4-南泽 ;5-共享车位,6:青岛 7:红门道闸  99:北京诱导bjpgis
  		List<Integer> sourceTypes = Stream.of(1,4,6,7,99).collect(Collectors.toList());
  		ParkingLotExample example = new ParkingLotExample();
  		example.createCriteria().andSourceTypeIn(sourceTypes).andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value());
  		List<ParkingLot> parkingLots = parkingLotDao.selectByExample(example);
  		if(CollectionUtil.isEmpty(parkingLots)){
  			logger.info("没有满足条件的停车场");
  			return;
  		}
  
  		//北京诱导bjpgis单独处理
  		List<ParkingLot> bjpgisParks = parkingLots.stream().filter(item->item.getSourceType().intValue()==99).collect(Collectors.toList());
  		this.dealFreeBerthsForBjpgis(bjpgisParks);
  
  		//其他道闸诱导处理
  		this.dealFreeBerths(parkingLots);
3a404b2a   zhaowg   空闲车位获取和推送
96
97
  	}
  
9e9e2f3e   zhaowg   空闲车位数更新优化
98
99
100
101
102
103
104
105
  	/**
  	 * 北京诱导bjpgis单独处理
  	 * @param bjpgisParks
  	 */
  	private void dealFreeBerthsForBjpgis(List<ParkingLot> bjpgisParks) {
  		if(CollectionUtil.isEmpty(bjpgisParks)){
  			return;
  		}
3a404b2a   zhaowg   空闲车位获取和推送
106
  		if(StringUtils.isBlank(irainBjxcGetfreeberthNumUrl)){
9e9e2f3e   zhaowg   空闲车位数更新优化
107
  			logger.error("北京西城获取空闲车位地址为空");
3a404b2a   zhaowg   空闲车位获取和推送
108
109
110
  			return;
  		}
  		LocalTime beginTime = LocalTime.now();
9e9e2f3e   zhaowg   空闲车位数更新优化
111
  		logger.info("开始调用北京西城艾润空闲车位接口更新空闲车位数。"+beginTime);
3a404b2a   zhaowg   空闲车位获取和推送
112
  		String response = HttpClientTutorial.httpGetRequest(irainBjxcGetfreeberthNumUrl);
9e9e2f3e   zhaowg   空闲车位数更新优化
113
  		logger.info("响应信息为:"+response);
3a404b2a   zhaowg   空闲车位获取和推送
114
115
116
  		if(com.alibaba.dubbo.common.utils.StringUtils.isBlank(response)){
  			return;
  		}
9e9e2f3e   zhaowg   空闲车位数更新优化
117
  		UpdateFreeByIrainRes byIrainRes= JSON.parseObject(response, UpdateFreeByIrainRes.class);
3a404b2a   zhaowg   空闲车位获取和推送
118
119
120
121
122
123
  		if(byIrainRes==null){
  			return;
  		}
  		if(!byIrainRes.getCode().equals("0") || CollectionUtils.isEmpty(byIrainRes.getList())){
  			return;
  		}
9e9e2f3e   zhaowg   空闲车位数更新优化
124
  		Map<String,ParkingLot> map = bjpgisParks.stream().collect(Collectors.toMap(ParkingLot::getPlOutNo, Function.identity(),(key1,key2)->key1));
3a404b2a   zhaowg   空闲车位获取和推送
125
126
127
  		List<FreeBerthsChangeMsgVO> berthsChangeMsgVOs = new ArrayList<>();
  		for (IarinParkInfo iarinParkInfo : byIrainRes.getList()) {
  			String plOutNo = "bjpgis_"+iarinParkInfo.getId();
9e9e2f3e   zhaowg   空闲车位数更新优化
128
129
130
131
  			if(!map.containsKey(plOutNo)){
  				continue;
  			}
  			String plNo = map.get(plOutNo).getPlNo();
3a404b2a   zhaowg   空闲车位获取和推送
132
  			Integer freeBerths = iarinParkInfo.getRemaind();
3a404b2a   zhaowg   空闲车位获取和推送
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  			if(com.alibaba.dubbo.common.utils.StringUtils.isBlank(plNo)){
  				continue;
  			}
  			//判断空闲车位数是否发生变化了
  			Integer oldFreeBerths = ParkFreeBerthsCacheUtil.getFreeBerthsByPlNo(plNo);
  			if(oldFreeBerths.intValue() == freeBerths.intValue()){
  				logger.info(plNo+"-原来空闲车位数:"+oldFreeBerths+"和新空闲车位数相等,无需处理");
  				continue;
  			}
  			//发生空闲车位变化消息
  			//更新缓存
  			FreeBerthsChangeMsgVO berthsChangeMsgVO = ParkFreeBerthsCacheUtil.setFreeBerthsByPlNo(plNo, freeBerths,freeBerths);
  			berthsChangeMsgVOs.add(berthsChangeMsgVO);
  		}
  		PushFreeBerthsChangeRequest freeBerthsChangeMsgVO = new PushFreeBerthsChangeRequest();
  		freeBerthsChangeMsgVO.setBerthsChangeMsgVOs(berthsChangeMsgVOs );
  		freeBerthsChangeMsgVO.setSysCode("DATA-COLLECT");
  		//更新空闲车位数
  		parkFreeBerthDao.updateFreeBerthsByPlNo(freeBerthsChangeMsgVO);
3a404b2a   zhaowg   空闲车位获取和推送
152
  		LocalTime endTime = LocalTime.now();
9e9e2f3e   zhaowg   空闲车位数更新优化
153
154
  		logger.info("调用北京西城艾润空闲车位接口结束,共耗时" + Duration.between(beginTime, endTime).getSeconds());
  
3a404b2a   zhaowg   空闲车位获取和推送
155
156
  	}
  
9e9e2f3e   zhaowg   空闲车位数更新优化
157
  	private void dealFreeBerths(List<ParkingLot> parkingLots) {
9e9e2f3e   zhaowg   空闲车位数更新优化
158
  		for (ParkingLot parkingLotDTO : parkingLots) {
92f28088   xiejianpeng   空闲车位查询定时任务
159
  			publicDealFreeBerths.dealFreeBerths(parkingLotDTO);
3a404b2a   zhaowg   空闲车位获取和推送
160
  		}
3a404b2a   zhaowg   空闲车位获取和推送
161
  	}
9e9e2f3e   zhaowg   空闲车位数更新优化
162
  
3a404b2a   zhaowg   空闲车位获取和推送
163
164
165
166
167
  	/**
  	 * 调用第三方接口查询空闲车位数
  	 * @throws IOException
  	 * 2018511 zhaowg
  	 */
9e9e2f3e   zhaowg   空闲车位数更新优化
168
169
170
171
172
173
174
175
176
  	private GetRealFreeBerthsDO queryFreeBerths(ParkingLot parkingLot){
  		try{
  			/**根据数据来源路由具体的通知服务*/
  			CallThirdQueryFreeBerthService queryThirdBerthInfoService = ThirdFreeBerthServiceRoute
  					.selectThirdBerthService(SourceTypeEnum.getEnumByValue(parkingLot.getSourceType()), thirdBerthServiceMap);
  			/**根据数据来源类型,查询第三方空闲车位数*/
  			return queryThirdBerthInfoService.queryFreeBerths(parkingLot);
  		}catch (Exception e){
  			logger.error("处理错误",e);
3a404b2a   zhaowg   空闲车位获取和推送
177
178
179
  		}
  		return null;
  	}
9e9e2f3e   zhaowg   空闲车位数更新优化
180
  
3a404b2a   zhaowg   空闲车位获取和推送
181
  }