package com.zteits.park.dao.impl; import com.clouds.common.cache.park.ParkingLotCacheUtil; import com.clouds.common.constants.pagequery.PageSizeEnum; import com.clouds.common.utils.ListPageHelper; import com.clouds.common.utils.page.PageUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.xiaoleilu.hutool.util.CollectionUtil; import com.zteits.clouds.api.apibase.bean.BizResult; import com.zteits.clouds.api.apibase.constants.DataStatusEnum; import com.zteits.clouds.api.apibase.constants.ErrorType; import com.zteits.clouds.api.apibase.exception.BizException; import com.zteits.clouds.api.dto.park.dto.ParkNumInfoDTO; import com.zteits.clouds.api.dto.park.dto.ParkingLotDTO; import com.zteits.clouds.api.dto.park.dto.parksource.ParkDeviceStaForEveryDTO; import com.zteits.clouds.api.dto.park.param.*; 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.pay.PlNameDTO; import com.zteits.clouds.api.dto.pay.TdBTempParklotDTO; import com.zteits.clouds.api.dto.pay.param.ChangeBlockForParkLotRequest; import com.zteits.clouds.api.dto.pay.param.CheckUniqueForPlNameRequest; import com.zteits.clouds.api.dto.pay.param.ParkTempInfoPageQueryRequest; import com.zteits.clouds.api.dto.sys.QueryProvinceCityAreaByBlockIdsDTO; import com.zteits.clouds.api.dto.sys.param.QueryProvinceCityAreaByBlockIdsRequest; import com.zteits.clouds.api.dto.tool.dto.ParkDutyInfoDTO; import com.zteits.clouds.api.dto.tool.param.ParkDutyInfoQueryReq; import com.zteits.clouds.api.service.sys.TbAreaService; import com.zteits.park.constant.ParkConstant; import com.zteits.park.dao.ParkFreeBerthDao; import com.zteits.park.dao.ParkingLotDao; import com.zteits.park.dao.ParkingLotGeoDao; import com.zteits.park.dao.TpPRegionAreaDao; import com.zteits.park.domain.ParkingLot; import com.zteits.park.domain.*; import com.zteits.park.domain.ParkingLotExample.Criteria; import com.zteits.park.mapper.ParkingLotMapper; import com.zteits.park.mapper.smapper.ParkingLotSMapper; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.apache.commons.collections4.CollectionUtils; import org.springframework.util.StringUtils; import java.util.*; @Component public class ParkingLotDaoImpl implements ParkingLotDao { @Autowired private ParkingLotMapper parkingLotMapper; @Autowired private ParkingLotSMapper parkingLotSMapper; @Autowired private ParkingLotGeoDao parkingLotGeoDao; @Autowired private TpPRegionAreaDao tpPRegionAreaDao; @Autowired private ParkFreeBerthDao parkFreeBerthDao; @Autowired private TbAreaService tbAreaService; /** * 每一页大小. */ private static final Integer PAGE_SIZE = 500; @Override public int insertSelective(ParkingLot record) { if (record == null) { return 0; } if (record.getDataStatus() == null) { record.setDataStatus(DataStatusEnum.DATA_STATUS_VALID.value()); } return parkingLotMapper.insertSelective(record); } @Override public ParkingLot selectByPrimaryKey(Long plId) { return parkingLotMapper.selectByPrimaryKey(plId); } @Override public int updateByPrimaryKeySelective(ParkingLot record) { return parkingLotMapper.updateByPrimaryKeySelective(record); } @Override public String countByPlCountryId(Long plCountryId, Integer state) { return parkingLotSMapper.queryMaxPlNoByPlCountryId(plCountryId, state); } @Override public List queryParkLotByGeoHashs(Set geoHashs) { return parkingLotSMapper.queryParkingLotByGeoHash(geoHashs); } @Override public Long queryTabParkCountByDistance(Set geoHashs) { return parkingLotSMapper.queryTabParkCountByDistance(geoHashs); } @Override public List queryParkingLotAndGeo(ParkingLot record) { return parkingLotSMapper.queryParkingLotAndGeo(record); } @Override public long countByExample(ParkingLotExample example) { return parkingLotMapper.countByExample(example); } @Override @Transactional public Boolean deleteParkingLotByPlNos(List plNos, Long opId) { //判断停车场下面是否有泊位区间 Map areaNums = tpPRegionAreaDao.queryParkAreaNum(plNos); Long allAreaNums = areaNums.values().stream().mapToLong(e -> e).sum(); if (allAreaNums != null && allAreaNums > 0) { throw new BizException(ErrorType.NOT_ALLOW_DEL_PARK); } //删除停车场表 ParkingLotExample example = new ParkingLotExample(); ParkingLot record = new ParkingLot(); record.setModifyTime(new Date()); record.setModifyOp(opId); record.setDataStatus(DataStatusEnum.DATA_STATUS_NO_VALID.value()); example.createCriteria().andPlNoIn(plNos); parkingLotMapper.updateByExampleSelective(record, example); //删除停车场相关缓存 plNos.forEach(plNo -> ParkingLotCacheUtil.deleteParkLotByPlNo(plNo)); //删除经纬度 parkingLotGeoDao.deleteParkingLotGeoByPlNos(plNos, opId); //删除空闲车位 parkFreeBerthDao.deleteParkFreeBerth(plNos, opId); return true; } @Override public List queryParkingLotByPlOutNos(List plOutNos) { ParkingLotExample record = new ParkingLotExample(); record.createCriteria().andPlOutNoIn(plOutNos).andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); //查询停车场泊位信息 List parkinglots = parkingLotMapper.selectByExample(record); return parkinglots; } @Override public ParkingLotDTO queryParkingLotInfoByPlOutNo(String plOutNo) { //查询缓存 ParkingLotDTO dto = ParkingLotCacheUtil.getParkLotByPlOutNo(plOutNo); if (dto == null) { dto = new ParkingLotDTO(); //查询数据库 ParkingLot parkingLot = new ParkingLot(); List plOutNos = Lists.newArrayList(); plOutNos.add(plOutNo); List parkingLots = this.queryParkingLotByPlOutNos(plOutNos); parkingLot = CollectionUtils.isEmpty(parkingLots) ? null : parkingLots.get(0); if (parkingLot != null) { BeanUtils.copyProperties(parkingLot, dto); //放入缓存 ParkingLotCacheUtil.setParkLotByPlOutNo(plOutNo, dto); } } return dto; } @Override public ParkingLot queryParkingLotInfoByPlNo(String plNo) { ParkingLotExample record = new ParkingLotExample(); record.createCriteria().andPlNoEqualTo(plNo).andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); //查询停车场泊位信息 List parkinglots = parkingLotMapper.selectByExample(record); if (!CollectionUtils.isEmpty(parkinglots)) { return parkinglots.get(0); } return null; } @Override public List StatisticParkLotCountByCountry(Long cityId, Integer state) { return parkingLotSMapper.statisticParkLotCountByCountry(cityId, state); } @Override public List queryParkLotByCountry(Long cityId, Integer state) { return parkingLotSMapper.queryParkLotByCountry(cityId, state); } @Override public List queryParkLotByProvAndCity(Long provId, Long cityId, Integer state) { return parkingLotSMapper.queryParkLotByProvAndCity(provId, cityId, state); } @Override public PageInfo queryParkLotByCountryAndParkName(List plNos, Long cityId, List countryIds, String parkNameOrAddress, Integer pageNum, Integer pageSize, Integer state, List plTypes) { // 1.设置分页信息 PageHelper.startPage(pageNum, pageSize); //2.查询数据 List list = parkingLotSMapper.queryParkLotByCountryAndParkName(plNos, cityId, countryIds, parkNameOrAddress, state, plTypes); return new PageInfo(list); } @Override public List queryParkLotByCountryAndParkNameOfNoPage(Long cityId, List countryIds, String parkNameOrAddress, Integer state) { List list = parkingLotSMapper.queryParkLotByCountryAndParkName(null, cityId, countryIds, parkNameOrAddress, state, null); return list; } @Override public List queryParkingLotAndGeoInfo(ParkingLotAndGeoDO parkingLotAndGeoDO) { return parkingLotSMapper.queryParkingLotAndGeoInfo(parkingLotAndGeoDO); } @Override public List queryPlNoCountryAndParkNameAndAddress(List countryIds, String parkNameOrAddres, Integer state) { if (CollectionUtil.isEmpty(countryIds)) { return new ArrayList<>(); } return parkingLotSMapper.queryPlNoCountryAndParkNameAndAddress(countryIds, parkNameOrAddres, state); } @Override public PageInfo queryParkingLotByPark(ParkingLotQueryPageDO parkingLot, Integer pageNum, Integer pageSize) { // 1.设置分页信息 PageHelper.startPage(pageNum, pageSize); // 2、查询数据 List list = parkingLotSMapper.queryParkingLotByPark(parkingLot); return new PageInfo(list); } @Override public long queryBerthNoByPlnos(List plNos) { if (CollectionUtil.isEmpty(plNos)) { return 0; } return parkingLotSMapper.queryBerthNoByPlnos(plNos); } @Override public Integer updateParkInfoByPlOutNo(ParkingLot parkingLot) { ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andPlOutNoEqualTo(parkingLot.getPlOutNo()); return parkingLotMapper.updateByExampleSelective(parkingLot, example); } @Override public List queryParkInfoByAreaBlockIds(ParkInfoByAreaBlockIdsRequest parkInfoByAreaBlockIdsRequest) { List areaTreeList = new ArrayList(); List list = parkInfoByAreaBlockIdsRequest.getAreaBlockIds(); if (!CollectionUtils.isEmpty(list)) { //500条分一页查询停车场 ListPageHelper pageInfo = new ListPageHelper(list, PAGE_SIZE); for (int i = 1; i <= pageInfo.getTotalPages(); i++) { List listDO = parkingLotSMapper.queryParkInfoByAreaBlockIds(pageInfo.getPagedList(i), ParkConstant.state.USED); if (!CollectionUtils.isEmpty(listDO)) { areaTreeList.addAll(listDO); } } } return areaTreeList; } @Override public List statisticParkLotCountByCountryForPlType(Long cityId, Integer state) { return parkingLotSMapper.statisticParkLotCountByCountryForPlType(cityId, state); } @Override public List queryAllPlNo(Integer state) { return parkingLotSMapper.queryAllPlNo(state); } @Override public PageInfo queryParkTempInfoPage(ParkTempInfoPageQueryRequest request) { PageHelper.startPage(request.getBaseRequest().getPageNum(), request.getBaseRequest().getPageSize()); List dtos = parkingLotSMapper.queryParkTempInfoPage(); return new PageInfo<>(dtos); } @Override public List queryParkListByPark(QueryParkListByParkRequest request) { return parkingLotSMapper.queryParkListByPark(request); } @Override public List queryParkListAll() { return parkingLotSMapper.queryParkListAll(); } @Override public List queryParkingLotByPlNos(List plNos) { if (CollectionUtil.isEmpty(plNos)) { return null; } ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andPlNoIn(plNos); return parkingLotMapper.selectByExample(example); } /** * 通过服务点id查询停车场-分页 * * @param request * @return * @throws Exception 2017年12月28日 wangfs.
*/ @Override public PageInfo queryParkingLotForPageByAreaBlockId(QueryParkingLotByAreaBlockRequest request) { //1.设置分页 PageHelper.startPage(request.getBaseRequest().getPageNum(), request.getBaseRequest().getPageSize()); //2.设置分页 List list = parkingLotSMapper.queryParkingLotByAreaBlockId(request); return new PageInfo(list); } /** * 通过服务点id查询停车场 * * @param request * @return * @throws Exception 2017年12月28日 wangfs.
*/ @Override public List queryParkingLotListByAreaBlockId(QueryParkingLotByAreaBlockRequest request) { List list = parkingLotSMapper.queryParkingLotByAreaBlockId(request); return list; } /** * 校验停车场名称唯一性.
* * @param request * @return 2018年1月4日 wangfs.
*/ @Override public Boolean checkUniqueForPlName(CheckUniqueForPlNameRequest request) { int selectCounts = parkingLotSMapper.checkUniqueForPlName(request); return selectCounts > 0 ? true : false; } /** * 更新停车场块信息.
* * @param request * @return 2018年1月4日 wangfs.
*/ @Transactional(rollbackFor = Exception.class) @Override public Boolean updateBlockForParkLot(ChangeBlockForParkLotRequest request) { int updateCount = parkingLotSMapper.updateBlockForParkLot(request); if (updateCount > 0) { // 更新缓存中的停车场对应的块信息 if (!CollectionUtils.isEmpty(request.getPlNos())) { ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andPlNoIn(request.getPlNos()); final List parkingLots = parkingLotMapper.selectByExample(example); if (!CollectionUtil.isEmpty(parkingLots)) { //更新缓存中的块信息 for (ParkingLot parkingLot : parkingLots) { ParkingLotDTO parkLotByPlNo = ParkingLotCacheUtil.getParkLotByPlNo(parkingLot.getPlNo()); parkLotByPlNo.setPlAreaBlockName(request.getPlAreaBlockName()); ParkingLotCacheUtil.setParkLotByPlNo(parkingLot.getPlNo(), parkLotByPlNo); } } } } return updateCount > 0 ? true : false; } /** * 更新停车场块信息.
* * @param request * @return 2018年1月4日 wangfs.
*/ @Transactional(rollbackFor = Exception.class) @Override public Boolean updateAreaBlockForParkLot(ChangeBlockForParkLotRequest request) { /** * 更新停车场省份、地市、区县、块信息 */ ParkingLot parkingLotUpdate = new ParkingLot(); List list = new ArrayList<>(); list.add(request.getPlAreaBlockId()); QueryProvinceCityAreaByBlockIdsRequest req = new QueryProvinceCityAreaByBlockIdsRequest(); req.setBlockIds(list); req.setSysCode("1001"); BizResult> listBizResult = tbAreaService.queryProvinceCityAreaByBlockIdsRequest(req); if(null != listBizResult && !CollectionUtils.isEmpty(listBizResult.getData())){ for(QueryProvinceCityAreaByBlockIdsDTO dto:listBizResult.getData()){ if(null == dto){ continue; } parkingLotUpdate.setPlProvinceId(dto.getProvinceId()); parkingLotUpdate.setPlProvinceName(dto.getProvinceName()); parkingLotUpdate.setPlCityId(dto.getCityId()); parkingLotUpdate.setPlCityName(dto.getCityName()); parkingLotUpdate.setPlCountryId(dto.getAreaId()); parkingLotUpdate.setPlCountryName(dto.getAreaName()); } } parkingLotUpdate.setPlAreaBlockId(request.getPlAreaBlockId()); parkingLotUpdate.setPlAreaBlockName(request.getPlAreaBlockName()); ParkingLotExample exampleUpdate = new ParkingLotExample(); exampleUpdate.createCriteria().andPlNoIn(request.getPlNos()); int updateCount = parkingLotMapper.updateByExampleSelective(parkingLotUpdate,exampleUpdate); if (updateCount > 0) { // 更新缓存中的停车场对应的块信息 if (!CollectionUtils.isEmpty(request.getPlNos())) { ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andPlNoIn(request.getPlNos()); final List parkingLots = parkingLotMapper.selectByExample(example); if (!CollectionUtil.isEmpty(parkingLots)) { //更新缓存中的块信息 for (ParkingLot parkingLot : parkingLots) { ParkingLotDTO parkLotByPlNo = ParkingLotCacheUtil.getParkLotByPlNo(parkingLot.getPlNo()); parkLotByPlNo.setPlAreaBlockName(request.getPlAreaBlockName()); ParkingLotCacheUtil.setParkLotByPlNo(parkingLot.getPlNo(), parkLotByPlNo); } } } } return updateCount > 0 ? true : false; } /** * 通过办事处id更新停车场块信息.
* * @param request * @return 2018年1月4日 wangfs.
*/ @Override public Boolean updateParkLotBlockNameByBlockId(ChangeBlockForParkLotRequest request) { int updateCount = parkingLotSMapper.updateParkLotBlockNameByBlockId(request); if (updateCount > 0) { //查询该块下面的停车场,修改车场缓存中的块信息 ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andPlAreaBlockIdEqualTo(request.getPlAreaBlockId()); final List parkingLots = parkingLotMapper.selectByExample(example); if (CollectionUtil.isEmpty(parkingLots)) { return true; } //更新缓存中的块信息 for (ParkingLot parkingLot : parkingLots) { ParkingLotDTO parkLotByPlNo = ParkingLotCacheUtil.getParkLotByPlNo(parkingLot.getPlNo()); parkLotByPlNo.setPlAreaBlockName(request.getPlAreaBlockName()); ParkingLotCacheUtil.setParkLotByPlNo(parkingLot.getPlNo(), parkLotByPlNo); } } return updateCount > 0 ? true : false; } @Override public PageInfo queryParkLotExtByState(List states, Integer pageNum, Integer pageSize) { pageNum = pageNum == null || pageNum == 0 ? 1 : pageNum; pageSize = PageUtil.pageSizeValidate(PageSizeEnum.PAGE_SIZE_BASE, pageSize); PageHelper.startPage(pageNum, pageSize); List parkingLotExtDOS = parkingLotSMapper.queryParkLotExtByState(states); return new PageInfo<>(parkingLotExtDOS); } @Override public String queryPlNoByPlOutNo(String plOutNo) { return parkingLotSMapper.queryPlNoByPlOutNo(plOutNo); } @Override public Integer queryPlBerthNumByPlOutNo(String plOutNo) { return parkingLotSMapper.queryPlBerthNumByPlOutNo(plOutNo); } @Override public List queryParkLotByOrgIdAndPlNos(Long orgId, List plNos, Integer plType) { ParkingLotExample example = new ParkingLotExample(); Criteria sql = example.createCriteria().andOrgIdEqualTo(orgId).andDataStatusEqualTo( DataStatusEnum.DATA_STATUS_VALID.value()); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(plNos)) { sql.andPlNoIn(plNos); } if (null != plType) { sql.andPlTypeEqualTo(plType); } return parkingLotMapper.selectByExample(example); } @Override public List getOrgIdsByCityIds(QueryOrgIdsByCityIdsRequest request) { return parkingLotSMapper.getOrgIdsByCityIds(request); } @Override public List queryDeviceStatistic(QueryParkSourceByOrgIdsRequest request) { return parkingLotSMapper.queryDeviceStatistic(request); } @Override public Integer queryParkNumStatisticByOrgIds(QueryParkSourceByOrgIdsRequest request) { return parkingLotSMapper.queryParkNumStatisticByOrgIds(request); } @Override public ParkNumInfoDTO queryParkNumInfoStatisticByOrgIds(QueryParkSourceByOrgIdsRequest request) { return parkingLotSMapper.queryParkNumInfoStatisticByOrgIds(request); } @Override public List queryParkDutyInfo(ParkDutyInfoQueryReq req) { return parkingLotSMapper.queryParkDutyInfo(req); } @Override public List qyeryAllParkingLotByOrgId(ParkDutyInfoQueryReq req) { ParkingLotExample example = new ParkingLotExample(); Criteria sql = example.createCriteria(); sql.andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andOrgIdEqualTo(req.getOrgId()) .andStateEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); if (req.getPlBusiType() != null && !("3".equals(req.getPlBusiType()))) { //判断是否自营 营业类型:1:自营,2:非自营 3:全部 sql.andPlBusiTypeEqualTo(req.getPlBusiType()); } if(!CollectionUtils.isEmpty(req.getAreaCardTypes())){ sql.andAreaTypeIn(req.getAreaCardTypes()); } if(!CollectionUtils.isEmpty(req.getPlTypes())){ sql.andPlTypeIn(req.getPlTypes()); } if(!StringUtils.isEmpty(req.getPlName())){ sql.andPlNameLike("%"+req.getPlName()+"%"); } List parkingLots = parkingLotMapper.selectByExample(example); return parkingLots; } @Override public List queryBusiPlNameByOrgIds(QueryParkSourceByOrgIdsRequest req) { List plNos = parkingLotSMapper.queryBusiPlNameByOrgIds(req.getOrgIds()); List realPlNos = new ArrayList<>(); realPlNos.add("-1"); if(CollectionUtils.isEmpty(plNos)){ return realPlNos; } return plNos; } @Override public List queryPlNameByPlNo(QueryPlNameRequest request) { return parkingLotSMapper.queryPlNameByPlNo(request); } @Override public List queryETCParkingLot(QueryETCParkLotRequest req) { ParkingLotExample example = new ParkingLotExample(); example.createCriteria().andSupportEtcEqualTo(1) .andOrgIdEqualTo(req.getOrgId()) .andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()); return parkingLotMapper.selectByExample(example); } /** * 停车场最大编码获取:以 PL 或者 TL 开头的 * @param prefixStr * @return */ @Override public String selectMaxPlNO(String prefixStr) { return parkingLotSMapper.selectMaxPlNO(prefixStr); } @Override public List queryParkListByOrgId(QueryParkListByParkRequest request) { ParkingLotExample example = new ParkingLotExample(); if(!StringUtils.isEmpty(request.getPushState())){ example.createCriteria() .andPushStateEqualTo(request.getPushState()); } if(!StringUtils.isEmpty(request.getPlType())){ example.createCriteria() .andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andOrgIdEqualTo(request.getOrgId()) .andPlTypeEqualTo(NumberUtils.toInt(request.getPlType())); }else{ example.createCriteria() .andDataStatusEqualTo(DataStatusEnum.DATA_STATUS_VALID.value()) .andOrgIdEqualTo(request.getOrgId()) .andSourceTypeIn(request.getSourceTypes()); } List parkingLots = this.parkingLotMapper.selectByExample(example); return parkingLots; } }