张洋洋
2025-02-20 4fd3f760a30adf230f85b3e82d9a72af407266e7
[add]服务发布
已添加1个文件
已修改5个文件
194 ■■■■ 文件已修改
src/main/java/com/se/simu/controller/SimuController.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/domain/vo/CreateFilesSimuVo.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/enums/RadioEnums.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/Impl/ProjectRelatedServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/utils/CsvToSQLiteUtils.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/utils/EntityLibraryUtils.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/controller/SimuController.java
@@ -11,6 +11,7 @@
import com.se.simu.domain.po.DataPo;
import com.se.simu.domain.po.SimuPo;
import com.se.simu.domain.vo.*;
import com.se.simu.enums.RadioEnums;
import com.se.simu.service.*;
import com.se.simu.utils.*;
import io.swagger.annotations.*;
@@ -24,10 +25,13 @@
import javax.annotation.Resource;
import java.io.*;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -231,6 +235,9 @@
                if (StringUtils.isEmpty(floodFile)) {
                    return fail("范围文件地址不能为空", false);
                } else {
                    // todo: è§£æžèŒƒå›´æ–‡ä»¶ æ ¹æ®ä¸åŒçš„的格式文件进行不同的解析,获取需要计算的范围值
                    //  ä¸Šä¼ æ ¼å¼ï¼š.shp/.tiff/.img/.geojson
                    //  é‡æ–°ç»™vo赋值
                    // èŽ·å–æ–‡ä»¶çš„åŽç¼€å
                    String fileName = floodFile.substring(floodFile.lastIndexOf("."));
                    // åˆ¤æ–­åŽç¼€åæ˜¯å¦ä¸º.shp
@@ -252,54 +259,79 @@
                        rangeVerify(minX, maxX, minY, maxY);
                    }
                }
            // todo: è§£æžèŒƒå›´æ–‡ä»¶ æ ¹æ®ä¸åŒçš„的格式文件进行不同的解析,获取需要计算的范围值
            //  ä¸Šä¼ æ ¼å¼ï¼š.shp/.tiff/.img/.geojson
            //  é‡æ–°ç»™vo赋值
        } catch (Exception e) {
            log.error("解析范围文件失败");
            if (null == vo.getMinx() || null == vo.getMiny() || null == vo.getMaxx() || null == vo.getMaxy()) {
                return fail("解析范围文件失败!选择范围不能为空,请重新选择文件!", false);
            }
        }
        JSONArray jsonArray = new JSONArray();
        String stationFile = vo.getStationFile();
        log.info("站点文件shp地址:{}", stationFile);
        try {
            // åˆ¤æ–­åœ°å€ä¸ä¸ºç©º
            if (StringUtils.isEmpty(stationFile)) {
                return fail("站点文件shp地址不能为空", false);
            }
            if (RadioEnums.ACCESS.getCode().equals(vo.getRadio()) && StringUtils.isNotEmpty(stationFile)) {
            // 1 è¯»å–shp文件,获取站点坐标值
            jsonArray = ShpToolUtils.readShpGetLocal(stationFile);
            System.out.println("jsonArray = " + jsonArray);
                ShpToolUtils.readShpGetLocal(stationFile);
            }
        } catch (Exception e) {
            log.error("解析站点文件shp失败");
        }
        String stationRainFile = vo.getStationRainFile();
        log.info("站点雨量CSV文件地址:{}", floodFile);
        JSONArray array = new JSONArray();
        // åˆ›å»ºè¡¨å æ—¶é—´æˆ³
        String tableName = "station_rain_" + System.currentTimeMillis();
        try {
            //接入处理
            if (RadioEnums.ACCESS.getCode().equals(vo.getRadio())) {
                String stationRainFile = vo.getStationRainFile();
                log.info("站点雨量CSV文件地址:{}", floodFile);
            // åˆ¤æ–­åœ°å€ä¸ä¸ºç©º
            if (StringUtils.isEmpty(stationRainFile)) {
                return fail("站点雨量CSV文件地址不能为空", false);
            }
            // 1 è¯»å–CSV æ–‡ä»¶
            array = CsvToSQLiteUtils.readCsvSaveLocal(stationRainFile, tableName);
                CsvToSQLiteUtils.readCsvSaveLocal(stationRainFile, tableName);
            // èŽ·å–ä»¿çœŸæ—¶é—´ duration
            Integer duration = CsvToSQLiteUtils.getDuration(tableName);
            log.info("仿真时间 duration = {}", duration);
            vo.setDuration(duration);
            // èŽ·å–é™é›¨æ€»é‡ total
            Double total = CsvToSQLiteUtils.getTotal(tableName);
            log.info("降雨总量 total = {}", total);
            vo.setTotal(total);
            } else if (RadioEnums.SIMULATE.getCode().equals(vo.getRadio())) {
                if (StringUtils.isEmpty(vo.getStation())) {
                    return fail("模拟计算站点不能为空!", false);
                }
                if (vo.getTotal() == null) {
                    return fail("模拟计算降雨量不能为空!", false);
                }
                if (vo.getDuration() == null || vo.getDuration() <= 0) {
                    return fail("模拟计算计算时长不能为空!", false);
                }
                if (vo.getStationLatitude() == null) {
                    return fail("模拟计算计算坐标!", false);
                }
                if (vo.getStationLongitude() == null) {
                    return fail("模拟计算计算坐标!", false);
                }
                double aveTotal = BigDecimal.valueOf(vo.getTotal()).divide(BigDecimal.valueOf(vo.getDuration()), 2, BigDecimal.ROUND_HALF_UP).doubleValue();
                JSONArray jsonArray=new JSONArray();
                LocalDateTime now=LocalDateTime.now();
                DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm");
                for (int i=0;i<vo.getDuration();i++){
                    JSONObject jsonObject=new JSONObject();
                    jsonObject.put("stationName", vo.getStation());
                    jsonObject.put("rainfall", aveTotal);
                    jsonObject.put("longitude", vo.getStationLongitude());
                    jsonObject.put("latitude", vo.getStationLatitude());
                    LocalDateTime plusMinutes = now.plusMinutes(i);
                    jsonObject.put("datetime", customFormatter.format(plusMinutes));
                    jsonArray.add(jsonObject);
                }
                CsvToSQLiteUtils.readCsvSaveLocal(jsonArray, tableName);
            } else {
                return fail("无效的模型计算方式", false);
            }
        } catch (Exception e) {
            log.error("解析站点雨量CSV文件失败");
            return fail("雨量处理失败!", false);
        }
        // TODO: 2024/12/24 æ ¹æ®è¿™äº›æ–‡ä»¶çš„地址,获取文件内容,创建仿真视图
        try {
src/main/java/com/se/simu/domain/vo/CreateFilesSimuVo.java
@@ -94,4 +94,16 @@
    @ApiModelProperty("线生成路径")
    private String linkName;
    @ApiModelProperty("模型计算方式:1=模拟,2=接入")
    private String radio;
    @ApiModelProperty("站点名称")
    private String station;
    @ApiModelProperty("站点经度")
    private Double stationLongitude;
    @ApiModelProperty("站点纬度")
    private Double stationLatitude;
}
src/main/java/com/se/simu/enums/RadioEnums.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.se.simu.enums;
public enum RadioEnums {
    SIMULATE("1", "模拟"),
    ACCESS("2", "接入");
    private String code;
    private String name;
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    RadioEnums(String code, String name) {
        this.code = code;
        this.name = name;
    }
}
src/main/java/com/se/simu/service/Impl/ProjectRelatedServiceImpl.java
@@ -12,6 +12,7 @@
import com.se.simu.helper.CaffeineHelper;
import com.se.simu.service.ProjectRelatedService;
import com.se.simu.utils.CustomWebClient;
import com.se.simu.utils.EntityLibraryUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
@@ -308,12 +309,13 @@
        if (!isExists) {
            token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
        } else {
            // èŽ·å–token
            LoginParams loginParams = new LoginParams();
            loginParams.setUserid("admin");
            loginParams.setPassword("admin");
            loginEntity(loginParams);
            token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token");
            try {
                token = EntityLibraryUtils.login();
                CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token");
                CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_token", token);
            }catch (Exception e){
                return "登录失败!";
            }
        }
        log.info("token = " + token);
        // æ·»åŠ form参数
