package com.zteits.park.job; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.clouds.common.cache.park.ParkingLotGeoCacheUtil; import com.clouds.common.utils.ListPageHelper; 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.constants.LonLatTypeEnum; import com.zteits.park.dao.InParkLogDao; import com.zteits.park.dao.ParkingLotDao; import com.zteits.park.dao.ParkinglotHeatmapHourDao; import com.zteits.park.domain.InparkLogCountDO; import com.zteits.park.domain.ParkingLotAndGeoDO; import com.zteits.park.domain.ParkinglotHeatmapHour; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.Map.Entry; /** * 企业云平台-->停车热力分布图-->按照小时.
* * Copyright: Copyright (c) 2017 zteits * * @ClassName: ParkingLotHeatMapHourJob.java * @Description: * @version: v1.0.0 * @author: wangfs * @date: 2017年7月10日 下午5:24:36 * Modification History: * Date Author Version Description *---------------------------------------------------------* * 2017年7月10日 wangfs v1.0.0 创建 */ @Component public class ParkingLotHeatMapHourJob{ private static final Logger logger = LoggerFactory.getLogger(ParkingLotHeatMapHourJob.class); @Autowired private ParkingLotDao parkingLotDao; @Autowired private InParkLogDao inParkLogDao; @Autowired private ParkinglotHeatmapHourDao parkinglotHeatmapHourDao; /**停车场热力分布查询范围 200米.*/ private static final String DISTANCE = "200"; /** * 企业云平台-->停车热力分布图-->按照小时.
* 描述:1.每间隔2小时跑一次(0,2,4,6,8...24点跑job)即:0 0,2,4,6,8,10,12,14,16,18,20,22 * * * ? *。 * 2.统计2小时中200米内各个停车场进场车辆的和。 * */ @XxlJob("ParkingLotHeatMapHourJob") public ReturnT execute(String... params) throws Exception { String param = XxlJobHelper.getJobParam(); if (StringUtils.isNotEmpty(param) && params == null) { params = param.split(","); } ReturnT> result = new ReturnT>(); SimpleDateFormat formart = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); this.log("--begin---企业云平台-->停车热力分布图-->按照小时..."+formart.format(new Date())); if(params == null || params.length == 0){ return new ReturnT<>(ReturnT.FAIL_CODE, "请求参数不能为空,格式:5,91,1 参数说明:第一个参数='省份Id'" + " ,第二个参数='地市ID', 第三个参数='停车场经纬度'" ); } this.log("获取到的入参="+params.toString()); ParkingLotAndGeoDO parkingLotAndGeoDO = new ParkingLotAndGeoDO(); try{ parkingLotAndGeoDO.setPlProvinceId(Long.valueOf(params[0])); parkingLotAndGeoDO.setPlCityId(Long.valueOf(params[1])); parkingLotAndGeoDO.setGeoType(Integer.valueOf(params[2])); /**停车热力分布图-->按小时-查询停车场基本信息及停车数量..*/ result= this.queryParkingLotHeatMapHour(parkingLotAndGeoDO); /**通过给定的停车场编号和给定的范围,查询附近的停车场编号,将查询到的范围停车场 进场车辆.*/ this.queryParkLotNosByRadius(result); System.out.println(JSONObject.toJSON(result.getContent())); if(result != null && !CollectionUtils.isEmpty(result.getContent())){ SimpleDateFormat formartDate = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); Date heatmapTime = formartDate.parse(formartDate.format(new Date())); this.log("begin删除数据,入参="+formartDate.format(new Date())); Integer deleteCount = parkinglotHeatmapHourDao.deleteParkinglotHeatmapHourByheatmapTime(heatmapTime,parkingLotAndGeoDO.getPlCityId()); this.log("end 删除数据,结果="+deleteCount+" 条数据。"); this.log("begin保存数据"); Integer insertCount = parkinglotHeatmapHourDao.insertParkinglotHeatmapHourList(result.getContent()); this.log("end保存结果="+insertCount+" 条数据。"); } this.log("--end---企业云平台-->停车热力分布图-->按照小时..."+formart.format(new Date())); }catch (Exception e) { if (e instanceof InterruptedException) { throw e; } logger.warn("{}", e); } return ReturnT.SUCCESS; } /** * 通过给定的停车场编号和给定的范围,查询附近的停车场编号,将查询到的范围停车场 进场车辆sum.
* @return * 2017年7月10日 zhaowg */ private void queryParkLotNosByRadius(ReturnT> result){ this.log("begin查询200米范围内的停车场编码..."); Map> map = new HashMap>(); List ParkLotNosList = new ArrayList(); if(result != null && !CollectionUtils.isEmpty(result.getContent())){ List list = result.getContent(); for(ParkinglotHeatmapHour parkinglotHeatmapHour :list){ if(parkinglotHeatmapHour != null){ ParkLotNosList = ParkingLotGeoCacheUtil.queryParkLotNosByRadius(LonLatTypeEnum.LON_LAT_TYPE_1,Double.valueOf(parkinglotHeatmapHour.getLon().toString()),Double.valueOf(parkinglotHeatmapHour.getLat().toString()),Double.valueOf(DISTANCE)); if(!CollectionUtils.isEmpty(ParkLotNosList)){ map.put(parkinglotHeatmapHour.getPlNo(), ParkLotNosList); } } } this.log("end查询200米范围内的停车场编码...,结果="+(map != null && map.size()>0 ? map.size() :0)); //计算范围 if(map != null && map.size() >0){ Set>> set = map.entrySet(); for(Iterator>> iterator = set.iterator();iterator.hasNext();){ Entry> entry = iterator.next(); List ll = result.getContent(); for(ParkinglotHeatmapHour parkinglotHeatmapHour :ll){ if(parkinglotHeatmapHour != null && entry.getKey().equals(parkinglotHeatmapHour.getPlNo())){ this.log("停车场编码=["+entry.getKey()+"],对应的200米范围内的停车场编码="+JSONObject.toJSONString(entry.getValue())); parkinglotHeatmapHour.setCurrentParkCount(this.sumInParkCount(entry.getValue(), ll)); } } } } } } /** * 计算对应范围内多个停车场停车数量求和.
* @param list * @param ll * @return */ private Integer sumInParkCount(List list,List ll){ this.log("begin计算200米范围内,各个停车场进场车辆和.."); int sum = 0; if(!CollectionUtils.isEmpty(list) && !CollectionUtils.isEmpty(ll)){ for(String plNo : list){ for(ParkinglotHeatmapHour parkinglotHeatmapHour :ll){ if(plNo.equals(parkinglotHeatmapHour.getPlNo())){ this.log(plNo+"=对应入场车辆数量="+parkinglotHeatmapHour.getCurrentParkCount()); sum += parkinglotHeatmapHour.getCurrentParkCount(); } } } } this.log("end计算200米范围内,各个停车场进场车辆和..,结果sum="+sum); return sum; } /** * 停车热力分布图-->按小时-查询停车场基本信息及停车数量.
* @param parkingLotAndGeoDO * @return */ private ReturnT> queryParkingLotHeatMapHour(ParkingLotAndGeoDO parkingLotAndGeoDO ){ SimpleDateFormat formart = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); List plNos = new ArrayList(); String endTime = formart.format(new Date()); List inparkList = new ArrayList(); List list = new ArrayList(); try{ this.log("begin--查询停车场基本信息list..,入参="+JSONObject.toJSONString(parkingLotAndGeoDO)); /**查询停车场及停车场经纬度信息.*/ parkingLotAndGeoDO.setLonLatType(LonLatTypeEnum.LON_LAT_TYPE_1.value()); parkingLotAndGeoDO.setGeoType(1); list = parkingLotDao.queryParkingLotAndGeoInfo(parkingLotAndGeoDO); this.log("end--查询基本信息list..,结果list.size()="+(list != null && list.size() >0 ? list.size() : 0)); if(!CollectionUtils.isEmpty(list)){ for(ParkinglotHeatmapHour parklot:list){ if(parklot != null){ plNos.add(parklot.getPlNo()); } } Date beginTime = headDate(formart.parse(endTime),-2); /**查询进场车辆数.*/ inparkList = this.queryParklotInCarCount(beginTime, formart.parse(endTime), plNos); } /**合并list.*/ list = mergeList(formart.parse(endTime),inparkList,list); }catch (Exception e) { e.printStackTrace(); return new ReturnT>(ReturnT.FAIL_CODE,"查询信息异常!"); } return new ReturnT>(list); } /** * 合并list
* @param endTime * @param inparkList * @param list * @return * @throws ParseException */ private List mergeList(Date endTime,List inparkList,List list) throws ParseException{ List rsultList = new ArrayList(); SimpleDateFormat formart = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); Calendar col = Calendar.getInstance(); col.setTime(formart.parse(formart.format(endTime))); int heatmapTime = col.get(Calendar.HOUR_OF_DAY); this.log("begin合并进场车辆数及停车场及停车场经纬度信息信息"); this.log("转换后的小时="+heatmapTime); if(!CollectionUtils.isEmpty(list) && !CollectionUtils.isEmpty(inparkList)){ for(ParkinglotHeatmapHour parkinglotHeatmapHour:list){ parkinglotHeatmapHour.setHeatmapTime(endTime); parkinglotHeatmapHour.setHeatmapHour(heatmapTime+""); parkinglotHeatmapHour.setCreateDate(new Date()); parkinglotHeatmapHour.setRanges(Integer.valueOf(DISTANCE)); parkinglotHeatmapHour.setDataStatus(1); parkinglotHeatmapHour.setCurrentParkCount(1); for(InparkLogCountDO inparkLogCountDO:inparkList){ if(parkinglotHeatmapHour.getPlNo().equals(inparkLogCountDO.getPlNo())){ System.out.println("存在在停车辆,车场编码="+parkinglotHeatmapHour.getPlNo()+"="+inparkLogCountDO.getCurrentParkCount()); parkinglotHeatmapHour.setCurrentParkCount(inparkLogCountDO.getCurrentParkCount()); } } } rsultList.addAll(list); } this.log("end合并进场车辆数及停车场及停车场经纬度信息信息,结果="+JSONObject.toJSON(rsultList)); return rsultList; } /** * 查询进场车辆数.
* @param beginTime * @param endTime * @param plNos * @return */ private List queryParklotInCarCount(Date beginTime, Date endTime,List plNos){ SimpleDateFormat formart = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); this.log("---begin查询进场车辆数,入参={beginTime="+formart.format(beginTime)+",endTime="+formart.format(endTime)+",plNos="+plNos+"}"); List inparkList = new ArrayList(); if(!CollectionUtils.isEmpty(plNos)){ ListPageHelper pageInfo = new ListPageHelper(plNos,500); for(int i=1;i<=pageInfo.getTotalPages();i++){ System.out.println(JSONObject.toJSON(pageInfo.getPagedList(i))); List list = inParkLogDao.queryParklotInCarCount(beginTime, endTime, pageInfo.getPagedList(i)); if(!CollectionUtils.isEmpty(list)){ inparkList.addAll(list); } } } this.log("---end查询进场车辆数,结果 inparkList.size="+((inparkList !=null && inparkList.size() >0) ? inparkList.size() :0 )); return inparkList; } /** * 计算前2小时的时间.
* @param date * @param hours * @return * @throws ParseException */ private static Date headDate(Date date ,int hours) throws ParseException { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.HOUR_OF_DAY, hours); return cal.getTime(); } private void log(String msg){ XxlJobHelper.log(msg); logger.info(msg); } public static void main(String[] args) throws ParseException { SimpleDateFormat formart = new SimpleDateFormat("yyyy-MM-dd HH:00:00"); System.out.println(formart.format(new Date())); Calendar col = Calendar.getInstance(); col.setTime(formart.parse(formart.format(new Date()))); System.out.println(col.get(Calendar.HOUR_OF_DAY)); System.out.println(formart.format(new Date()).substring(10, 13)); } }