package com.sysu.admin.controller.aland; import com.querydsl.core.types.Predicate; import com.querydsl.core.types.dsl.BooleanExpression; import com.sysu.admin.controller.city.CityRepository; import com.sysu.admin.controller.city.DistrictRepository; import com.sysu.admin.controller.city.DistrictService; import com.sysu.admin.controller.city.TownService; import com.sysu.admin.support.base.BaseService; import com.sysu.admin.utils.MySimpleDateFormat; import com.sysu.admin.utils.TextUtil; import com.xiesx.fastboot.core.jpa.JpaPlusRepository; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.*; @Service("LandService2") public class LandService extends BaseService { @Autowired LandRepository landRepository; @Autowired TownService townService; @Autowired DistrictService districtService; @Autowired DistrictRepository districtRepository; @Autowired CityRepository cityRepository; public List getLandAreaStat(Date date, String districtCode, String city){ Double percent = getPercent(date); List res = null; Map namesMap = null; if(districtCode != null){ namesMap = townService.getNames(districtCode); res = landRepository.statTownParcelTypeAll(districtCode); return getLandAreaStat(res,percent,namesMap); } if(city != null){ namesMap = districtService.getNames(city); res = landRepository.statDistrictParcelTypeAll(city.substring(0,4) + "%"); return getLandAreaStat(res,percent,namesMap); } throw new RuntimeException("district 和 city 至少需要一个"); } public List getLandAreaStat(List res ,Double percent, Map namesMap){ List townStatList = new ArrayList<>(30); TownStat sumStat = new TownStat(); sumStat.setTownName("汇总信息"); townStatList.add(sumStat); Integer currentTownId = null; TownStat townStat = null; HashMap sumMap = new HashMap<>(); for(Object[] o : res){ if(currentTownId == null || !o[0].toString().equals(currentTownId.toString())){ townStat = new TownStat(); townStat.setList(new ArrayList<>()); currentTownId = Integer.valueOf(o[0].toString()); townStat.setTownId(currentTownId); townStat.setTownName(namesMap.get(currentTownId)); townStatList.add(townStat); } LandAreaStat bean = new LandAreaStat(); bean.setParcelType(Integer.valueOf(o[1].toString())); bean.setColor(LandAreaStat.castColor(bean.getParcelType())); bean.setName(LandAreaStat.castName(bean.getParcelType())); Double area = (Double)o[2]; bean.setArea((area + area / 2) / 1000); bean.setArea(bean.getArea() * percent); bean.setCount(Integer.valueOf(o[3].toString())); townStat.getList().add(bean); //汇总信息 LandAreaStat sum = sumMap.get(bean.getParcelType()); if(sum == null){ sum = new LandAreaStat(bean.getParcelType(), bean.getName(), bean.getColor()); sumMap.put(bean.getParcelType().toString(), sum); } sum.setArea(sum.getArea() + bean.getArea()); sum.setCount(sum.getCount() + bean.getCount()); } //组装汇总List LandAreaStat[] sumArrays = new LandAreaStat[sumMap.size()]; for(String key : sumMap.keySet()){ sumArrays[Integer.valueOf(key)] = sumMap.get(key); } sumStat.setList(Arrays.asList(sumArrays)); return townStatList; } public Double getPercent(Date date){ if(date == null){ return 1.0; } String mm = TextUtil.leftSubstring("-",TextUtil.rightSubstring("-", MySimpleDateFormat.formatDate(date))); Double percent = Double.parseDouble("1." + Integer.parseInt(mm) % 5); return percent; } public List getCropAreaStat(Date date, String districtCode, String city){ Double percent = getPercent(date); List res = null; Map namesMap = null; if(districtCode != null){ namesMap = townService.getNames(districtCode); res = landRepository.statTownCropTypeAll(districtCode); return getCropAreaStat(res,percent,namesMap); } if(city != null){ namesMap = districtService.getNames(city); res = landRepository.statDistrictCropTypeAll(city.substring(0,4) + "%"); return getCropAreaStat(res,percent,namesMap); } throw new RuntimeException("district 和 city 至少需要一个"); } public List getCropAreaStat(List res ,Double percent, Map namesMap){ List townStatList = new ArrayList<>(30); TownStatCrop sumStat = new TownStatCrop(); sumStat.setTownName("汇总信息"); townStatList.add(sumStat); Integer currentTownId = null; TownStatCrop townStat = null; HashMap sumMap = new HashMap<>(); for(Object[] o : res){ if(currentTownId == null || !o[0].toString().equals(currentTownId.toString())){ townStat = new TownStatCrop(); townStat.setList(new ArrayList<>()); currentTownId = Integer.valueOf(o[0].toString()); townStat.setTownId(currentTownId); townStat.setTownName(namesMap.get(currentTownId)); townStatList.add(townStat); } CropAreaStat bean = new CropAreaStat(); bean.setCropType(o[1].toString()); bean.setColor(CropAreaStat.castColor(bean.getCropType())); bean.setName(CropAreaStat.castName(bean.getCropType())); Double area = (Double)o[2]; bean.setArea((area + area / 2) / 1000); bean.setArea(bean.getArea() * percent); bean.setCount(Integer.valueOf(o[3].toString())); townStat.getList().add(bean); //汇总信息 CropAreaStat sum = sumMap.get(bean.getCropType()); if(sum == null){ sum = new CropAreaStat(bean.getCropType(), bean.getName(), bean.getColor()); sumMap.put(bean.getCropType(), sum); } sum.setArea(sum.getArea() + bean.getArea()); sum.setCount(sum.getCount() + bean.getCount()); } //组装汇总List CropAreaStat[] sumArrays = new CropAreaStat[sumMap.size()]; for(String key : sumMap.keySet()){ sumArrays[CropAreaStat.getCropTypeIndex(key)] = sumMap.get(key); } sumStat.setList(Arrays.asList(sumArrays)); return townStatList; } public List list(String district, Integer townId, Integer limit, String cropType){ limit = limit == null ? 50 : limit; String wkt = null; if(townId != null) { wkt = townService.findWktById(townId); }else if(StringUtils.isNotBlank(district)) { wkt = districtRepository.findWktByCode(district); } if(wkt == null) { Predicate predicate = null; Pageable pageable = PageRequest.of(1, limit, Sort.by(Land.FIELDS.id)); QLand qLand = QLand.land; if(StringUtils.isNotBlank(cropType)){ return landRepository.findAll(qLand.crop_type.eq(cropType), pageable).toList(); }else{ return landRepository.findAll(pageable).toList(); } }else{ return StringUtils.isNotBlank(cropType) ? landRepository.findListByWktAndCropType(wkt, cropType, limit) : landRepository.findListByWkt(wkt, limit); } } public Land findByPoint(Double[] point){ return landRepository.findByPoint("Point("+point[0]+" "+point[1]+")"); } @Override public JpaPlusRepository r() { return landRepository; } }