@@ -323,7 +325,7 @@
        params.put("containCount", true);
        params.put("count", Objects.nonNull(entityTypeInfo.getCount()) ? entityTypeInfo.getCount() : 20);
        params.put("dbid", Objects.nonNull(entityTypeInfo.getDbid()) ? entityTypeInfo.getDbid() : "85257774fdb64e5f99f6778696cad02a");
        params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "f6ff4412-4886-4c4b-83f7-13de24ee8353");
        params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "8208c5be-adc1-4e7b-b952-37362e0bef32");
        params.put("like", "");
        params.put("querytype", "entity");
src/main/java/com/se/simu/utils/CsvToSQLiteUtils.java
@@ -157,6 +157,35 @@
        }
    }
    /**
     * è¯»å– CSV ä¿å­˜æœ¬åœ°
     *
     * @param array     æ•°æ®
     * @param tableName è¡¨åç§°
     */
    public static void readCsvSaveLocal(JSONArray array, String tableName) {
        // 1. åˆ›å»ºSQLite数据库连接
        try (Connection conn = DriverManager.getConnection("jdbc:sqlite:rainfall.db")) {
            if (conn != null) {
                // 2. åˆ›å»ºè¡¨ï¼ˆå¦‚果不存在)
                createTableIfNotExists(conn, tableName);
                // 3. è®¾ç½®SQLite连接的字符编码为UTF-8
                try (Statement stmt = conn.createStatement()) {
                    // è®¾ç½®SQLite编码为UTF-8
                    stmt.execute("PRAGMA encoding = 'UTF-8';");
                }
                // 4. å¼€å§‹äº‹åŠ¡
                conn.setAutoCommit(false);
                // 5. è¯»å–CSV文件并插入数据
                readCsvAndInsertDatas(array, conn, tableName);
                // 6. æäº¤äº‹åŠ¡
                conn.commit();
                System.out.println("数据成功插入到SQLite数据库!");
            }
        } catch (SQLException e) {
            System.err.println("SQLite连接失败: " + e.getMessage());
        }
    }
    /**
     * è¯»å– CSV ä¿å­˜æœ¬åœ°
@@ -190,6 +219,41 @@
        return array;
    }
    private static void readCsvAndInsertDatas(JSONArray array, Connection conn, String tableName) {
        String insertDataSql = "INSERT INTO " + tableName + " (station_name, rainfall, longitude, latitude, datetime) VALUES (?, ?, ?, ?, ?);";
        try (PreparedStatement pstmt = conn.prepareStatement(insertDataSql)) {
            // æ‰¹é‡å¤§å°
            int batchSize = 1000;
            int count = 0;
            for (int i = 0; i < array.size(); i++) {
                JSONObject object = array.getJSONObject(i);
                // èŽ·å–æ¯ä¸€åˆ—çš„æ•°æ®
                String stationName = object.getString("stationName");
                double rainfall = object.getDouble("rainfall");
                double longitude = object.getDouble("longitude");
                double latitude = object.getDouble("latitude");
                String datetime = object.getString("datetime");
                // è®¾ç½®æ’入数据的参数
                pstmt.setString(1, stationName);
                pstmt.setDouble(2, rainfall);
                pstmt.setDouble(3, longitude);
                pstmt.setDouble(4, latitude);
                pstmt.setString(5, datetime);
                // æ·»åŠ åˆ°æ‰¹å¤„ç†
                pstmt.addBatch();
                count++;
                // æ¯batchSize条数据执行一次批量插入
                if (count % batchSize == 0) {
                    pstmt.executeBatch();
                }
            }
            // æ‰§è¡Œå‰©ä½™çš„æ‰¹é‡æ’å…¥
            pstmt.executeBatch();
        } catch (SQLException e) {
            System.err.println("批量插入数据时出错: " + e.getMessage());
        }
    }
    private static JSONArray readCsvAndInsertDatas(String csvFilePath, Connection conn, String tableName) {
        // ä½¿ç”¨ Apache Commons CSV è¯»å–CSV文件
src/main/java/com/se/simu/utils/EntityLibraryUtils.java
@@ -17,6 +17,7 @@
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.time.LocalDateTime;
import java.util.List;
/**