|
@@ -1,11 +1,33 @@
|
|
|
package com.usky.fire.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+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.usky.common.core.bean.CommonPage;
|
|
|
+import com.usky.common.core.exception.BusinessException;
|
|
|
+import com.usky.common.core.util.Arith;
|
|
|
+import com.usky.common.core.util.DateUtils;
|
|
|
+import com.usky.common.mybatis.core.AbstractCrudService;
|
|
|
import com.usky.fire.domain.DemPoliceInfo;
|
|
|
import com.usky.fire.mapper.DemPoliceInfoMapper;
|
|
|
+import com.usky.fire.service.DemFireStatisticsAttachService;
|
|
|
import com.usky.fire.service.DemPoliceInfoService;
|
|
|
-import com.usky.common.mybatis.core.AbstractCrudService;
|
|
|
+import com.usky.fire.service.vo.AlertStatisticsVO;
|
|
|
+import com.usky.fire.service.vo.FireLevelRatioVO;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.time.Instant;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
/**
|
|
|
* <p>
|
|
|
* 警情信息 服务实现类
|
|
@@ -17,4 +39,181 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class DemPoliceInfoServiceImpl extends AbstractCrudService<DemPoliceInfoMapper, DemPoliceInfo> implements DemPoliceInfoService {
|
|
|
|
|
|
+ public static final String[] ALERT_TYPE = {"火灾", "社会救助", "抢险救援", "排爆安检"};
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DemFireStatisticsAttachService demFireStatisticsAttachService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, List<AlertStatisticsVO>> getAlertStatisticsByMonth(String startTime, String endTime, String streetTown) {
|
|
|
+ QueryWrapper<DemPoliceInfo> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.select("month(filing_time) monthTime", "COUNT(id) as aCount", "case_type as aType")
|
|
|
+ .between("filing_time", startTime, endTime)
|
|
|
+ .eq(StringUtils.isNotBlank(streetTown), "street_town", streetTown)
|
|
|
+ .groupBy("monthTime", "aType");
|
|
|
+ Map<String, List<AlertStatisticsVO>> typeMap = enhanceList(this.listMaps(queryWrapper));
|
|
|
+ Date maxDate = getMaxDate();
|
|
|
+ Date minDate = getMinDate();
|
|
|
+ int distanceOfTwoDateYear = Integer.parseInt(DateUtils.getYear(maxDate)) - Integer.parseInt(DateUtils.getYear(minDate)) + 1;
|
|
|
+ perfect(typeMap, 13, distanceOfTwoDateYear, 1);
|
|
|
+ return typeMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<AlertStatisticsVO> getAlertStatistics(String startTime, String endTime, String streetTown) {
|
|
|
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ Date startTime1 = null;
|
|
|
+ Date endTime1 = null;
|
|
|
+ if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) {
|
|
|
+ try {
|
|
|
+ startTime1 = simpleDateFormat.parse(startTime);
|
|
|
+ endTime1 = simpleDateFormat.parse(endTime);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BusinessException("时间格式错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //获取同比
|
|
|
+ Date upStartTime = DateUtils.addYears(startTime1, -1);
|
|
|
+ Date upEndTime = DateUtils.addYears(endTime1, -1);
|
|
|
+ List<AlertStatisticsVO> list = new ArrayList<>();
|
|
|
+ list.add(getAsV(startTime1, endTime1, ALERT_TYPE[0], streetTown));
|
|
|
+ list.add(getAsV(startTime1, endTime1, ALERT_TYPE[1], streetTown));
|
|
|
+ list.add(getAsV(startTime1, endTime1, ALERT_TYPE[2], streetTown));
|
|
|
+ list.add(getAsV(startTime1, endTime1, ALERT_TYPE[3], streetTown));
|
|
|
+ list.forEach(alertStatisticsVO -> {
|
|
|
+ AlertStatisticsVO upAsv = getAsV(upStartTime, upEndTime, alertStatisticsVO.getType(), streetTown);
|
|
|
+ Integer number = alertStatisticsVO.getNumber();
|
|
|
+ Integer upNumber = upAsv.getNumber();
|
|
|
+ if (number.equals(upNumber)) {
|
|
|
+ alertStatisticsVO.setSameStatus(0);
|
|
|
+ } else if (number > upNumber) {
|
|
|
+ alertStatisticsVO.setSameStatus(1);
|
|
|
+ } else {
|
|
|
+ alertStatisticsVO.setSameStatus(2);
|
|
|
+ }
|
|
|
+ if (0 != upNumber) {
|
|
|
+ double radio = Arith.div(Arith.sub(number, upNumber), upNumber);
|
|
|
+ alertStatisticsVO.setRadio(Math.abs(radio));
|
|
|
+ } else {
|
|
|
+ if (number != 0) {
|
|
|
+ alertStatisticsVO.setRadio(1.00);
|
|
|
+ } else {
|
|
|
+ alertStatisticsVO.setRadio(0.00);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public CommonPage<DemPoliceInfo> page(Integer current, Integer size, String startTime, String endTime, String streetTown) {
|
|
|
+ IPage<DemPoliceInfo> page = new Page<>(current, size);
|
|
|
+ LambdaQueryWrapper<DemPoliceInfo> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.between(StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime), DemPoliceInfo::getCreateTime, startTime, endTime)
|
|
|
+ .eq(StringUtils.isNotBlank(streetTown), DemPoliceInfo::getStreetTown, streetTown)
|
|
|
+ .orderByDesc(DemPoliceInfo::getCreateTime);
|
|
|
+ page = this.page(page, queryWrapper);
|
|
|
+ return this.ToCommonPage(page);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<String> getFireType() {
|
|
|
+ List<FireLevelRatioVO> list = new ArrayList<>();
|
|
|
+ List<String> fireTypes = demFireStatisticsAttachService.fireCauseType();
|
|
|
+ if (CollectionUtils.isNotEmpty(fireTypes)) {
|
|
|
+ for (String cause : fireTypes) {
|
|
|
+ FireLevelRatioVO fireLevelRatioVo = new FireLevelRatioVO();
|
|
|
+ fireLevelRatioVo.setFireType(cause);
|
|
|
+ Integer count = demFireStatisticsAttachService.fireStatisticsAttachCount(cause);
|
|
|
+ fireLevelRatioVo.setRadio(count.doubleValue());
|
|
|
+ list.add(fireLevelRatioVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list.stream().sorted(Comparator.comparing(FireLevelRatioVO::getRadio).reversed())
|
|
|
+ .map(FireLevelRatioVO::getFireType).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ public AlertStatisticsVO getAsV(Date startTime, Date endTime, String type, String streetTown) {
|
|
|
+ AlertStatisticsVO alertStatisticsVo = new AlertStatisticsVO();
|
|
|
+ LambdaQueryWrapper<DemPoliceInfo> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.eq(StringUtils.isNotBlank(type), DemPoliceInfo::getCaseType, type)
|
|
|
+ .eq(StringUtils.isNotBlank(streetTown), DemPoliceInfo::getStreetTown, streetTown);
|
|
|
+ if (null != startTime && null != endTime) {
|
|
|
+ queryWrapper.between(DemPoliceInfo::getArrivalTime, startTime, endTime);
|
|
|
+ }
|
|
|
+ alertStatisticsVo.setType(type);
|
|
|
+ alertStatisticsVo.setNumber(this.count(queryWrapper));
|
|
|
+ return alertStatisticsVo;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public Map<String, List<AlertStatisticsVO>> enhanceList(List<Map<String, Object>> mapList) {
|
|
|
+ List<AlertStatisticsVO> list = new ArrayList<>();
|
|
|
+ for (Map<String, Object> map : mapList) {
|
|
|
+ AlertStatisticsVO alertStatisticsVo = new AlertStatisticsVO();
|
|
|
+ alertStatisticsVo.setType(map.get("aType").toString());
|
|
|
+ alertStatisticsVo.setMonth(map.get("monthTime").toString());
|
|
|
+ alertStatisticsVo.setNumber(Integer.parseInt(map.get("aCount").toString()));
|
|
|
+ list.add(alertStatisticsVo);
|
|
|
+ }
|
|
|
+ return list.stream().collect(Collectors.groupingBy(AlertStatisticsVO::getType));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Date getMaxDate() {
|
|
|
+ IPage<DemPoliceInfo> page = new Page<>(1, 1);
|
|
|
+ LambdaQueryWrapper<DemPoliceInfo> maxQuery = Wrappers.lambdaQuery();
|
|
|
+ maxQuery.isNotNull(DemPoliceInfo::getCreateTime)
|
|
|
+ .orderByDesc(DemPoliceInfo::getCreateTime);
|
|
|
+ IPage<DemPoliceInfo> maxPage = this.page(page, maxQuery);
|
|
|
+ LocalDateTime localDateTime = maxPage.getRecords().get(0).getCreateTime();
|
|
|
+ Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
|
|
+ Date date = Date.from(instant);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Date getMinDate() {
|
|
|
+ IPage<DemPoliceInfo> page = new Page<>(1, 1);
|
|
|
+ LambdaQueryWrapper<DemPoliceInfo> minQuery = Wrappers.lambdaQuery();
|
|
|
+ minQuery.isNotNull(DemPoliceInfo::getCreateTime)
|
|
|
+ .orderByAsc(DemPoliceInfo::getCreateTime);
|
|
|
+ IPage<DemPoliceInfo> minPage = this.page(page, minQuery);
|
|
|
+ LocalDateTime localDateTime = minPage.getRecords().get(0).getCreateTime();
|
|
|
+ Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
|
|
+ Date date = Date.from(instant);
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void perfect(Map<String, List<AlertStatisticsVO>> typeMap, Integer times, Integer subTime, Integer defaultTime) {
|
|
|
+ for (String type : ALERT_TYPE) {
|
|
|
+ if (!typeMap.containsKey(type)) {
|
|
|
+ typeMap.put(type, new ArrayList<>());
|
|
|
+ }
|
|
|
+ perfectDate(typeMap.get(type), times, subTime, defaultTime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void perfectDate(List<AlertStatisticsVO> list, Integer times, Integer subTime, Integer defaultTime) {
|
|
|
+ for (int i = defaultTime; i < times; i++) {
|
|
|
+ int finalI = i;
|
|
|
+ list.stream()
|
|
|
+ .filter(asv -> Integer.parseInt(asv.getMonth()) == finalI)
|
|
|
+ .findFirst()
|
|
|
+ .map(asv -> {
|
|
|
+ asv.setAvg(Arith.div(asv.getNumber(), subTime));
|
|
|
+ return asv;
|
|
|
+ })
|
|
|
+ .orElseGet(() -> {
|
|
|
+ AlertStatisticsVO asv = new AlertStatisticsVO();
|
|
|
+ asv.setMonth(Integer.toString(finalI));
|
|
|
+ asv.setNumber(0);
|
|
|
+ asv.setAvg(0.00);
|
|
|
+ list.add(asv);
|
|
|
+ return asv;
|
|
|
+ });
|
|
|
+ }
|
|
|
+ list.sort(Comparator.comparingInt(x -> Integer.parseInt(x.getMonth())));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|