From 3570bc18d5daed8079dd67891062ad8585a4e696 Mon Sep 17 00:00:00 2001
From: zhangk <zhangk@gisuni.com>
Date: Sat, 22 Jun 2024 19:20:44 +0800
Subject: [PATCH] 修改监测水库降雨模型
---
skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResBaseServiceImpl.java | 322 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 318 insertions(+), 4 deletions(-)
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResBaseServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResBaseServiceImpl.java
index 54c3489..dfa9c37 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResBaseServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sjztmd/service/impl/AttResBaseServiceImpl.java
@@ -1,15 +1,41 @@
package cn.gistack.sm.sjztmd.service.impl;
+import cn.gistack.sm.intelligentCall.mapper.CallTaskMapper;
+import cn.gistack.sm.sjztmd.constant.RainfallConstant;
+import cn.gistack.sm.sjztmd.dto.AttResBaseUserDTO;
+import cn.gistack.sm.sjztmd.entity.AttAdBase;
import cn.gistack.sm.sjztmd.entity.AttResBase;
+import cn.gistack.sm.sjztmd.entity.RelResLabel;
+import cn.gistack.sm.sjztmd.excel.AttResBaseUserExcel;
import cn.gistack.sm.sjztmd.mapper.AttResBaseMapper;
import cn.gistack.sm.sjztmd.service.IAttResBaseService;
+import cn.gistack.sm.sjztmd.service.IRelResLabelService;
+import cn.gistack.sm.sjztmd.vo.*;
+import cn.gistack.system.feign.ISysClient;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Map;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestParam;
+import java.util.*;
+import java.util.stream.Collectors;
/**
* @ClassName AttResBaseServiceImpl
@@ -18,9 +44,22 @@
* @Date 2023/4/21 20:01
* @Version 1.0
*/
+
+@Slf4j
@Service
@DS("zt")
public class AttResBaseServiceImpl extends ServiceImpl<AttResBaseMapper, AttResBase> implements IAttResBaseService {
+ private static final ObjectMapper objectMapper = new ObjectMapper();
+
+ @Autowired
+ private CallTaskMapper callTaskMapper;
+
+ @Autowired
+ private IRelResLabelService relResLabelService;
+
+ @Autowired
+ private ISysClient sysClient;
+
@Override
public IPage<AttResBase> selectAttResBasePage(IPage<AttResBase> page, AttResBase attResBase) {
@@ -28,7 +67,17 @@
}
@Override
- public IPage<AttResBase> getListByRegion(IPage<AttResBase> page,Map<String, Object> obj) {
+ public Object selectAttResBaseGeneralInvestigation(IPage<AttResBaseGeneralInvestigationVO> page, AttResBaseGeneralInvestigationVO attResBase) {
+
+ if (attResBase.getIsPage()){
+ return page.setRecords(baseMapper.selectAttResBaseGeneralInvestigation(page,attResBase));
+ }else {
+ return baseMapper.selectAttResBaseGeneralInvestigation(null,attResBase);
+ }
+ }
+
+ @Override
+ public IPage<AttResBaseVO> getListByRegion(IPage<AttResBaseVO> page,Map<String, Object> obj) {
return page.setRecords(baseMapper.getListByRegion(page,obj));
}
@@ -36,4 +85,269 @@
public AttResBase getDetailByCode(String code) {
return baseMapper.getDetailByCode(code);
}
+
+ /**
+ * 获取水库对应责任人分页数据
+ * @param params 条件查询参数对象
+ * @param page 分页查询参数对象
+ * @return
+ */
+ @Override
+ public Object getAttResBaseUserPage(IPage<AttResBaseUserDTO> page,Map<String, Object> params) {
+
+ Object isExport = params.get("isExport");
+ // 判断是否导出,导出不分页
+ if (null != isExport && !isExport.equals("")) {
+ return baseMapper.getAttResBaseUserPage(null,params);
+ }
+ List<AttResBaseUserDTO> attResBaseUserDTOList = baseMapper.getAttResBaseUserPage(page,params);
+ // 返回数据
+ return page.setRecords(attResBaseUserDTOList);
+ }
+
+
+ @Override
+ public List<AttResBaseUserExcel> exportAttResBaseUser(Map<String, Object> params) {
+
+
+ List<AttResBaseUserExcel> attResBaseUserDTOList = baseMapper.getAttResBaseUserExcel(params);
+ return attResBaseUserDTOList;
+ }
+
+ @Override
+ public List<AttResWithRainfall> getAttResByRainfall(String minRainfall, String maxRainfall, String dayIndex) {
+ if (StrUtil.isNotEmpty(dayIndex) && !Arrays.asList(0,1,2).contains(Integer.parseInt(dayIndex))) {
+ throw new ServiceException("无效的dayIndex");
+ }
+ Double minRainfallDouble = null;
+ Double maxRainfallDouble = null;
+ if (StrUtil.isNotEmpty(minRainfall)) {
+ minRainfallDouble = Double.parseDouble(minRainfall);
+ }
+ if (StrUtil.isNotEmpty(minRainfall)) {
+ maxRainfallDouble = Double.parseDouble(maxRainfall);
+ }
+ // 调用气象预报服务接口
+ String resJsonNodeStr;
+ try (HttpResponse httpResponse = HttpRequest.post(RainfallConstant.FORECAST_SERVICE_URL)
+ .header("Content-Type", "application/json")
+ .header("X-token", RainfallConstant.X_TOKEN)
+ .contentType("application/json")
+ .body(String.format(RainfallConstant.REQUEST_JSON_BODY, StrUtil.isEmpty(dayIndex) ? "0" : dayIndex)).execute()) {
+ JsonNode resJsonNode = objectMapper.readTree(httpResponse.body());
+ resJsonNodeStr = resJsonNode.toString();
+ } catch (Exception e) {
+ throw new ServiceException("调用气象预报服务接口失败,详情:" + e.getMessage());
+ }
+ RainfallGridData gridData;
+ try {
+ gridData = objectMapper.readValue(resJsonNodeStr, RainfallGridData.class);
+ } catch (JsonProcessingException e) {
+ throw new ServiceException("转换降雨栅格数据失败,详情:" + e.getMessage());
+ }
+ RainfallGridData.Data data = gridData.getData();
+ String fileName = data.getFileName();
+ RainfallGridData.GridInfo gridInfo = data.getGridInfo();
+ List<List<Double>> gridDataList = data.getGridData();
+ if (gridDataList == null || gridDataList.isEmpty()) {
+ log.warn("gridDataList为空!");
+ return new ArrayList<>();
+ }
+ // 获取网格信息
+ int lonNum = gridInfo.getLonNum(); // 网格横向(经度)
+ double lonMax = gridInfo.getLonMax();
+ double lonSpan = gridInfo.getLonSpan(); // 每个网格单元的经度跨度
+ double latSpan = gridInfo.getLatSpan(); // 每个网格单元的纬度跨度
+ double latMin = gridInfo.getLatMin(); // 网格的最小纬度
+ double lonMin = gridInfo.getLonMin(); // 网格的最小经度
+ double latMax = gridInfo.getLatMax();
+ int latNum = gridInfo.getLatNum(); // 网格纵向(纬度)
+
+ // 将网格数据转换为二维数组
+ double[][] grid = new double[latNum][lonNum];
+ for (int i = 0; i < latNum; i++) {
+ List<Double> row = gridDataList.get(i);
+ for (int j = 0; j < lonNum; j++) {
+ grid[i][j] = row.get(j);
+ }
+ }
+
+ LambdaQueryWrapper<AttResBase> queryWrapper = Wrappers.<AttResBase>query().lambda();
+ List<AttResBase> attResBases = baseMapper.selectList(queryWrapper);
+ List<AttResWithRainfall> attResWithRainfallList = new ArrayList<>();
+
+ for (AttResBase attResBase : attResBases) {
+ if (null == attResBase.getCenterLat() || attResBase.getCenterLong() == null) {
+ log.warn("过滤掉经度或者纬度为空的水库,水库名称:{}", attResBase.getName());
+ continue;
+ }
+ // 横向索引(lonIndex):(站点的经度 - 网格最小经度) / 每个网格单元的经度跨度
+ int lonIndex = (int) ((Double.parseDouble(attResBase.getCenterLong()) - lonMin) / lonSpan);
+ // 纵向索引(latIndex):(站点的纬度 - 网格最小纬度) / 每个网格单元的纬度跨度
+ int latIndex = (int) ((Double.parseDouble(attResBase.getCenterLat()) - latMin) / latSpan);
+ if (lonIndex >= 0 && lonIndex < lonNum && latIndex >= 0 && latIndex < latNum) {
+ double rainfall = grid[latIndex][lonIndex];
+ // 降雨量 <= 最小值的站点,都过滤掉, 降雨量为0除外
+ if (null != minRainfallDouble && rainfall != 0 && rainfall <= minRainfallDouble) {
+ continue;
+ }
+ // 降雨量 > 最大值的站点,都过滤掉
+ if (null != maxRainfallDouble && rainfall > maxRainfallDouble) {
+ continue;
+ }
+ AttResWithRainfall attResWithRainfall = new AttResWithRainfall();
+ BeanUtil.copyProperties(attResBase, attResWithRainfall);
+ attResWithRainfall.setRainfall(String.valueOf(rainfall));
+ attResWithRainfall.setFileName(fileName);
+ attResWithRainfallList.add(attResWithRainfall);
+ } else {
+ log.warn("水库 {} 超出栅格范围. 中心点经度: {}, 中心点纬度: {}", attResBase.getName(),
+ attResBase.getCenterLong(), attResBase.getCenterLat());
+ }
+ }
+ return attResWithRainfallList;
+ }
+
+ @Override
+ public int[] getAttResNumByRainfall(String dayIndex) {
+ List<AttResWithRainfall> attResByRainfall;
+ // 获取站点降雨量失败或者返回站点列表为空时,直接返回空数组
+ try {
+ attResByRainfall = getAttResByRainfall(null, null, dayIndex);
+ } catch (Exception e) {
+ return RainfallConstant.EMPTY_ATT_RES_NUM_ARRAY;
+ }
+ if (attResByRainfall == null || attResByRainfall.isEmpty()) {
+ return RainfallConstant.EMPTY_ATT_RES_NUM_ARRAY;
+ }
+ // 降雨范围-站点数量
+ Map<String, Integer> rainfallRangeAttResNumMap = attResByRainfall.stream()
+ .collect(Collectors.groupingBy(attResWithRainfall -> {
+ int rainfall = Integer.parseInt(attResWithRainfall.getRainfall());
+ if (rainfall > 250) {
+ return "(250,+)";
+ } else if (rainfall > 100) {
+ return "(100,250]";
+ } else if (rainfall > 50) {
+ return "(50,100]";
+ } else if (rainfall > 25) {
+ return "(25,50]";
+ } else if (rainfall > 10) {
+ return "(10,25]";
+ } else if (rainfall > 5) {
+ return "(5,10]";
+ } else if (rainfall > 0.1) {
+ return "(0.1,5]";
+ } else if (rainfall >= 0) {
+ return "[0,0.1]";
+ } else {
+ throw new ServiceException("无效的降雨值:" + rainfall);
+ }
+ }, Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));
+ int[] attResNumArray = new int[RainfallConstant.RAIN_FALL_RANGES.size()];
+ for (int i = 0; i < RainfallConstant.RAIN_FALL_RANGES.size(); i++) {
+ String range = RainfallConstant.RAIN_FALL_RANGES.get(i);
+ attResNumArray[i] = rainfallRangeAttResNumMap.getOrDefault(range, 0);
+ }
+ return attResNumArray;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean updateResBaseByGuid(AttResBase attResBase) {
+ attResBase.setUpdateTime(DateUtil.now());
+
+ String updateBy = baseMapper.getUpdateLog(attResBase.getGuid());
+ if (StringUtil.isBlank(updateBy)){
+ updateBy = "";
+ }
+ BladeUser user = AuthUtil.getUser();
+ //修改人基础信息
+ String account = user.getAccount();
+ String userName = user.getUserName();
+ String nowTime = DateUtil.format(DateUtil.now(),DateUtil.PATTERN_DATETIME);
+
+ String updateUser = StringUtil.format("[{}-{}-{}]",account,userName,nowTime);
+
+ //修改的东西
+ String interiorAdGuid = attResBase.getInteriorAdGuid();
+ String label = attResBase.getLabel();
+ String heightBaseStdTp = attResBase.getHeightBaseStdTp();
+ String isGate = attResBase.getIsGate();
+
+ String updateLog = "";
+ List<String> strList = new ArrayList<>();
+ if (StringUtil.isNotBlank(interiorAdGuid)){
+ strList.add("行政区划修改为"+ interiorAdGuid);
+ }
+ strList.add("标签修改为"+label);
+ strList.add("高程基准面修改为"+heightBaseStdTp);
+ strList.add("是否有闸修改为"+isGate);
+
+ String updateContent = String.join("、",strList);
+
+ updateLog = updateUser + updateContent + ";";
+ updateBy = updateBy + updateLog;
+ //向水库标签表中更新数据
+ relResLabelService.updateEntity(attResBase.getGuid(),attResBase.getLabel());
+
+ //更新机构表中的水库位置
+ sysClient.updateDeptByTb(interiorAdGuid,attResBase.getGuid());
+
+ //向操作记录表中增加记录
+ baseMapper.updateRelResUpdateLoc(attResBase.getGuid(),updateBy);
+ return baseMapper.updateResBaseByGuid(attResBase);
+ }
+
+ /**
+ * 查询当前水库对应的市级编号和县区编号
+ * @param res_cd
+ * @return
+ */
+ @Override
+ public AttResBaseVO getCityCountyCodeByResGuid(String res_cd) {
+ return baseMapper.getCityCountyCodeByResGuid(res_cd);
+ }
+
+ /**
+ * 根据水库编码获取行政区数据
+ * @param guid
+ * @return
+ */
+ @Override
+ public AttResAdVO getWaterRegionInfoByResGuid(String guid) {
+ return baseMapper.getWaterRegionInfoByResGuid(guid);
+ }
+
+ @Override
+ public int getDimResInfoACount() {
+ return baseMapper.getDimResInfoACount();
+ }
+
+ @Override
+ public Boolean updateIsShowStatus(String ids, Integer status) {
+ return baseMapper.updateIsShowStatus(ids,status);
+ }
+
+ /**
+ * 根据水库名称、所在区域查询改水库的数量
+ * @param resName 水库名称
+ * @param countyCode 区县
+ * @return
+ */
+ @Override
+ public Integer getWaterCountByResNameAndCountyName(String resName, String countyCode) {
+ return baseMapper.getWaterCountByResNameAndCountyName(resName,countyCode);
+ }
+
+ @Override
+ public AttResAdVO getResAd(String resId) {
+ return baseMapper.getResAd(resId);
+ }
+
+ @Override
+ public AttAdBase getYwxtResInfo(String cityName, String countyName) {
+ return baseMapper.getYwxtResInfo(cityName,countyName);
+ }
+
}
--
Gitblit v1.9.3