package com.zteits.park.biz; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; import com.clouds.common.cache.park.PLRealTimeStatusCacheUtil; import com.clouds.common.cache.park.ParkingLotCacheUtil; import com.clouds.common.cache.park.ParkingLotGeoCacheUtil; import com.clouds.common.cache.sys.SysCodeValueCacheUtil; import com.clouds.common.constants.CodeValKindEnum; import com.clouds.common.constants.ParkConstant.plType; import com.clouds.common.constants.dutyroster.DutyRosterEnum.WorkStateEnum; import com.clouds.common.entity.PLRealTimeStatusBean; import com.clouds.common.utils.BeanValidatorsUtils; import com.clouds.common.utils.ListCopyUtil; import com.clouds.common.utils.MapDistance; import com.clouds.common.utils.ResultUtils; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.xiaoleilu.hutool.date.DateUtil; import com.xiaoleilu.hutool.util.CollectionUtil; import com.xiaoleilu.hutool.util.PageUtil; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.bean.PageBean; import com.zteits.clouds.api.apibase.constants.EqpTypeEnum; import com.zteits.clouds.api.apibase.constants.ErrorType; import com.zteits.clouds.api.apibase.constants.LonLatTypeEnum; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.clouds.param.QueryEmployeeRequest; import com.zteits.clouds.api.dto.clouds.param.QueryParkListAllRequest; import com.zteits.clouds.api.dto.clouds.param.RealTimeMonitorByPlNosRequest; import com.zteits.clouds.api.dto.park.dto.*; import com.zteits.clouds.api.dto.park.dto.parksource.ParkSouceDeviceDTO; import com.zteits.clouds.api.dto.park.dto.parksource.ParkSouceDeviceStaDTO; import com.zteits.clouds.api.dto.park.param.*; import com.zteits.clouds.api.dto.park.param.dutyroster.DutyRosterQueryReq; import com.zteits.clouds.api.dto.park.param.parklot.QueryOrgIdsByCityIdsRequest; import com.zteits.clouds.api.dto.park.param.parksource.QueryParkSourceByOrgIdsRequest; import com.zteits.clouds.api.dto.park.param.parksource.QueryParkSourceByPlNoRequest; import com.zteits.clouds.api.dto.park.param.parksource.QueryParkSourceRequest; import com.zteits.clouds.api.dto.tool.dto.ParkDutyInfoDTO; import com.zteits.clouds.api.dto.tool.param.ParkDutyInfoQueryReq; import com.zteits.clouds.api.service.park.ParkingLotQueryService; import com.zteits.clouds.api.service.park.berths.query.ParkFreeBerthQueryService; import com.zteits.park.biz.business.ParkLotQueryBizService; import com.zteits.park.biz.business.ParkLotScopeQueryBizService; import com.zteits.park.constant.ParkConstant; import com.zteits.park.dao.*; import com.zteits.park.domain.ParkingLot; import com.zteits.park.domain.*; import com.zteits.park.pagepager.PageBeanUtil; import com.zteits.park.service.eqp.query.TpPEqpQueryInnerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.geo.Point; import org.springframework.stereotype.Service; // ⚠️ 这里必须用 Spring 那份:本文件 30 处集合判空里,426/651/702 三处传的是 // Map>,而 **Spring 的 isEmpty 有 Map 重载、 // commons-collections4 的没有**(它的 Map 版在 MapUtils 里)。 // commons-collections4 只在一处用到 —— 第 869 行的 isNotEmpty(Spring 那份从来没有), // 老代码原本就是写成 Dubbo 的全限定名来跟本 import 区分的,这里沿用同一手法。 import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Service public class ParkingLotQueryServiceImpl implements ParkingLotQueryService { private static final Logger logger = LoggerFactory.getLogger(ParkingLotQueryServiceImpl.class); @Autowired private ParkingLotDao parkingLotDao; @Autowired private ParkingLotGeoDao parkingLotGeoDao; @Autowired private ParkLotScopeQueryBizService parkLotScopeQueryService; @Autowired private ParkFreeBerthQueryService parkFreeBerthService; @Autowired private TpPRegionAreaDao tpPRegionAreaDao; @Autowired private EqpDao eqpDao; @Autowired private ParkLotQueryBizService parkLotQueryBizService; // @Autowired // private TpEEmployeeChargeDao tpEEmployeeChargeDao; @Autowired private TpPEqpQueryInnerService tpPEqpQueryInnerService; // @Autowired // private DutyRosterBaseDao dutyRosterBaseDao; @Autowired private DutyRosterDao dutyRosterDao; @Autowired private SignRecordDao signRecordDao; @Override @Deprecated public BizResult> QueryTabParkingLot(GetParkLotRequest request) { BeanValidatorsUtils.validateWithException(request); List resultParkingLots = parkLotScopeQueryService.QueryScopeParkingLot(request); return new BizResult>(resultParkingLots); } @Override public BizResult QueryParkingLotByPkNo(QueryParkLotInfoByPkNoRequest request) { ParkingLotDTO dto = parkLotQueryBizService.QueryParkingLotByPkNo(request.getPklNo()); return new BizResult(dto); } @Override public BizResult QueryParkingLotByPkOutNo(QueryParkLotInfoByPkOutNoRequest request) { ParkingLotDTO dto = parkingLotDao.queryParkingLotInfoByPlOutNo(request.getPklOutNo()); return new BizResult(dto); } @Override public BizResult> StatisticParkLotCountByCountry( StatisticParkLotCountByCountryRequest request) { logger.info("开始查询通过区域分组 统计停车场数量服务"); //查询停车场统计信息 List statisticByCountryDTOs = parkingLotDao.StatisticParkLotCountByCountry( request.getCityId(), request.getState()); List byCountryDTOs = Lists.newArrayList(); if (!CollectionUtils.isEmpty(statisticByCountryDTOs)) { for (ParkingLotCountStatisticByCountryDO parkingLotCountStatisticByCountryDO : statisticByCountryDTOs) { ParkLotCountStatisticByCountryDTO byCountryDTO = new ParkLotCountStatisticByCountryDTO(); BeanUtils.copyProperties(parkingLotCountStatisticByCountryDO, byCountryDTO); byCountryDTOs.add(byCountryDTO); } } logger.info("结束查询通过区域分组 统计停车场数量服务"); return new BizResult>(byCountryDTOs); } @Override public BizResult> queryParkLotByCountry(StatisticParkLotCountByCountryRequest request) { logger.info("开始查询通过城市ID获取停车场信息"); //查询停车场统计信息 List parkingLots = parkingLotDao.queryParkLotByCountry(request.getCityId(), null); List byCountryDTOs = Lists.newArrayList(); if (!CollectionUtils.isEmpty(parkingLots)) { for (ParkingLot parkingLot : parkingLots) { ParkingLotDTO byCountryDTO = new ParkingLotDTO(); BeanUtils.copyProperties(parkingLot, byCountryDTO); byCountryDTOs.add(byCountryDTO); } } logger.info("结束查询通过城市ID获取停车场信息"); return new BizResult>(byCountryDTOs); } @Override public BizResult> queryParkLotByOrgIdAndPlNos(Long orgId, List plNos,Integer plType) { if (null == orgId) { throw new BizException(ErrorType.PARAMM_NULL, "组织ID"); } List parkingLotList = parkingLotDao.queryParkLotByOrgIdAndPlNos(orgId, plNos,plType); List dtos = new ArrayList<>(); for (ParkingLot lot : parkingLotList) { ParkingLotDTO dto = new ParkingLotDTO(); BeanUtils.copyProperties(lot, dto); dtos.add(dto); } return new BizResult<>(dtos); } @Override public BizResult> queryParkLotByCountryAndParkName( QueryParkingLotByCountryRequest request) { logger.info("开始查询通过城市ID获取停车场信息"); List countryIds = new ArrayList(); if (CollectionUtil.isNotEmpty(request.getCountryId())) { for (String str : request.getCountryId()) { if (StringUtils.isNotEmpty(str)) { countryIds.add(Long.valueOf(str)); } } } //查询停车场统计信息 //TODO 先根据停车场名称模糊匹配,如果为空,则根据地址模糊匹配 zhaowg 20180104 PageInfo pageInfo = parkingLotDao.queryParkLotByCountryAndParkName(request.getPlNos(), request.getCityId(), countryIds, request.getParkNameOrAddress(), request.getBaseRequest().getPageNum(), request.getBaseRequest().getPageSize(), null,request.getPlTypes()); //获取经纬度 List pklNos = this.getParkNos(pageInfo.getList()); Map> parkingLotGeoList = new HashMap<>(); if (!CollectionUtils.isEmpty(pklNos)) { parkingLotGeoList = parkingLotGeoDao.queryParkingLotGeoListByParkNos(pklNos, request.getGeoType(), request.getLonLatType()); } PageBean pageBean = new PageBean(); if (pageInfo != null) { PageBeanUtil.copyProperties(pageInfo, pageBean, ParkingLotDTO.class); } ParkFreeBerthGetByPlnoRequest parkFreeBerthGetByPlnoRequest = new ParkFreeBerthGetByPlnoRequest(); parkFreeBerthGetByPlnoRequest.setPlNos(pklNos); BizResult> result = parkFreeBerthService.getParkFreeBerthByPlno( parkFreeBerthGetByPlnoRequest); Map parkFreeMap = new HashMap<>(); if (ResultUtils.isSuccess(result)) { parkFreeMap = result.getData(); } //将地址位置赋值 同时将空余车位数补充上 if (!CollectionUtils.isEmpty(pageBean.getDataList())) { for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { parkingLotDTO.setFreeBrethNum(parkFreeMap.get(parkingLotDTO.getPlNo())); List parkingLotGeos = parkingLotGeoList.get(parkingLotDTO.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(list -> { if (list.size() == 0) { return; } parkingLotDTO.setLonId(list.get(0).getLonId()); parkingLotDTO.setLatId(list.get(0).getLatId()); }); } } List plNos = getPlNos(pageInfo.getList()); Map eqpTypeMap = SysCodeValueCacheUtil.queryCodeValueAndNames( CodeValKindEnum.PARKING_LOT_EQP_TYPE); Map> eqpMap = eqpDao.queryEqpTypeByPlNos(plNos); //将设备类型赋值 if (!CollectionUtils.isEmpty(pageBean.getDataList())) { for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { parkingLotDTO.setEqpTypes(eqpMap.get(parkingLotDTO.getPlNo())); String eqpString = ""; if (CollectionUtil.isNotEmpty(parkingLotDTO.getEqpTypes())) { for (Integer eqpId : parkingLotDTO.getEqpTypes()) { if (null != eqpTypeMap.get(eqpId + "")) { eqpString += eqpTypeMap.get(eqpId + "") + "、"; } } } if (StringUtils.isNotEmpty(eqpString)) { eqpString = eqpString.substring(0, eqpString.length() - 1); } parkingLotDTO.setEqpNames(eqpString); } } return new BizResult>(pageBean); } @Override public BizResult> queryParkingLotGeoByCountryAndParkName( PlNoQueryBycountryAndParkNameRequest request) { List dtos = new ArrayList(); //查询停车场统计信息 List tempList = parkingLotDao.queryParkLotByCountryAndParkNameOfNoPage(null, request.getCountryId(), request.getParkNameOrAddress(), null); // 2021-12-09 如果前端查询带有orgId的话。对查出来的结果进行过滤,只保留该orgId的数据-- start--- Long orgId = request.getOrgId(); if(tempList != null && orgId != null && tempList.size() > 0){ tempList = tempList.stream().filter(e -> e.getOrgId().equals(orgId)).collect(Collectors.toList()); } // 2021-12-09 如果前端查询带有orgId的话。对查出来的结果进行过滤,只保留该orgId的数据-- end--- //查询停车场统计信息 List list = tempList; if (CollectionUtils.isEmpty(list)) { return new BizResult<>(new ArrayList<>()); } //获取经纬度 List pklNos = list.stream().map(item->item.getPlNo()).collect(Collectors.toList()); Map> parkingLotGeoList = new HashMap<>(); //获取停车场经纬度信息 LonLatTypeEnum lonLatTypeEnum = LonLatTypeEnum.getLonLatTypeEnum(request.getLonLatType()); //需要调用数据库查询经纬度的停车场编号 List plNos = new ArrayList<>(); if(lonLatTypeEnum!=null){ //查询缓存 for (String plNo:pklNos){ List points = ParkingLotGeoCacheUtil.queryPointByPlNo(lonLatTypeEnum, plNo); if(CollectionUtils.isEmpty(points) || points.get(0) == null){ plNos.add(plNo); }else{ List parkingLotGeos = new ArrayList<>(); ParkingLotGeo parkingLotGeo = new ParkingLotGeo(); parkingLotGeo.setLonId(new BigDecimal(points.get(0).getX())); parkingLotGeo.setLatId(new BigDecimal(points.get(0).getY())); parkingLotGeos.add(parkingLotGeo); parkingLotGeoList.put(plNo,parkingLotGeos); } } } if(CollectionUtils.isEmpty(plNos)){ }else{ Map> parkingLotGeoListByParkNos = parkingLotGeoDao.queryParkingLotGeoListByParkNos(pklNos, request.getGeoType(), request.getLonLatType()); parkingLotGeoList.putAll(parkingLotGeoListByParkNos); } ParkFreeBerthGetByPlnoRequest parkFreeBerthGetByPlnoRequest = new ParkFreeBerthGetByPlnoRequest(); parkFreeBerthGetByPlnoRequest.setPlNos(pklNos); BizResult> result = parkFreeBerthService.getParkFreeBerthByPlno(parkFreeBerthGetByPlnoRequest); Map parkFreeMap = new HashMap<>(); if (ResultUtils.isSuccess(result)) { parkFreeMap = result.getData(); } //将地址位置赋值 同时将空余车位数补充上 for (ParkingLot parkingLot : list) { ParkingLotDTO dto = new ParkingLotDTO(); BeanUtils.copyProperties(parkingLot, dto); dto.setFreeBrethNum(parkFreeMap.get(dto.getPlNo())); List parkingLotGeos = parkingLotGeoList.get(dto.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(lists -> { if (list.size() == 0) { return; } dto.setLonId(lists.get(0).getLonId()); dto.setLatId(lists.get(0).getLatId()); }); dtos.add(dto); } return new BizResult<>(dtos); } @Override public BizResult> queryPlNoBycountryAndParkName(PlNoQueryBycountryAndParkNameRequest request) { if (CollectionUtil.isEmpty(request.getCountryId())) { throw new BizException(ErrorType.PARAMM_NULL, "区县ID集合"); } List plNos = parkingLotDao.queryPlNoCountryAndParkNameAndAddress(request.getCountryId(), request.getParkNameOrAddress(), null); return new BizResult<>(plNos); } /** * 获取list 中的停车场主键id * * @param list * @return */ private List getPlNos(List list) { List plNos = new ArrayList(); if (!CollectionUtils.isEmpty(list)) { for (ParkingLot parkingLot : list) { if (parkingLot != null && StringUtils.isNotEmpty(parkingLot.getPlNo())) { plNos.add(parkingLot.getPlNo()); } } } logger.info("获取停车场编码list=" + JSONObject.toJSONString(plNos)); return plNos; } /** * 获取list中的停车场编码.
* * @param list * @return */ private List getParkNos(List list) { List plNoList = new ArrayList(); if (!CollectionUtils.isEmpty(list)) { for (ParkingLot parkingLot : list) { if (parkingLot != null && StringUtils.isNotEmpty(parkingLot.getPlNo())) { plNoList.add(parkingLot.getPlNo()); } } } logger.info("获取停车场编码list=" + JSONObject.toJSONString(plNoList)); return plNoList; } @Override public BizResult queryParkLotInfoAndDistanceByGivenCoordinate( QueryParkLotByGivenCoordinateRequest request) { BeanValidatorsUtils.validateWithException(request); ParkingLotDTO parkingLotDTO = new ParkingLotDTO(); //查询停车场信息 ParkingLot parkingLot = this.parkingLotDao.queryParkingLotInfoByPlNo(request.getPlNo()); BeanUtils.copyProperties(parkingLot, parkingLotDTO); //获取停车场经纬度 Coordinate coordinate = parkingLotGeoDao.queryParkingLotGeoByParkNo(request.getPlNo(), request.getLonLatType()); parkingLotDTO.setLonId(new BigDecimal(coordinate.getLon())); parkingLotDTO.setLatId(new BigDecimal(coordinate.getLat())); //计算和目标距离 Double distance = MapDistance.getDistance(coordinate.getLat(), coordinate.getLon(), request.getLatitude(), request.getLongitude()); if (distance == null) {distance = 0D;} //保留两位小数 BigDecimal b = new BigDecimal(distance); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); parkingLotDTO.setDistance(f1); return new BizResult(parkingLotDTO); } @Override public BizResult> queryParkingLotByPark(QueryParkingLotByParkRequest request, Integer pageNum, Integer pageSize) throws Exception { ParkingLotQueryPageDO parkingLotDO = new ParkingLotQueryPageDO(); BeanUtils.copyProperties(request, parkingLotDO); PageInfo pageInfo = parkingLotDao.queryParkingLotByPark(parkingLotDO, pageNum, pageSize); PageBean pageBean = new PageBean(); if (null != pageInfo) { PageBeanUtil.copyProperties(pageInfo, pageBean, ParkingLotDTO.class); } //停车场编码list if (CollectionUtils.isEmpty(pageBean.getDataList())) { return new BizResult>(pageBean); } List plNos = pageBean.getDataList().stream().map(item -> item.getPlNo()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(plNos)) { return new BizResult>(pageBean); } /*************统计区间数量********************/ Map areaMap = tpPRegionAreaDao.queryParkAreaNum(plNos); for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { Long areaCount = areaMap.get(parkingLotDTO.getPlNo()); parkingLotDTO.setParkAreaNum(areaCount == null ? 0 : areaCount.intValue()); parkingLotDTO.setBerthNum(parkingLotDTO.getPlBerthNum()); } //获取经纬度信息 Map> parkingLotGeoList = parkingLotGeoDao.queryParkingLotGeoListByParkNos(plNos, ParkConstant.ParkingLotGeo.GeoType.TYPE_PARKINGLOT, LonLatTypeEnum.LON_LAT_TYPE_2.value()); if (CollectionUtils.isEmpty(parkingLotGeoList)) { return new BizResult>(pageBean); } for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { List parkingLotGeos = parkingLotGeoList.get(parkingLotDTO.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(lists -> { if (lists.size() == 0) { return; } parkingLotDTO.setLonId(lists.get(0).getLonId()); parkingLotDTO.setLatId(lists.get(0).getLatId()); }); } return new BizResult>(pageBean); } @Override public BizResult queryBerthNumByPlNos(CommonPlnosQueryRequest request) { long berthNo = parkingLotDao.queryBerthNoByPlnos(request.getPlNos()); return new BizResult<>(berthNo); } @Override public BizResult> queryParkingLotGeoByPlNos(RealTimeMonitorByPlNosRequest request) throws Exception { ParkingLotQueryPageDO parkquery = new ParkingLotQueryPageDO(); parkquery.setPlNos(CollectionUtil.isEmpty(request.getPlNos()) ? new ArrayList<>() : request.getPlNos()); //查询停车场统计信息 PageInfo list = parkingLotDao.queryParkingLotByPark(parkquery, 1, 0); //获取经纬度 List pklNos = this.getParkNos(list.getList()); List dtos = new ArrayList(); if (CollectionUtils.isEmpty(list.getList())) { return new BizResult<>(new ArrayList<>()); } for (ParkingLot parkingLot : list.getList()) { ParkingLotDTO dto = new ParkingLotDTO(); dto.setPlBerthNum(parkingLot.getPlBerthNum()); BeanUtils.copyProperties(parkingLot, dto); dtos.add(dto); } ParkFreeBerthGetByPlnoRequest parkFreeBerthGetByPlnoRequest = new ParkFreeBerthGetByPlnoRequest(); parkFreeBerthGetByPlnoRequest.setPlNos(pklNos); BizResult> result = parkFreeBerthService.getParkFreeBerthByPlno( parkFreeBerthGetByPlnoRequest); Map parkFreeMap = new HashMap<>(); if (ResultUtils.isSuccess(result)) { parkFreeMap = result.getData(); } Map> parkingLotGeoList = new HashMap<>(); if (!CollectionUtils.isEmpty(pklNos)) { parkingLotGeoList = parkingLotGeoDao.queryParkingLotGeoListByParkNos(pklNos, ParkConstant.ParkingLotGeo.GeoType.TYPE_PARKINGLOT, LonLatTypeEnum.LON_LAT_TYPE_1.value()); } //将地址位置赋值 同时将空余车位数补充上 if (!CollectionUtils.isEmpty(dtos)) { for (ParkingLotDTO parkingLotDTO : dtos) { parkingLotDTO.setFreeBrethNum(parkFreeMap.get(parkingLotDTO.getPlNo())); List parkingLotGeos = parkingLotGeoList.get(parkingLotDTO.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(lists -> { if (lists.size() == 0) { return; } parkingLotDTO.setLonId(lists.get(0).getLonId()); parkingLotDTO.setLatId(lists.get(0).getLatId()); }); } } return new BizResult<>(dtos); } @Override public BizResult> statisticParkLotCountByCountryForPlType( StatisticParkLotCountByCountryRequest request) { logger.info("开始查询通过区域分组 统计停车场数量服务"); //查询停车场统计信息 List statisticByCountryDTOs = parkingLotDao .statisticParkLotCountByCountryForPlType( request.getCityId(), request.getState()); List byCountryDTOs = Lists.newArrayList(); if (!CollectionUtils.isEmpty(statisticByCountryDTOs)) { for (ParkingLotCountStatisticByCountryDO parkingLotCountStatisticByCountryDO : statisticByCountryDTOs) { ParkLotCountStatisticByCountryDTO byCountryDTO = new ParkLotCountStatisticByCountryDTO(); BeanUtils.copyProperties(parkingLotCountStatisticByCountryDO, byCountryDTO); byCountryDTOs.add(byCountryDTO); } } logger.info("结束查询通过区域分组 统计停车场数量服务"); return new BizResult>(byCountryDTOs); } @Override public BizResult> queryParkListByPark(QueryParkListByParkRequest request) { if (request == null) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象"); } List parklist = parkingLotDao.queryParkListByPark(request); List parkingLotDTOlist = Lists.newArrayList(); if (!CollectionUtils.isEmpty(parklist)) { for (ParkingLot park : parklist) { ParkingLotDTO dto = new ParkingLotDTO(); if (null != park) { BeanUtils.copyProperties(park, dto); } parkingLotDTOlist.add(dto); } } return new BizResult>(parkingLotDTOlist); } /** * 根据 orgId 以及 停车场类型查询 * * @param request * @return */ @Override public BizResult> queryParkListByOrgId(QueryParkListByParkRequest request) { List parklist = parkingLotDao.queryParkListByOrgId(request); List parkingLotDTOlist = Lists.newArrayList(); if (!CollectionUtils.isEmpty(parklist)) { for (ParkingLot park : parklist) { ParkingLotDTO dto = new ParkingLotDTO(); if (null != park) { BeanUtils.copyProperties(park, dto); } parkingLotDTOlist.add(dto); } } return new BizResult>(parkingLotDTOlist); } @Override public BizResult> queryParkListAll(QueryParkListAllRequest request) { List listDTO = Lists.newArrayList(); logger.info("---begin开始查询所有停车场信息..."); if (request == null) { throw new BizException(ErrorType.PARAMM_NULL, "请求对象"); } else { List listDO = parkingLotDao.queryParkListAll(); ListCopyUtil.listCopyProperties(listDO, listDTO, ParkingLotDTO.class); } logger.info("---end开始查询所有停车场信息..."); return new BizResult>(listDTO); } @Override public BizResult queryParkingLotGeoByParkNo(QueryParkGeoRequest request) { ParkingLotDTO parkingLotDTO = new ParkingLotDTO(); parkingLotDTO.setPlNo(request.getPlNo()); parkingLotDTO.setLatId(new BigDecimal(0)); parkingLotDTO.setLonId(new BigDecimal(0)); parkingLotDTO.setLonLatType(request.getLonLatType()); Coordinate coordinate = new Coordinate(); coordinate = parkingLotGeoDao.queryParkingLotGeoByParkNo(request.getPlNo(), request.getLonLatType()); if (coordinate == null) { return new BizResult<>(parkingLotDTO); } if (null != coordinate.getLat()) { parkingLotDTO.setLatId(BigDecimal.valueOf(coordinate.getLat())); } if (null != coordinate.getLat()) { parkingLotDTO.setLonId(BigDecimal.valueOf(coordinate.getLon())); } return new BizResult<>(parkingLotDTO); } @Override public BizResult> QueryParkingLotByPkNos(QueryParkLotInfoByPkNosRequest request) { // BeanValidatorsUtils.validateWithException(request); List parkingLotDTOs = parkLotQueryBizService.QueryParkingLotByPkNos(request.getPlNos()); return new BizResult>(parkingLotDTOs); } /** * 通过服务点id查询停车场-分页 * * @param request * @return * @throws Exception 2017年12月28日 wangfs.
*/ @Override public BizResult> queryParkingLotForPageByAreaBlockId( QueryParkingLotByAreaBlockRequest request) { logger.info("begin通过服务点id查询停车场-分页,入参={}", JSONObject.toJSON(request)); PageBean pageBean = new PageBean(); PageInfo pageInfo = parkingLotDao.queryParkingLotForPageByAreaBlockId(request); PageBeanUtil.copyProperties(pageInfo, pageBean, ParkingLotDTO.class); if (pageBean == null || CollectionUtils.isEmpty(pageBean.getDataList())) { return new BizResult>(pageBean); } List plNos = pageBean.getDataList().stream().map(item -> item.getPlNo()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(plNos)) { return new BizResult>(pageBean); } ParkFreeBerthGetByPlnoRequest parkFreeBerthGetByPlnoRequest = new ParkFreeBerthGetByPlnoRequest(); parkFreeBerthGetByPlnoRequest.setPlNos(plNos); BizResult> result = parkFreeBerthService.getParkFreeBerthByPlno( parkFreeBerthGetByPlnoRequest); Map parkFreeMap = new HashMap<>(); if (ResultUtils.isSuccess(result)) { parkFreeMap = result.getData(); } Map areaMap = tpPRegionAreaDao.queryParkAreaNum(plNos); for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { Long areaCount = areaMap.get(parkingLotDTO.getPlNo()); //统计区间数量 parkingLotDTO.setParkAreaNum(areaCount == null ? 0 : areaCount.intValue()); //补全空闲车位数 parkingLotDTO.setFreeBrethNum(parkFreeMap.get(parkingLotDTO.getPlNo())); } //获取经纬度信息 Map> parkingLotGeoList = parkingLotGeoDao.queryParkingLotGeoListByParkNos(plNos, ParkConstant.ParkingLotGeo.GeoType.TYPE_PARKINGLOT, LonLatTypeEnum.LON_LAT_TYPE_1.value()); if (CollectionUtils.isEmpty(parkingLotGeoList)) { return new BizResult>(pageBean); } for (ParkingLotDTO parkingLotDTO : pageBean.getDataList()) { List parkingLotGeos = parkingLotGeoList.get(parkingLotDTO.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(lists -> { if (lists.size() == 0) { return; } parkingLotDTO.setLonId(lists.get(0).getLonId()); parkingLotDTO.setLatId(lists.get(0).getLatId()); }); } logger.info("end通过服务点id查询停车场-分页..."); return new BizResult>(pageBean); } @Override public BizResult> queryParkingLotListByAreaBlockId(QueryParkingLotByAreaBlockRequest request) { logger.info("begin通过服务点id查询停车场,入参={}", JSONObject.toJSON(request)); List parkingLotDTOs = new ArrayList<>(); List parkingLots = parkingLotDao.queryParkingLotListByAreaBlockId(request); if (CollectionUtils.isEmpty(parkingLots)) { return new BizResult<>(parkingLotDTOs); } for(ParkingLot parkingLot : parkingLots){ ParkingLotDTO parkingLotDTO = new ParkingLotDTO(); BeanUtils.copyProperties(parkingLot,parkingLotDTO); parkingLotDTOs.add(parkingLotDTO); } List plNos = parkingLotDTOs.stream().map(item -> item.getPlNo()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(plNos)) { return new BizResult<>(parkingLotDTOs); } ParkFreeBerthGetByPlnoRequest parkFreeBerthGetByPlnoRequest = new ParkFreeBerthGetByPlnoRequest(); parkFreeBerthGetByPlnoRequest.setPlNos(plNos); BizResult> result = parkFreeBerthService.getParkFreeBerthByPlno( parkFreeBerthGetByPlnoRequest); Map parkFreeMap = new HashMap<>(); if (ResultUtils.isSuccess(result)) { parkFreeMap = result.getData(); } for (ParkingLotDTO parkingLotDTO : parkingLotDTOs) { parkingLotDTO.setFreeBrethNum(0); //补全空闲车位数 parkingLotDTO.setFreeBrethNum(parkFreeMap.get(parkingLotDTO.getPlNo())); } //获取经纬度信息 Map> parkingLotGeoList = parkingLotGeoDao.queryParkingLotGeoListByParkNos(plNos, ParkConstant.ParkingLotGeo.GeoType.TYPE_PARKINGLOT, LonLatTypeEnum.LON_LAT_TYPE_1.value()); if (CollectionUtils.isEmpty(parkingLotGeoList)) { return new BizResult<>(parkingLotDTOs); } for (ParkingLotDTO parkingLotDTO : parkingLotDTOs) { List parkingLotGeos = parkingLotGeoList.get(parkingLotDTO.getPlNo()); Optional.ofNullable(parkingLotGeos).ifPresent(lists -> { if (lists.size() == 0) { return; } parkingLotDTO.setLonId(lists.get(0).getLonId()); parkingLotDTO.setLatId(lists.get(0).getLatId()); }); } logger.info("end通过服务点id查询停车场..."); return new BizResult<>(parkingLotDTOs); } @Override public BizResult> queryParkinglotBasicFactsByPlNos( ParkinglotBasicFactsRequest request) { BeanValidatorsUtils.validateWithException(request); /**根据停车场编码分页 **/ // PageInfo pageInfo = parkingLotDao.queryParkLotByCountryAndParkName(request.getPlNos(), // null,null, null, request.getBaseRequest().getPageNum(), request.getBaseRequest() // .getPageSize(), null); // List plNos = this.getParkNos(pageInfo.getList()); int[] indexs = PageUtil.transToStartEnd(request.getBaseRequest().getPageNum(), request.getBaseRequest().getPageSize()); int startIndex = indexs[0]; int endIndex = indexs[1]; List parkinglotBasicFactsDTOS = new ArrayList<>(); if (request.getPlNos().size() < startIndex) { //传递的总数超过了停车场总数,直接返回空 return new BizResult<>(parkinglotBasicFactsDTOS); } List plNos = new ArrayList<>(); if (request.getPlNos().size() < endIndex) { endIndex = request.getPlNos().size(); } //给传递的停车场排序 Collections.sort(request.getPlNos()); //获取分页后的停车场编号 plNos = request.getPlNos().subList(startIndex, endIndex); /**1、根据停车场查询设备信息**/ /**PDA **/ QueryEqpRequest queryEqpRequest = new QueryEqpRequest(); queryEqpRequest.setPlNos(plNos); /**设备类型 值等于-1表示查询全部 字典表[TP_P_EQP_EQP_TYPE] 1-地磁;2-视频桩;3-地锁,4-网关,5-中继器等 9-PDA*/ List eqpTypes = new ArrayList<>(); eqpTypes.add(EqpTypeEnum.PDA.getCode()); eqpTypes.add(EqpTypeEnum.GEO.getCode()); queryEqpRequest.setEqpTypes(eqpTypes); queryEqpRequest.setSysCode(request.getSysCode()); Map> map = tpPEqpQueryInnerService.statisticEqpCountGroupByPlNo( queryEqpRequest); /**2、从排班计划基础表中查询收费员编码*/ //List chargerCodes = dutyRosterBaseDao.queryChargersByPlNos(request.getOrgId(),request.getPlNos()); /**2、根据停车场查询收费员信息**/ // List chargeList = tpEEmployeeChargeDao.queryChargerByChargerCodes(chargerCodes); //Map chargeMap = chargeList.stream() // .collect(Collectors.toMap(TpEEmployeeCharge::getChargerCode, charger -> charger)); /**2从排班计划表中查询收费员信息*/ DutyRosterQueryReq rostRequest = new DutyRosterQueryReq(); rostRequest.setPlNo(request.getPlNos()); rostRequest.setStartDate(new Date()); rostRequest.setEndDate(new Date()); rostRequest.setWorkState(Arrays.asList(WorkStateEnum.WORK.getCode())); List dutyRosterList = dutyRosterDao.queryDutyRoster(rostRequest ); Map> chargeMap = dutyRosterList.stream() .collect(Collectors.groupingBy(DutyRoster::getPlNo)); /**从签到记录表中查询实际签到的收费员*/ QueryEmployeeRequest signRequest = new QueryEmployeeRequest(); signRequest.setPlNos(request.getPlNos()); signRequest.setBeginTime(DateUtil.beginOfDay(new Date())); signRequest.setEndTime(DateUtil.endOfDay(new Date())); List signList = signRecordDao.querySignNumByPlNos(signRequest); Map> signMap = signList.stream().collect(Collectors.groupingBy(ParkinglotBasicFactsDTO::getPlNo)); // QueryParkSourceRequest request1 = new QueryParkSourceRequest(); // request1.setPlNos(plNos); // Map chargeMap = tpEEmployeeChargeDao.queryParkSourceEmployeeStaForMap( // request1); for (String plNo : plNos) { /**3、查询缓存中的停车场实时数据**/ ParkinglotBasicFactsDTO dto = new ParkinglotBasicFactsDTO(); PLRealTimeStatusBean result = PLRealTimeStatusCacheUtil.getPLRealTimeStatus(plNo); if (result != null) { BeanUtils.copyProperties(result, dto); } ParkingLotDTO parkdto = ParkingLotCacheUtil.getParkLotByPlNo(plNo); if (parkdto != null) { BeanUtils.copyProperties(parkdto, dto); if (plType.RAODINSIDE.equals(parkdto.getPlType())) { dto.setPlTypeDesc("路侧停车场"); } else if (plType.ROADOUTSIDE.equals(parkdto.getPlType())) { dto.setPlTypeDesc("封闭停车场"); } } // dto.setPlPicturePath(parkdto.getPlPicturePath()); dto.setOnlineEqpCount(0); dto.setAllEqpCount(0); dto.setOnlinePDACount(0); dto.setAllPDACount(0); /**4、地磁设备和PDA赋值**/ List statisticEqpList = map.get(plNo); if (CollectionUtil.isNotEmpty(statisticEqpList)) { for (StatisticEqpCountByPlNoDTO s : statisticEqpList) { if (s == null) { continue; } if (EqpTypeEnum.GEO.getCode() == s.getEqpType()) { dto.setOnlineEqpCount(s.getOnlineEqpNum() == null ? 0 : s.getOnlineEqpNum()); dto.setAllEqpCount(s.getAllEqpNum() == null ? 0 : s.getAllEqpNum()); } else if (EqpTypeEnum.PDA.getCode() == s.getEqpType()) { dto.setAllPDACount(s.getAllEqpNum() == null ? 0 : s.getAllEqpNum()); dto.setOnlinePDACount(s.getOnlineEqpNum() == null ? 0 : s.getOnlineEqpNum()); } } } /**5、收费员信息赋值**/ dto.setAllTollCollector(chargeMap.get(plNo) == null ? 0 : chargeMap.get(plNo).size()); dto.setSignInTollCollector(signMap.get(plNo) == null ? 0 : (signMap.get(plNo).get(0)).getSignInTollCollector()); /**6 计算设备在线率*/ String onlineEqpRate = dto.getAllEqpCount().equals(0) ? "0%" : new BigDecimal( (float)dto.getOnlineEqpCount() / dto.getAllEqpCount()).setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue() * 100 + "%"; dto.setOnlineEqpRate(onlineEqpRate); /**7 车位占用描述:充足,紧急,停满*/ Double freeRate = 1 - ((dto.getBerthNum() == null || dto.getBerthNum()==0)? 0d : new BigDecimal( (float)dto.getBerthFreeNum() / dto.getBerthNum()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); if (freeRate.compareTo(0d) == 0) { dto.setFreeBerthsStateDesc("停满"); } else if (freeRate.compareTo(0d) > 0 && freeRate.compareTo(0.20d) < 0) { dto.setFreeBerthsStateDesc("紧张"); } else { dto.setFreeBerthsStateDesc("充足"); } parkinglotBasicFactsDTOS.add(dto); } return new BizResult<>(parkinglotBasicFactsDTOS); } @Override public BizResult> queryParkSourceDeviceSta(QueryParkSourceRequest request) { // 先根据停车场名称模糊匹配,如果为空,则根据地址模糊匹配 PageInfo pageInfo = parkingLotDao.queryParkLotByCountryAndParkName(request.getPlNos(), null, null, null, request.getBaseRequest().getPageNum(), request.getBaseRequest().getPageSize(), null,null); List plNos = this.getParkNos(pageInfo.getList()); /**根据停车场查询pda和地磁等的设备的数量*/ /**1.查询设备*/ QueryEqpRequest queryEqpRequest = new QueryEqpRequest(); queryEqpRequest.setPlNos(plNos); List eqpTypes = new ArrayList<>(); eqpTypes.add(EqpTypeEnum.ALL.getCode()); queryEqpRequest.setEqpTypes(eqpTypes); Map> deviceMap = tpPEqpQueryInnerService.statisticEqpCountGroupByPlNo( queryEqpRequest); PageBean pageBean = new PageBean<>(); PageBeanUtil.copyProperties(pageInfo, pageBean, ParkSouceDeviceStaDTO.class); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(pageBean.getDataList())) { for (ParkSouceDeviceStaDTO dto : pageBean.getDataList()) { List deviceList = this.getAllDeviceList(); Integer deviceTotal = 0; /**停车场下面的设备*/ List statisticEqpCounts = deviceMap.get(dto.getPlNo()); if (CollectionUtil.isNotEmpty(statisticEqpCounts)) { for (StatisticEqpCountByPlNoDTO statisticDto : statisticEqpCounts) { for (ParkSouceDeviceDTO parkSource : deviceList) { if (parkSource.getEqpType().equals(statisticDto.getEqpType())) { BeanUtils.copyProperties(statisticDto, parkSource); deviceTotal += statisticDto.getAllEqpNum(); } } } } dto.setDeviceTotal(deviceTotal); dto.setDeviceList(deviceList); } } return new BizResult<>(pageBean); } /** * 获取设备List-初始化 * * @param * @return * @Author: xiejianpeng * @Date: 2018/5/10 15:00 */ private List getAllDeviceList() { List deviceList = new ArrayList<>(); /**合并pda数据*/ ParkSouceDeviceDTO parkSouceDevicePDA = new ParkSouceDeviceDTO(); parkSouceDevicePDA.setEqpType(EqpTypeEnum.PDA.getCode()); parkSouceDevicePDA.setEqpName(EqpTypeEnum.PDA.getDesc()); parkSouceDevicePDA.setAllEqpNum(0); parkSouceDevicePDA.setOnlineEqpNum(0); parkSouceDevicePDA.setOffLineEqpNum(0); parkSouceDevicePDA.setFaultEqpNum(0); deviceList.add(parkSouceDevicePDA); /**合并地磁*/ ParkSouceDeviceDTO parkSouceDeviceEqp = new ParkSouceDeviceDTO(); parkSouceDeviceEqp.setEqpType(EqpTypeEnum.GEO.getCode()); parkSouceDeviceEqp.setEqpName(EqpTypeEnum.GEO.getDesc()); parkSouceDeviceEqp.setAllEqpNum(0); parkSouceDeviceEqp.setOnlineEqpNum(0); parkSouceDeviceEqp.setOffLineEqpNum(0); parkSouceDeviceEqp.setFaultEqpNum(0); deviceList.add(parkSouceDeviceEqp); /**合并地锁*/ ParkSouceDeviceDTO parkSouceDeviceLock = new ParkSouceDeviceDTO(); parkSouceDeviceLock.setEqpType(EqpTypeEnum.GROUND_LOCK.getCode()); parkSouceDeviceLock.setEqpName(EqpTypeEnum.GROUND_LOCK.getDesc()); parkSouceDeviceLock.setAllEqpNum(0); parkSouceDeviceLock.setOnlineEqpNum(0); parkSouceDeviceLock.setOffLineEqpNum(0); parkSouceDeviceLock.setFaultEqpNum(0); deviceList.add(parkSouceDeviceLock); return deviceList; } @Override public BizResult queryParkSourceDeviceByPlNo(QueryParkSourceByPlNoRequest request) { ParkSouceDeviceStaDTO parkSouceDeviceStaDTO = new ParkSouceDeviceStaDTO(); /**查询停车场信息*/ ParkingLotDTO dto = parkLotQueryBizService.QueryParkingLotByPkNo(request.getPlNo()); if (dto == null) { return new BizResult<>(parkSouceDeviceStaDTO); } BeanUtils.copyProperties(dto, parkSouceDeviceStaDTO); List plNos = new ArrayList<>(); plNos.add(request.getPlNo()); QueryEqpRequest queryEqpRequest = new QueryEqpRequest(); queryEqpRequest.setPlNos(plNos); List eqpTypes = new ArrayList<>(); eqpTypes.add(EqpTypeEnum.ALL.getCode()); queryEqpRequest.setEqpTypes(eqpTypes); Map> deviceMap = tpPEqpQueryInnerService.statisticEqpCountGroupByPlNo( queryEqpRequest); List deviceList = this.getAllDeviceList(); Integer deviceTotal = 0; /**停车场下面的设备*/ List statisticEqpCounts = deviceMap.get(request.getPlNo()); if (CollectionUtil.isNotEmpty(statisticEqpCounts)) { for (StatisticEqpCountByPlNoDTO statisticDto : statisticEqpCounts) { for (ParkSouceDeviceDTO parkSource : deviceList) { if (parkSource.getEqpType().equals(statisticDto.getEqpType())) { BeanUtils.copyProperties(statisticDto, parkSource); deviceTotal += statisticDto.getAllEqpNum(); } } } } parkSouceDeviceStaDTO.setDeviceTotal(deviceTotal); parkSouceDeviceStaDTO.setDeviceList(deviceList); return new BizResult<>(parkSouceDeviceStaDTO); } @Override public BizResult> getOrgIdsByCityIds(QueryOrgIdsByCityIdsRequest request) { List orgIds = parkingLotDao.getOrgIdsByCityIds(request); return new BizResult<>(orgIds); } @Override public BizResult queryParkNumStatisticByOrgIds(QueryParkSourceByOrgIdsRequest request) { Integer parkNum = parkingLotDao.queryParkNumStatisticByOrgIds(request); return new BizResult<>(parkNum); } @Override public BizResult queryParkNumInfoStatisticByOrgIds(QueryParkSourceByOrgIdsRequest request) { ParkNumInfoDTO dto = parkingLotDao.queryParkNumInfoStatisticByOrgIds(request); return new BizResult<>(dto); } @Override public BizResult queryChargerSignInfoByPlNos(QueryEmployeeRequest request) { ChargerSignNumberStatisticsDTO dto = new ChargerSignNumberStatisticsDTO(); /**1从排班计划表中查询收费员信息*/ DutyRosterQueryReq rostRequest = new DutyRosterQueryReq(); rostRequest.setSysCode(request.getSysCode()); rostRequest.setPlNo(request.getPlNos()); rostRequest.setStartDate(request.getBeginTime()); rostRequest.setEndDate(request.getEndTime()); rostRequest.setWorkState(Arrays.asList(WorkStateEnum.WORK.getCode())); rostRequest.setChargeCodes(request.getChargerCodes()); List dutyRosterList = dutyRosterDao.queryDutyRoster(rostRequest ); /**2从签到记录表中查询实际签到的收费员*/ QueryEmployeeRequest signRequest = new QueryEmployeeRequest(); signRequest.setSysCode(request.getSysCode()); signRequest.setPlNos(request.getPlNos()); signRequest.setBeginTime(request.getBeginTime()); signRequest.setEndTime(request.getEndTime()); signRequest.setChargerCodes(request.getChargerCodes()); List signList = signRecordDao.querySignNumByPlNos(signRequest); Integer signInTollCollector = 0; for (ParkinglotBasicFactsDTO parkinglotBasicFactsDTO : signList) { signInTollCollector += parkinglotBasicFactsDTO.getSignInTollCollector(); } /**3统计正常签到的收费员*/ /**4统计异常签到的收费员*/ /**5、收费员信息赋值**/ dto.setAllTollCollector(dutyRosterList == null ? 0 :dutyRosterList.size()); dto.setSignInTollCollector(signInTollCollector); return new BizResult<>(dto); } @Override public BizResult> queryParkDutyInfo(ParkDutyInfoQueryReq req) { if(null == req.getOrgId()){ throw new BizException(ErrorType.PARAMM_NULL,"组织ID"); } List parkDutyInfoDTOS = parkingLotDao.queryParkDutyInfo(req); return new BizResult<>(parkDutyInfoDTOS); } /** * 通过组织id查询所有停车场信息 * @Auther: wangfs * @param * @return */ @Override public BizResult> qyeryAllParkingLotByOrgId(ParkDutyInfoQueryReq req) { List listDTO = new ArrayList<>(); List parkingLots = parkingLotDao.qyeryAllParkingLotByOrgId(req); if(!CollectionUtils.isEmpty(parkingLots)){ ListCopyUtil.listCopyProperties(parkingLots,listDTO,ParkingLotDTO.class); } return new BizResult>(listDTO); } /** * 通过组织id查询所有停车场信息forHS * @Auther: wangfs * @param * @return */ @Override public BizResult> qyeryAllParkingLotByOrgIdForHS(ParkDutyInfoQueryReq req) { List listDTO = new ArrayList<>(); List parkingLots = parkingLotDao.qyeryAllParkingLotByOrgId(req); if(!CollectionUtils.isEmpty(parkingLots)){ ListCopyUtil.listCopyProperties(parkingLots,listDTO,ParkingLotHSDTO.class); } return new BizResult>(listDTO); } @Override public BizResult> queryETCParkingLot(QueryETCParkLotRequest req) { List list = parkingLotDao.queryETCParkingLot(req); if(CollectionUtils.isEmpty(list)){ return new BizResult<>(); } List dtos = Lists.newArrayList(); ListCopyUtil.listCopyProperties(list,dtos,ParkingLotDTO.class); return new BizResult<>(dtos); } @Override public BizResult> queryBusiPlNameByOrgIds(QueryParkSourceByOrgIdsRequest req) { List plNos = parkingLotDao.queryBusiPlNameByOrgIds(req); return new BizResult<>(plNos); } }