|
@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.ruoyi.common.core.utils.bean.BeanUtils;
|
|
|
import com.usky.common.core.bean.CommonPage;
|
|
|
import com.usky.common.core.exception.BusinessException;
|
|
|
import com.usky.common.core.util.Arith;
|
|
@@ -22,9 +24,10 @@ import com.usky.fire.service.DemFileLabelService;
|
|
|
import com.usky.fire.service.DemFireLabelAttributeService;
|
|
|
import com.usky.fire.service.DemFireStatisticsAttachService;
|
|
|
import com.usky.fire.service.DemFireStatisticsService;
|
|
|
+import com.usky.fire.service.po.FireStatisticsPO;
|
|
|
import com.usky.fire.service.util.OnlineMethod;
|
|
|
-import com.usky.fire.service.vo.DemFireStatisticsVo;
|
|
|
-import com.usky.fire.service.vo.ParameterVo;
|
|
|
+import com.usky.fire.service.vo.*;
|
|
|
+import io.lettuce.core.dynamic.support.ReflectionUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -32,6 +35,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -561,4 +566,189 @@ public class DemFireStatisticsServiceImpl extends AbstractCrudService<DemFireSta
|
|
|
}
|
|
|
return avgList;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<FireLevelRatioVO> getGroupByLevel(String startTime, String endTime, String address) {
|
|
|
+ List<FireLevelRatioVO> list = new ArrayList<>();
|
|
|
+ int fireCount = 0;
|
|
|
+ List<String> fireCauses = demFireStatisticsAttachService.getFireType();
|
|
|
+ for (String cause : fireCauses) {
|
|
|
+ if (StringUtils.isBlank(cause)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ FireLevelRatioVO fireLevelRatioVo = new FireLevelRatioVO();
|
|
|
+ fireLevelRatioVo.setFireType(cause);
|
|
|
+ List<String> fireNumberList = new ArrayList<>();
|
|
|
+ if (StringUtils.isNotBlank(cause)) {
|
|
|
+ LambdaQueryWrapper<DemFireStatisticsAttach> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.select(DemFireStatisticsAttach::getFireNumber)
|
|
|
+ .eq(DemFireStatisticsAttach::getFireCauseType1, cause);
|
|
|
+ List<DemFireStatisticsAttach> list1 = demFireStatisticsAttachService.list(queryWrapper);
|
|
|
+ if (CollectionUtils.isNotEmpty(list1)) {
|
|
|
+ for (int i = 0; i < list1.size(); i++) {
|
|
|
+ fireNumberList.add(list1.get(i).getFireNumber());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LambdaQueryWrapper<DemFireStatistics> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.like(StringUtils.isNotBlank(address), DemFireStatistics::getFireAddress, address)
|
|
|
+ .between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), DemFireStatistics::getFireTime, startTime, endTime);
|
|
|
+ Integer count = this.count(queryWrapper);
|
|
|
+ fireLevelRatioVo.setRadio(count.doubleValue());
|
|
|
+ list.add(fireLevelRatioVo);
|
|
|
+ fireCount += count;
|
|
|
+ }
|
|
|
+ //排序
|
|
|
+ List<FireLevelRatioVO> orderByList = list.stream().sorted(Comparator.comparing(FireLevelRatioVO::getRadio).reversed()).limit(10).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //差集求和
|
|
|
+ double sum = list.stream().filter(item -> !orderByList.contains(item)).mapToDouble(FireLevelRatioVO::getRadio).sum();
|
|
|
+ orderByList.stream().filter(item -> "其他".equals(item.getFireType())).findAny()
|
|
|
+ .map(fireLevelRatio -> {
|
|
|
+ fireLevelRatio.setRadio(fireLevelRatio.getRadio() + sum);
|
|
|
+ return fireLevelRatio;
|
|
|
+ }
|
|
|
+ ).orElseGet(() -> {
|
|
|
+ FireLevelRatioVO fireLevelRatioVo = new FireLevelRatioVO();
|
|
|
+ fireLevelRatioVo.setFireType("其他");
|
|
|
+ fireLevelRatioVo.setRadio(sum);
|
|
|
+ orderByList.add(fireLevelRatioVo);
|
|
|
+ return fireLevelRatioVo;
|
|
|
+ });
|
|
|
+ int finalFireCount = fireCount;
|
|
|
+ if (0 != finalFireCount) {
|
|
|
+ orderByList.forEach(fireLevelRatio -> fireLevelRatio.setRadio(Arith.div(fireLevelRatio.getRadio(), finalFireCount)));
|
|
|
+ }
|
|
|
+ return orderByList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CommonPage<FireStatisticsPO> page(Integer current, Integer size, String startTime, String endTime, String address) {
|
|
|
+ Page<DemFireStatistics> page = new Page<>(current, size);
|
|
|
+ LambdaQueryWrapper<DemFireStatistics> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), DemFireStatistics::getFireTime, startTime, endTime)
|
|
|
+ .like(StringUtils.isNotBlank(address), DemFireStatistics::getFireAddress, address)
|
|
|
+ .orderByDesc(DemFireStatistics::getDeathToll);
|
|
|
+ page = this.page(page, queryWrapper);
|
|
|
+ List<Map<String, String>> listmap = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(page.getRecords())) {
|
|
|
+ List<String> fireNumberList = new ArrayList<>();
|
|
|
+ for (int i = 0; i < page.getRecords().size(); i++) {
|
|
|
+ fireNumberList.add(page.getRecords().get(i).getFireNumber());
|
|
|
+ }
|
|
|
+ LambdaQueryWrapper<DemFireStatisticsAttach> queryWrapper1 = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper1.in(DemFireStatisticsAttach::getFireNumber, fireNumberList);
|
|
|
+ List<DemFireStatisticsAttach> list = demFireStatisticsAttachService.list(queryWrapper1);
|
|
|
+ AtomicReference<Map<String, String>> stringStringMap = new AtomicReference<>();
|
|
|
+ listmap = page.getRecords().stream().map(m -> {
|
|
|
+ list.stream().filter(m2 -> Objects.equals(m.getFireNumber(), m2.getFireNumber())).forEach(m2 -> {
|
|
|
+ stringStringMap.set(convertObjectToMap(m));
|
|
|
+ Map<String, String> stringStringMap1 = convertObjectToMap(m2);
|
|
|
+ stringStringMap.get().putAll(stringStringMap1);
|
|
|
+ });
|
|
|
+ return stringStringMap.get();
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<FireStatisticsPO> list = listmap
|
|
|
+ .stream()
|
|
|
+ .map(this::enhanceFireStatisticsPo).collect(Collectors.toList());
|
|
|
+ //筛选出精度和维度是空的数据
|
|
|
+ List<FireStatisticsPO> isNullData = list.stream()
|
|
|
+ .filter(fireStatisticsPo -> 0.00 == fireStatisticsPo.getLatitude())
|
|
|
+ .filter(fireStatisticsPo -> StringUtils.isNotBlank(fireStatisticsPo.getAddress()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ List<List<FireStatisticsPO>> subSets = Lists.partition(isNullData, 10);
|
|
|
+ for (List<FireStatisticsPO> listLimit : subSets) {
|
|
|
+ String addressList = listLimit.stream().map(FireStatisticsPO::getAddress).collect(Collectors.joining("|"));
|
|
|
+ List<LocateInfo> lonLat = OnlineMethod.getLonLat(addressList);
|
|
|
+ if (CollectionUtils.isNotEmpty(lonLat)) {
|
|
|
+ for (FireStatisticsPO fireStatisticsPo : listLimit) {
|
|
|
+ fireStatisticsPo.setLatitude(lonLat.get(listLimit.indexOf(fireStatisticsPo)).getLatitude());
|
|
|
+ fireStatisticsPo.setLongitude(lonLat.get(listLimit.indexOf(fireStatisticsPo)).getLongitude());
|
|
|
+ fireStatisticsPo.setDistrict(lonLat.get(listLimit.indexOf(fireStatisticsPo)).getDistrict());
|
|
|
+ fireStatisticsPo.setStreet(lonLat.get(listLimit.indexOf(fireStatisticsPo)).getStreet());
|
|
|
+
|
|
|
+ }
|
|
|
+ baseMapper.updateList(listLimit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return new CommonPage<>(list, page.getTotal(), page.getSize(), page.getCurrent());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<FireBubbleVO> getAvgAndSum(String startTime, String endTime, String fireType, String unitId) {
|
|
|
+ List<FireBubbleVO> fireBubbleVOS = new ArrayList<>();
|
|
|
+ List<String> fireNumberList = new ArrayList<>();
|
|
|
+ if (StringUtils.isNotBlank(fireType)) {
|
|
|
+ LambdaQueryWrapper<DemFireStatisticsAttach> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.select(DemFireStatisticsAttach::getFireNumber)
|
|
|
+ .eq(DemFireStatisticsAttach::getFireCauseType1, fireType);
|
|
|
+ List<DemFireStatisticsAttach> list = demFireStatisticsAttachService.list(queryWrapper);
|
|
|
+ if (CollectionUtils.isNotEmpty(list)) {
|
|
|
+ for (int i = 0; i < list.size(); i++) {
|
|
|
+ fireNumberList.add(list.get(i).getFireNumber());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ QueryWrapper<DemFireStatistics> query = Wrappers.query();
|
|
|
+ query.select("administrative_division as region", "IFNULL(sum(death_toll),0) as deathPerson", "IFNULL(avg(burned_area),0.00) as fireArea", "count(1) as fireCount")
|
|
|
+ .eq(StringUtils.isNotBlank(unitId), "company_code", unitId)
|
|
|
+ .between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), "fire_time", startTime, endTime)
|
|
|
+ .in(CollectionUtils.isNotEmpty(fireNumberList), "fire_number", fireNumberList)
|
|
|
+ .groupBy("administrative_division");
|
|
|
+ List<Map<String, Object>> list = this.listMaps(query);
|
|
|
+// list = list.stream().filter(s -> s.get("region").toString().contains("派出所")).collect(Collectors.toList());
|
|
|
+ list.forEach(s -> {
|
|
|
+ FireBubbleVO fireBubbleVo = new FireBubbleVO();
|
|
|
+ if (s.get("region").toString().contains("派出所")){
|
|
|
+ fireBubbleVo.setRegion(s.get("region").toString().replace("派出所",""));
|
|
|
+ }else {
|
|
|
+ fireBubbleVo.setRegion(s.get("region").toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ fireBubbleVo.setFireCount(Integer.valueOf(s.get("fireCount").toString()));
|
|
|
+ fireBubbleVo.setDeathToll(Double.valueOf(s.get("deathPerson").toString()));
|
|
|
+ fireBubbleVo.setFireArea(Double.valueOf(s.get("fireArea").toString()));
|
|
|
+ fireBubbleVOS.add(fireBubbleVo);
|
|
|
+ });
|
|
|
+ return fireBubbleVOS;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public FireStatisticsPO enhanceFireStatisticsPo(Map<String, String> map) {
|
|
|
+ FireStatisticsPO fireStatisticsPo = new FireStatisticsPO();
|
|
|
+ fireStatisticsPo.setId(Optional.ofNullable(map.get("fireNumber")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setAddress(Optional.ofNullable(map.get("fireAddress")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setBurnedArea(Optional.ofNullable(map.get("burnedArea")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setPropertyLoss(Optional.ofNullable(map.get("directPropertyLoss")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setDeathToll(Optional.ofNullable(map.get("deathToll")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setNonFatal(Optional.ofNullable(map.get("victimNumber")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setDisasterHome(Optional.ofNullable(map.get("affectedHouse")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setFireCause(Optional.ofNullable(map.get("fireCauseType1")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setFireLevel(Optional.ofNullable(map.get("fireGrade")).filter(s -> !"null".equals(s)).orElse(""));
|
|
|
+ fireStatisticsPo.setLongitude(Double.valueOf(Optional.ofNullable(map.get("longitude")).filter(StringUtils::isNotBlank).orElse("0.00")));
|
|
|
+ fireStatisticsPo.setLatitude(Double.valueOf(Optional.ofNullable(map.get("latitude")).filter(StringUtils::isNotBlank).orElse("0.00")));
|
|
|
+ fireStatisticsPo.setDistrict(map.get("district"));
|
|
|
+ fireStatisticsPo.setStreet(map.get("street"));
|
|
|
+ fireStatisticsPo.setPlaceOne(map.get("initialFuelType1"));
|
|
|
+ fireStatisticsPo.setPlaceTwo(map.get("initialFuelType2"));
|
|
|
+ fireStatisticsPo.setFireGoodsOne(map.get("fireSiteType1"));
|
|
|
+ fireStatisticsPo.setFireGoodsTwo(map.get("fireSiteType2"));
|
|
|
+ fireStatisticsPo.setNature(map.get("useCharacterName"));
|
|
|
+ return fireStatisticsPo;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static Map<String, String> convertObjectToMap(Object obj) {
|
|
|
+ return Arrays.stream(BeanUtils.getPropertyDescriptors(obj.getClass()))
|
|
|
+ .filter(pd -> !"class".equals(pd.getName()))
|
|
|
+ .collect(HashMap::new,
|
|
|
+ (map, pd) -> {
|
|
|
+ if (ReflectionUtils.invokeMethod(pd.getReadMethod(), obj) != null) {
|
|
|
+ map.put(pd.getName(), String.valueOf(ReflectionUtils.invokeMethod(pd.getReadMethod(), obj)));
|
|
|
+ }
|
|
|
+ },
|
|
|
+ HashMap::putAll);
|
|
|
+ }
|
|
|
}
|