diff --git a/backend/pom.xml b/backend/pom.xml index 507f58de..6a28bfa6 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -38,6 +38,7 @@ 1.11.3 1.16 1.7.2 + 1.5.4 1.6.2 1.21 2.10.1 @@ -256,6 +257,13 @@ ${poi.ooxml.version} + + + org.jfree + jfreechart + ${jfreechart.version} + + com.alibaba diff --git a/backend/src/main/java/com/yfd/platform/annotation/Excel.java b/backend/src/main/java/com/yfd/platform/annotation/Excel.java new file mode 100644 index 00000000..f01e0792 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/annotation/Excel.java @@ -0,0 +1,82 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 通用 Excel 导出列注解(参考若依 RuoYi 的 @Excel 设计) + * 标注在实体字段上,配合 {@code ExcelUtil} 即可实现该字段的导出。 + * 支持的转换能力:字典翻译(dictType)、静态值转换(readConverterExp)、日期格式化。 + * + * @Excel(name = "性别", dictType = "sys_user_sex", sort = 3) + * private Integer gender; + * + * @Excel(name = "状态", readConverterExp = "0=停用,1=正常", sort = 5) + * private Integer status; + * + * @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss", sort = 6) + * private LocalDateTime createTime; + * + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel { + + /** + * 导出列名(Excel 表头) + */ + String name(); + + /** + * 列排序(数值越小越靠前;未标注 sort 的字段按声明顺序排在其后) + */ + int sort() default Integer.MAX_VALUE; + + /** + * 字典类型:如 "sys_user_sex",导出时自动将字典值翻译为字典标签 + * (复用项目 DictCache 缓存,无需额外查询) + */ + String dictType() default ""; + + /** + * 静态转换表达式:如 "0=正常,1=停用"(逗号分隔,等号前为值、后为标签) + * 优先级高于 {@link #dictType()} + */ + String readConverterExp() default ""; + + /** + * 日期格式(支持 java.util.Date、LocalDate、LocalDateTime) + */ + String dateFormat() default "yyyy-MM-dd HH:mm:ss"; + + /** + * 列宽(字符数),0 表示根据表头与内容自动计算 + */ + int width() default 0; + + /** + * 是否导出该列 + */ + boolean isExport() default true; + + /** + * 对齐方式 + */ + Align align() default Align.AUTO; + + /** + * 单元格对齐 + */ + enum Align { + /** 自动(文本左对齐、数值右对齐) */ + AUTO, + /** 左对齐 */ + LEFT, + /** 居中 */ + CENTER, + /** 右对齐 */ + RIGHT + } +} diff --git a/backend/src/main/java/com/yfd/platform/common/enums/AicomTypeEnum.java b/backend/src/main/java/com/yfd/platform/common/enums/AicomTypeEnum.java new file mode 100644 index 00000000..1d9c29aa --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/enums/AicomTypeEnum.java @@ -0,0 +1,56 @@ +package com.yfd.platform.common.enums; + +/** + * @author xyx + * @date 2023-11-27 15:53 + */ +public enum AicomTypeEnum { + PFW("AI_5001","漂浮物"), + YYCYX("AI_5002","运鱼车运行"), + YYCCG("AI_5003","运鱼船出港"), + JYCJY("AI_5004","集鱼船集鱼"), + DLMYX("AI_5005","叠梁门运行"), + GYSYX("AI_5006","赶鱼栅运行"), + SYJYX("AI_5007","升鱼机运行"), + AGVXC("AI_5008","AGV小车"), + YLZY("AI_5009","鱼类暂养"), + BASYJ("AI_5010","坝上升鱼机"), + PFWQL("AI_5011","漂浮物清理"), + YDFL("AI_5012","鱼道放流"); + + private String code; + private String name; + + AicomTypeEnum(String code, String name){ + this.code = code; + this.name = name; + } + + public String getCode(){ + return this.code; + } + + public String getName(){ + return this.name; + } + public enum DlmValueEnum { + CLOSE("close","关闭"), + OPEN("open","开启"); + + private String code; + private String name; + + DlmValueEnum(String code, String name){ + this.code = code; + this.name = name; + } + + public String getCode(){ + return this.code; + } + + public String getName(){ + return this.name; + } + } +} diff --git a/backend/src/main/java/com/yfd/platform/config/JobRunner.java b/backend/src/main/java/com/yfd/platform/config/JobRunner.java index 00a1f203..f6d180e5 100644 --- a/backend/src/main/java/com/yfd/platform/config/JobRunner.java +++ b/backend/src/main/java/com/yfd/platform/config/JobRunner.java @@ -75,16 +75,16 @@ public class JobRunner implements ApplicationRunner { ao.setStartTime(DateUtil.beginOfYear(DateUtil.offset(ao.getEndTime(), DateField.YEAR,-1))); } envWqDataService.wqLastData(ao); -// log.info("--------------------wq最新一条数据---------------------"); -// eqJobService.eqAnchorPointLastDate(ao); -// log.info("--------------------eq最新一条数据---------------------"); -// eqJobService.eqAnchorPointLastDate(ao); -// log.info("--------------------eq最新一条数据---------------------"); -// dwJobService.wtLastData(ao); -// log.info("--------------------wt最新一条数据---------------------"); -// dwJobService.wtvtPointData(ao); -// log.info("--------------------wt最新一条数据---------------------"); -// fhJobService.zqLastData(ao); -// log.info("--------------------fh最新一条数据---------------------"); + log.info("--------------------wq最新一条数据---------------------"); + eqJobService.eqAnchorPointLastDate(ao); + log.info("--------------------eq最新一条数据---------------------"); + eqJobService.eqAnchorPointLastDate(ao); + log.info("--------------------eq最新一条数据---------------------"); + dwJobService.wtLastData(ao); + log.info("--------------------wt最新一条数据---------------------"); + dwJobService.wtvtPointData(ao); + log.info("--------------------wt最新一条数据---------------------"); + fhJobService.zqLastData(ao); + log.info("--------------------fh最新一条数据---------------------"); } } diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index c7ef4999..8fdd437d 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -65,28 +65,30 @@ public class SecurityConfig { .requestMatchers("/system/user/auditUser").permitAll() .requestMatchers("/register/accessToken").permitAll() .requestMatchers("/api/oauth2/oauth/token").permitAll() + .requestMatchers("/warn/receiveAiData").permitAll() // .requestMatchers("/dict/cache/**").permitAll() // .requestMatchers("/sys/psbmodulelbb/**").permitAll() // .requestMatchers("/base/operationLog/**").permitAll() // .requestMatchers("/system/**").permitAll() // .requestMatchers("/qgcExport/**").permitAll() - .requestMatchers("/eng/**").permitAll() - .requestMatchers("/system/**").permitAll() +// .requestMatchers("/eng/**").permitAll() +// .requestMatchers("/system/**").permitAll() // .requestMatchers("/eq/**").permitAll() // .requestMatchers("/env/**").permitAll() // .requestMatchers("/warn/**").permitAll() // .requestMatchers("/threedroamb/**").permitAll() // .requestMatchers("/overview/**").permitAll() - .requestMatchers("/wt/**").permitAll() - .requestMatchers("/system/acctPasswordPolicy/**").permitAll() - .requestMatchers("/fb/**").permitAll() +// .requestMatchers("/wt/**").permitAll() +// .requestMatchers("/datasource/**").permitAll() +// .requestMatchers("/system/acctPasswordPolicy/**").permitAll() +// .requestMatchers("/fb/**").permitAll() // .requestMatchers("/base/**").permitAll() // .requestMatchers("/zq/**").permitAll() - .requestMatchers("/wq/**").permitAll() +// .requestMatchers("/wq/**").permitAll() // .requestMatchers("/wte/**").permitAll() // .requestMatchers("/vd/**").permitAll() - .requestMatchers("/vap/**").permitAll() - .requestMatchers("/fp/**").permitAll() +// .requestMatchers("/vap/**").permitAll() +// .requestMatchers("/fp/**").permitAll() // .requestMatchers("/fpr/**").permitAll() // .requestMatchers("/fh/**").permitAll() // .requestMatchers("/data/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 3007f7e6..e40ea660 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -210,6 +210,14 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupEnvImeApi() { + return GroupedOpenApi.builder() + .group("3.12 智能装备") + .packagesToScan("com.yfd.platform.qgc_env.ime.controller") + .build(); + } + diff --git a/backend/src/main/java/com/yfd/platform/datasource/DataSourceKeys.java b/backend/src/main/java/com/yfd/platform/datasource/DataSourceKeys.java index 19a8459a..1b6960ee 100644 --- a/backend/src/main/java/com/yfd/platform/datasource/DataSourceKeys.java +++ b/backend/src/main/java/com/yfd/platform/datasource/DataSourceKeys.java @@ -2,21 +2,31 @@ package com.yfd.platform.datasource; /** * 数据源 key 常量 + * + * 系统内置 key(yml 固定配置): + * + * {@link #DM_MASTER} / {@link #DM_SLAVE} — 达梦数据库 + * + * 扩展数据源 key 格式:{@code ext-{type}-{序号}},如 {@code ext-oracle-01}、{@code ext-mysql-01}, + * 由数据库表 {@code GEN_DATASOURCE_CONF.DS_KEY} 配置,运行时动态注册。 */ public interface DataSourceKeys { - /** 达梦主库 */ + /** 达梦主库(业务主库,yml 固定配置) */ String DM_MASTER = "dm-master"; /** 达梦从库 */ String DM_SLAVE = "dm-slave"; - /** Oracle 主库 */ + /** Oracle 主库(由数据库表 GEN_DATASOURCE_CONF 动态注册,不再从 yml 配置) */ String ORACLE_MASTER = "oracle-master"; - /** Oracle 从库 */ + /** Oracle 从库(由数据库表 GEN_DATASOURCE_CONF 动态注册,不再从 yml 配置) */ String ORACLE_SLAVE = "oracle-slave"; /** 默认数据源 */ String DEFAULT = DM_MASTER; -} + + /** 扩展数据源 key 前缀 */ + String EXT_PREFIX = "ext-"; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java index 79dc807c..b47b6a47 100644 --- a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSource.java @@ -1,22 +1,39 @@ package com.yfd.platform.datasource; +import com.alibaba.druid.pool.DruidDataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import javax.sql.DataSource; +import java.util.HashMap; import java.util.Map; +import java.util.Set; + +/** + * 动态数据源路由,支持运行时注册/注销/热刷新 + * + * @author wxy + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + + private static final Logger log = LoggerFactory.getLogger(DynamicDataSource.class); -/****************************** - * 用途说明: - * 作者姓名: wxy - * 创建时间: 2022/9/23 17:47 - ******************************/ -public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal contextHolder = new ThreadLocal<>(); - public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { + /** + * 用户手动注册的目标数据源(含 yml 配置 + 数据库表注册) + */ + private final Map targetDataSources = new HashMap<>(); + + private final Object lock = new Object(); + + public DynamicDataSource(DataSource defaultTargetDataSource, Map initialDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); - super.setTargetDataSources(targetDataSources); - super.afterPropertiesSet(); + if (initialDataSources != null) { + this.targetDataSources.putAll(initialDataSources); + } + rebuildResolvedDataSources(); } @Override @@ -37,10 +54,96 @@ public class DynamicDataSource extends AbstractRoutingDataSource { } /** - * 根据数据源 key 获取目标数据源实例(如 dm-master / oracle-master) + * 根据数据源 key 获取目标数据源实例 */ public DataSource getDataSourceByKey(String key) { Map resolved = getResolvedDataSources(); return resolved == null ? null : resolved.get(key); } -} + + /** + * 运行时注册一个数据源,线程安全,立即生效 + * + * @param key 路由 key,如 "ext-oracle-01" + * @param ds 数据源实例 + */ + public void register(String key, DataSource ds) { + synchronized (lock) { + // 如果已有旧数据源且不同实例,关闭旧连接池 + Object old = targetDataSources.get(key); + if (old instanceof DruidDataSource && old != ds) { + closeQuietly((DruidDataSource) old); + } + targetDataSources.put(key, ds); + rebuildResolvedDataSources(); + log.info("数据源已注册: key={}, type={}", key, ds.getClass().getSimpleName()); + } + } + + /** + * 运行时注销一个数据源,线程安全,立即生效 + * + * @param key 路由 key + * @return true-已注销并关闭连接池;false-未找到该 key + */ + public boolean unregister(String key) { + synchronized (lock) { + Object removed = targetDataSources.remove(key); + if (removed == null) { + return false; + } + rebuildResolvedDataSources(); + closeQuietly(removed); + log.info("数据源已注销: key={}", key); + return true; + } + } + + /** + * 批量替换同名数据源(先保留旧连接池,注册新实例,再关闭旧的) + * 用于热刷新时零中断更新 + */ + public void registerReplace(String key, DataSource newDs) { + synchronized (lock) { + Object old = targetDataSources.get(key); + targetDataSources.put(key, newDs); + rebuildResolvedDataSources(); + closeQuietly(old); + log.info("数据源已热替换: key={}", key); + } + } + + /** + * 获取所有已注册的数据源 key + */ + @SuppressWarnings("unchecked") + public Set getRegisteredKeys() { + Map resolved = getResolvedDataSources(); + return resolved.keySet(); + } + + /** + * 判断 key 是否已注册 + */ + public boolean containsKey(String key) { + return getDataSourceByKey(key) != null; + } + + /** + * 重建路由表(内部同步需由调用方保证线程安全) + */ + private void rebuildResolvedDataSources() { + super.setTargetDataSources(new HashMap<>(targetDataSources)); + super.afterPropertiesSet(); + } + + private void closeQuietly(Object ds) { + if (ds instanceof DruidDataSource) { + try { + ((DruidDataSource) ds).close(); + } catch (Exception e) { + log.warn("关闭旧数据源连接池异常: {}", e.getMessage()); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java index d9e984ae..1632f711 100644 --- a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceConfig.java @@ -1,6 +1,9 @@ package com.yfd.platform.datasource; import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -11,67 +14,62 @@ import java.util.HashMap; import java.util.Map; /** - * 动态数据源配置,支持 达梦(DM) 和 Oracle 两种数据库,每种各有主从(master/slave) + * 动态数据源配置,仅保留业务主库(达梦 DM)的 yml 配置。 + * + * 其他数据源(如 Oracle、MySQL、PostgreSQL 等)通过数据库表 + * {@code GEN_DATASOURCE_CONF} 动态注册,见 {@link DynamicDataSourceRegistry}。 * * @author yfd */ @Configuration public class DynamicDataSourceConfig { - // ==================== 达梦(DM) 数据源 ==================== + // ==================== 达梦(DM) 数据源(业务主库,yml 固定配置) ==================== @Bean @ConfigurationProperties("spring.datasource.druid.dm-master") + @ConditionalOnProperty(prefix = "spring.datasource.druid.dm-master", name = "enabled", havingValue = "true", matchIfMissing = true) public DataSource dmMasterDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; + return newDruidDataSource(); } @Bean @ConfigurationProperties("spring.datasource.druid.dm-slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.dm-slave", name = "enabled", havingValue = "true", matchIfMissing = true) public DataSource dmSlaveDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; - } - - // ==================== Oracle 数据源 ==================== - - @Bean - @ConfigurationProperties("spring.datasource.druid.oracle-master") - public DataSource oracleMasterDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; - } - - @Bean - @ConfigurationProperties("spring.datasource.druid.oracle-slave") - public DataSource oracleSlaveDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; + return newDruidDataSource(); } // ==================== 路由数据源 ==================== @Bean @Primary - public DynamicDataSource dataSource(DataSource dmMasterDataSource, - DataSource dmSlaveDataSource, - DataSource oracleMasterDataSource, - DataSource oracleSlaveDataSource) { - Map targetDataSources = new HashMap<>(); - targetDataSources.put(DataSourceKeys.DM_MASTER, dmMasterDataSource); - targetDataSources.put(DataSourceKeys.DM_SLAVE, dmSlaveDataSource); - targetDataSources.put(DataSourceKeys.ORACLE_MASTER, oracleMasterDataSource); - targetDataSources.put(DataSourceKeys.ORACLE_SLAVE, oracleSlaveDataSource); + public DynamicDataSource dataSource(@Qualifier("dmMasterDataSource") ObjectProvider dmMaster, + @Qualifier("dmSlaveDataSource") ObjectProvider dmSlave) { + Map targetDataSources = new HashMap<>(); + putIfPresent(targetDataSources, DataSourceKeys.DM_MASTER, dmMaster); + putIfPresent(targetDataSources, DataSourceKeys.DM_SLAVE, dmSlave); + // 默认使用达梦主库 - return new DynamicDataSource(dmMasterDataSource, targetDataSources); + DataSource defaultDataSource = dmMaster.getIfAvailable(); + if (defaultDataSource == null) { + defaultDataSource = targetDataSources.values().stream().findFirst() + .orElseThrow(() -> new IllegalStateException("未开启任何数据源,请至少启用一个数据源")); + } + return new DynamicDataSource(defaultDataSource, targetDataSources); } -} + + private DruidDataSource newDruidDataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setBreakAfterAcquireFailure(true); + dataSource.setConnectionErrorRetryAttempts(0); + return dataSource; + } + + private void putIfPresent(Map targetDataSources, String key, ObjectProvider provider) { + DataSource dataSource = provider.getIfAvailable(); + if (dataSource != null) { + targetDataSources.put(key, dataSource); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java new file mode 100644 index 00000000..1c722ba0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java @@ -0,0 +1,219 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.config.ResponseResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.StatementCallback; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.util.*; + +/** + * 动态数据源管理控制器,提供运行时数据源注册/注销/热刷新/列表查询等操作。 + * + * 数据源配置存储在数据库表 {@code GEN_DATASOURCE_CONF} 中,通过此接口可: + * + * 查看当前已注册的所有数据源 + * 手动注册/注销单个数据源 + * 从数据库表热刷新全部数据源 + * + */ +@RestController +@RequestMapping("/datasource") +@Tag(name = "动态数据源管理") +@Validated +public class DynamicDataSourceController { + + @Resource + private DynamicDataSourceRegistry dynamicDataSourceRegistry; + + @Resource + private DynamicDataSource dynamicDataSource; + + @Resource + private DynamicDataSourceTestService dynamicDataSourceTestService; + + /** + * 列出所有已注册的数据源(含系统内置 dm-master/dm-slave) + */ + @GetMapping("/list") + @Operation(summary = "列出所有已注册的数据源") + public ResponseResult listDataSources() { + Set keys = dynamicDataSource.getRegisteredKeys(); + List> list = new ArrayList<>(keys.size()); + for (Object key : keys) { + Map item = new LinkedHashMap<>(); + item.put("key", key); + DataSource ds = dynamicDataSource.getDataSourceByKey(key.toString()); + item.put("type", ds == null ? "unknown" : ds.getClass().getSimpleName()); + item.put("alive", ds != null); + list.add(item); + } + // 内置 key 排前,扩展 key 排后 + list.sort(Comparator.comparing(m -> { + String k = (String) m.get("key"); + if (DataSourceKeys.DM_MASTER.equals(k)) return 0; + if (DataSourceKeys.DM_SLAVE.equals(k)) return 1; + return 2; + })); + return ResponseResult.successData(list); + } + + /** + * 热刷新所有数据源:从数据库表重新读取配置并注册 + */ + @PostMapping("/refresh") + @Operation(summary = "热刷新数据源(从数据库表重新读取并注册)") + public ResponseResult refreshDataSources() { + dynamicDataSourceRegistry.refresh(); + return ResponseResult.success("动态数据源热刷新完成"); + } + + /** + * 手动注册一个数据源(仅注册到路由,不持久化到数据库表) + */ + @PostMapping("/register") + @Operation(summary = "手动注册一个数据源(仅运行时,不持久化到表)") + public ResponseResult registerDataSource(@RequestBody GenDatasourceConf conf) { + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + return ResponseResult.error("dsKey 不能为空"); + } + if (conf.getUrl() == null || conf.getUrl().isBlank()) { + return ResponseResult.error("url 不能为空"); + } + if (dynamicDataSourceRegistry.registerRuntime(conf)) { + return ResponseResult.success("数据源手动注册成功: " + conf.getDsKey()); + } else { + return ResponseResult.error("数据源注册失败: " + conf.getDsKey()); + } + } + + /** + * 注销一个数据源 + */ + @DeleteMapping("/unregister/{key}") + @Operation(summary = "注销一个数据源") + public ResponseResult unregisterDataSource(@PathVariable("key") String key) { + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + return ResponseResult.error("系统内置数据源不允许注销"); + } + boolean removed = dynamicDataSource.unregister(key); + if (removed) { + return ResponseResult.success("数据源已注销: " + key); + } else { + return ResponseResult.error("未找到数据源: " + key); + } + } + + /** + * 测试指定数据源连通性,并执行一条查询验证 + * + * @param dsKey 数据源路由 key + * @param sql 可选 SQL(默认自动选择 SELECT 1 或 SELECT 1 FROM DUAL) + * @return 查询结果 + */ + @GetMapping("/test/{dsKey}") + @Operation(summary = "测试数据源连通性(执行查询验证)") + public ResponseResult testDataSource(@PathVariable("dsKey") String dsKey, + @RequestParam(value = "sql", required = false) String sql) { + DataSource ds = dynamicDataSource.getDataSourceByKey(dsKey); + if (ds == null) { + return ResponseResult.error("未找到数据源: " + dsKey + ",请先注册或查看 /datasource/list"); + } + + // 自动选择默认验证 SQL + if (sql == null || sql.isBlank()) { + String lowerKey = dsKey.toLowerCase(); + sql = lowerKey.contains("oracle") ? "SELECT 1 FROM DUAL" : "SELECT 1"; + } + final String finalSql = sql; + + try { + JdbcTemplate jt = new JdbcTemplate(ds); + List> result = jt.execute((StatementCallback>>) stmt -> { + try (ResultSet rs = stmt.executeQuery(finalSql)) { + ResultSetMetaData meta = rs.getMetaData(); + int colCount = meta.getColumnCount(); + List> rows = new ArrayList<>(); + while (rs.next()) { + Map row = new LinkedHashMap<>(); + for (int i = 1; i <= colCount; i++) { + row.put(meta.getColumnLabel(i), rs.getObject(i)); + } + rows.add(row); + } + return rows; + } + }); + + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("sql", sql); + data.put("dsType", ds.getClass().getSimpleName()); + data.put("rowCount", result.size()); + data.put("rows", result); + + return ResponseResult.successData(data); + } catch (Exception e) { + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("sql", sql); + data.put("error", e.getMessage()); + return ResponseResult.error("数据源查询失败: " + e.getMessage()); + } + } + + /** + * 使用 @TargetDataSource 注解测试数据源(AOP 路由方式) + * + * 根据 dsKey 路由到对应的注解方法,由 AOP 自动切换数据源,验证完整的注解路由链路。 + * 支持以下 key:dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave + */ + @GetMapping("/test-anno/{dsKey}") + @Operation(summary = "注解方式测试数据源(@TargetDataSource AOP 路由)") + public ResponseResult testDataSourceByAnnotation(@PathVariable("dsKey") String dsKey) { + try { + List> rows; + switch (dsKey) { + case "dm-master": + rows = dynamicDataSourceTestService.testDmMaster(); + break; + case "dm-slave": + rows = dynamicDataSourceTestService.testDmSlave(); + break; + case "oracle-master": + rows = dynamicDataSourceTestService.testOracleMaster(); + break; + case "oracle-slave": + rows = dynamicDataSourceTestService.testOracleSlave(); + break; + case "ext-oracle-master": + rows = dynamicDataSourceTestService.testDevtwOracleMaster(); + break; + case "ext-oracle-slave": + rows = dynamicDataSourceTestService.testDevtwOracleSlave(); + break; + default: + return ResponseResult.error("未预定义注解方法的数据源 key: " + dsKey + + ",可选: dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave"); + } + + // 方法执行完后 AOP 已自动清除上下文,在这里获取不到路由 key + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("method", "动态数据源切换方式"); + data.put("rowCount", rows.size()); + data.put("rows", rows); + return ResponseResult.successData(data); + } catch (Exception e) { + return ResponseResult.error("注解方式数据源测试失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java new file mode 100644 index 00000000..a0cc2dff --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java @@ -0,0 +1,332 @@ +package com.yfd.platform.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 动态数据源注册器,从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置, + * 构建 Druid 连接池并注册到 {@link DynamicDataSource},支持运行时热刷新。 + * + * 使用方式: + * + * 启动时 {@link #init()} 自动注册所有已启用的数据源 + * 运行时调用 {@link #refresh()} 重新读取表并热刷新(零中断) + * + */ +@Component +public class DynamicDataSourceRegistry { + + private static final Logger log = LoggerFactory.getLogger(DynamicDataSourceRegistry.class); + + /** 业务主库(dm-master)的 DataSource,用于查询 GEN_DATASOURCE_CONF 表 */ + @Resource + @Qualifier("dmMasterDataSource") + private DataSource dmMasterDataSource; + + @Resource + private DynamicDataSource dynamicDataSource; + + private final Object refreshLock = new Object(); + private static final ExecutorService REGISTRY_EXECUTOR = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "dynamic-ds-registry"); + t.setDaemon(true); + return t; + }); + + /** + * 启动时初始化:从数据库表加载所有已启用的数据源并注册 + * + * 异步执行,不阻塞 Spring Boot 启动流程(如 {@code JobRunner} 等 ApplicationRunner) + * 即使表不存在或连接不通,主线程启动不受影响,稍后手动 refresh 即可。 + */ + @PostConstruct + public void init() { + REGISTRY_EXECUTOR.submit(() -> { + try { + log.info("动态数据源后台初始化开始..."); + List configs = loadConfigs(); + if (configs.isEmpty()) { + log.info("GEN_DATASOURCE_CONF 表中无已启用的动态数据源配置,跳过注册"); + return; + } + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + log.info("动态数据源初始化完成: 成功={}, 失败={}", success, fail); + } catch (Exception e) { + log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage()); + } + }); + } + + /** + * 运行时热刷新:重新读取数据库表,自动注册新增/变更的数据源,注销已删除/禁用的数据源 + */ + public void refresh() { + synchronized (refreshLock) { + log.info("开始热刷新动态数据源..."); + List configs = loadConfigs(); + + // 1. 收集表中期望的 key + java.util.Set expectedKeys = new java.util.HashSet<>(); + for (GenDatasourceConf conf : configs) { + if (conf.getDsKey() != null) { + expectedKeys.add(conf.getDsKey()); + } + } + + // 2. 注册或替换表中数据源 + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + + // 3. 注销表中已不存在或已禁用的数据源(排除内置的 dm-master/dm-slave) + java.util.Set registeredKeys = dynamicDataSource.getRegisteredKeys(); + for (Object keyObj : registeredKeys) { + String key = keyObj.toString(); + // 跳过系统内置数据源 + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + continue; + } + if (!expectedKeys.contains(key)) { + dynamicDataSource.unregister(key); + log.info("热刷新: 已注销数据源 key={}", key); + } + } + + log.info("动态数据源热刷新完成: 成功={}, 失败={}, 注销={}", success, fail, + registeredKeys.size() - expectedKeys.size()); + } + } + + /** + * 从数据库表查询所有已启用的数据源配置 + */ + private List loadConfigs() { + JdbcTemplate jt = new JdbcTemplate(dmMasterDataSource); + String sql = "SELECT * FROM GEN_DATASOURCE_CONF WHERE NVL(IS_DELETED, 0) = 0 AND NVL(ENABLED, 1) = 1 ORDER BY ORDER_INDEX"; + List> rows = jt.queryForList(sql); + List list = new ArrayList<>(rows.size()); + for (Map row : rows) { + GenDatasourceConf conf = mapRow(row); + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + log.warn("GEN_DATASOURCE_CONF 记录 ID={} 缺少 DS_KEY,跳过", row.get("ID")); + continue; + } + list.add(conf); + } + return list; + } + + /** + * 尝试注册单个数据源 + * + * @return true-注册成功;false-注册失败 + */ + private boolean tryRegister(GenDatasourceConf conf) { + String key = conf.getDsKey().trim(); + try { + DruidDataSource ds = buildDataSource(conf); + // 使用 registerReplace 热替换,运行时零中断 + dynamicDataSource.registerReplace(key, ds); + log.info("数据源注册成功: key={}, url={}", key, conf.getUrl()); + return true; + } catch (Exception e) { + log.error("数据源注册失败: key={}, url={}, 原因={}", key, conf.getUrl(), e.getMessage(), e); + return false; + } + } + + /** + * 运行时手动注册(API 调用),不持久化到数据库表 + * + * @return true-注册成功 + */ + public boolean registerRuntime(GenDatasourceConf conf) { + return tryRegister(conf); + } + + /** + * 根据配置构建 Druid 数据源 + */ + private DruidDataSource buildDataSource(GenDatasourceConf conf) { + DruidDataSource ds = new DruidDataSource(); + + // 驱动:先按 URL 自动识别,再按配置 + String driver = conf.getDriver(); + if (driver == null || driver.isBlank()) { + driver = resolveDriverFromUrl(conf.getUrl()); + } + ds.setDriverClassName(driver); + ds.setUrl(conf.getUrl()); + ds.setUsername(conf.getUsername()); + ds.setPassword(conf.getPassword()); + + // 连接池大小 + int maxActive = (conf.getMaxActive() != null && conf.getMaxActive() > 0) + ? conf.getMaxActive() : 20; + ds.setInitialSize(Math.min(5, maxActive)); + ds.setMinIdle(Math.min(5, maxActive)); + ds.setMaxActive(maxActive); + + // 超时 + long connTimeout = (conf.getConnTimeout() != null && conf.getConnTimeout() > 0) + ? conf.getConnTimeout() : 30000L; + ds.setMaxWait(connTimeout); + + // 通用连接池配置:根据 URL 自动选择正确的 validationQuery + // Oracle 需要 SELECT 1 FROM DUAL,DM/MySQL/PostgreSQL 用 SELECT 1 即可 + ds.setValidationQuery(resolveValidationQuery(driver, conf.getUrl())); + ds.setValidationQueryTimeout(3); + ds.setTestWhileIdle(true); + ds.setTestOnBorrow(false); + ds.setTestOnReturn(false); + ds.setKeepAlive(true); + ds.setBreakAfterAcquireFailure(true); + ds.setConnectionErrorRetryAttempts(0); + ds.setTimeBetweenConnectErrorMillis(30000); + ds.setTimeBetweenEvictionRunsMillis(60000); + ds.setMinEvictableIdleTimeMillis(180000); + ds.setMaxEvictableIdleTimeMillis(300000); + ds.setRemoveAbandoned(true); + ds.setRemoveAbandonedTimeout(1800); + ds.setLogAbandoned(true); + + try { + ds.init(); + } catch (SQLException e) { + // 关闭半初始化的连接池再抛出 + ds.close(); + throw new IllegalStateException("初始化数据源失败: " + conf.getUrl(), e); + } + + return ds; + } + + /** + * 根据 URL 自动识别 JDBC 驱动类名 + */ + private String resolveDriverFromUrl(String url) { + if (url == null) { + throw new IllegalArgumentException("URL 为空,无法自动识别驱动类型"); + } + String lower = url.toLowerCase(); + if (lower.startsWith("jdbc:dm")) { + return "dm.jdbc.driver.DmDriver"; + } + if (lower.startsWith("jdbc:oracle")) { + return "oracle.jdbc.OracleDriver"; + } + if (lower.startsWith("jdbc:mysql")) { + return "com.mysql.cj.jdbc.Driver"; + } + if (lower.startsWith("jdbc:postgresql")) { + return "org.postgresql.Driver"; + } + if (lower.startsWith("jdbc:sqlserver") || lower.startsWith("jdbc:microsoft")) { + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + throw new IllegalArgumentException("无法根据 URL 自动识别驱动类型: " + url); + } + + /** + * 根据驱动/URL 自动选择正确的 validationQuery + * + * Oracle → {@code SELECT 1 FROM DUAL} + * DM / MySQL / PostgreSQL / SQLServer → {@code SELECT 1} + * + */ + private String resolveValidationQuery(String driverClassName, String url) { + String lowerDriver = driverClassName != null ? driverClassName.toLowerCase() : ""; + String lowerUrl = url != null ? url.toLowerCase() : ""; + // Oracle 驱动 + if (lowerDriver.contains("oracle") || lowerUrl.contains("jdbc:oracle")) { + return "SELECT 1 FROM DUAL"; + } + // 其他数据库(DM / MySQL / PostgreSQL / SQLServer 等)通用 + return "SELECT 1"; + } + + /** + * 将数据库行映射为实体 + */ + private GenDatasourceConf mapRow(Map row) { + GenDatasourceConf conf = new GenDatasourceConf(); + conf.setId(strVal(row.get("ID"))); + conf.setDriver(strVal(row.get("DRIVER"))); + conf.setUrl(strVal(row.get("URL"))); + conf.setUsername(strVal(row.get("USERNAME"))); + conf.setPassword(strVal(row.get("PASSWORD"))); + conf.setInternal(intVal(row.get("INTERNAL"))); + conf.setOrderIndex(intVal(row.get("ORDER_INDEX"))); + conf.setFilterContent(strVal(row.get("FILTER_CONTENT"))); + conf.setRecordUser(strVal(row.get("RECORD_USER"))); + conf.setRecordTime(dateVal(row.get("RECORD_TIME"))); + conf.setModifyUser(strVal(row.get("MODIFY_USER"))); + conf.setModifyTime(dateVal(row.get("MODIFY_TIME"))); + conf.setIsDeleted(intVal(row.get("IS_DELETED"))); + conf.setDeleteUser(strVal(row.get("DELETE_USER"))); + conf.setDeleteTime(dateVal(row.get("DELETE_TIME"))); + conf.setCreateDate(dateVal(row.get("CREATE_DATE"))); + conf.setUpdateDate(dateVal(row.get("UPDATE_DATE"))); + conf.setDelFlag(strVal(row.get("DEL_FLAG"))); + // 扩展字段 + conf.setDsKey(strVal(row.get("DS_KEY"))); + conf.setEnabled(intVal(row.get("ENABLED"))); + conf.setDsName(strVal(row.get("DS_NAME"))); + conf.setDsDesc(strVal(row.get("DS_DESC"))); + conf.setConnTimeout(longVal(row.get("CONN_TIMEOUT"))); + conf.setMaxActive(intVal(row.get("MAX_ACTIVE"))); + return conf; + } + + private String strVal(Object obj) { + return obj == null ? null : obj.toString(); + } + + private Integer intVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).intValue(); + try { return Integer.parseInt(obj.toString()); } catch (Exception e) { return null; } + } + + private Long longVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).longValue(); + try { return Long.parseLong(obj.toString()); } catch (Exception e) { return null; } + } + + private java.util.Date dateVal(Object obj) { + if (obj == null) return null; + if (obj instanceof java.util.Date) return (java.util.Date) obj; + if (obj instanceof java.sql.Date) return new java.util.Date(((java.sql.Date) obj).getTime()); + if (obj instanceof java.sql.Timestamp) return new java.util.Date(((java.sql.Timestamp) obj).getTime()); + return null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java new file mode 100644 index 00000000..22020bb6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java @@ -0,0 +1,50 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 动态数据源测试服务,使用 @TargetDataSource 注解切换数据源。 + * + * 每个方法对应一个固定数据源 key,通过注解指定,验证 AOP 路由是否正常工作。 + */ +@Service +public class DynamicDataSourceTestService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @TargetDataSource(DataSourceKeys.DM_MASTER) + public List> testDmMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource(DataSourceKeys.DM_SLAVE) + public List> testDmSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-master") + public List> testOracleMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-slave") + public List> testOracleSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("ext-oracle-master") + public List> testDevtwOracleMaster() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } + + @TargetDataSource("ext-oracle-slave") + public List> testDevtwOracleSlave() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java new file mode 100644 index 00000000..80eec524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java @@ -0,0 +1,125 @@ +package com.yfd.platform.datasource; + +import java.util.Date; + +/** + * GEN_DATASOURCE_CONF 数据源配置表实体,用于动态数据源注册 + * + * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
标注在实体字段上,配合 {@code ExcelUtil} 即可实现该字段的导出。 + * 支持的转换能力:字典翻译(dictType)、静态值转换(readConverterExp)、日期格式化。
+ * @Excel(name = "性别", dictType = "sys_user_sex", sort = 3) + * private Integer gender; + * + * @Excel(name = "状态", readConverterExp = "0=停用,1=正常", sort = 5) + * private Integer status; + * + * @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss", sort = 6) + * private LocalDateTime createTime; + *
+ * 系统内置 key(yml 固定配置): + *
+ * 其他数据源(如 Oracle、MySQL、PostgreSQL 等)通过数据库表 + * {@code GEN_DATASOURCE_CONF} 动态注册,见 {@link DynamicDataSourceRegistry}。 * * @author yfd */ @Configuration public class DynamicDataSourceConfig { - // ==================== 达梦(DM) 数据源 ==================== + // ==================== 达梦(DM) 数据源(业务主库,yml 固定配置) ==================== @Bean @ConfigurationProperties("spring.datasource.druid.dm-master") + @ConditionalOnProperty(prefix = "spring.datasource.druid.dm-master", name = "enabled", havingValue = "true", matchIfMissing = true) public DataSource dmMasterDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; + return newDruidDataSource(); } @Bean @ConfigurationProperties("spring.datasource.druid.dm-slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.dm-slave", name = "enabled", havingValue = "true", matchIfMissing = true) public DataSource dmSlaveDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; - } - - // ==================== Oracle 数据源 ==================== - - @Bean - @ConfigurationProperties("spring.datasource.druid.oracle-master") - public DataSource oracleMasterDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; - } - - @Bean - @ConfigurationProperties("spring.datasource.druid.oracle-slave") - public DataSource oracleSlaveDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setBreakAfterAcquireFailure(true); - dataSource.setConnectionErrorRetryAttempts(0); - return dataSource; + return newDruidDataSource(); } // ==================== 路由数据源 ==================== @Bean @Primary - public DynamicDataSource dataSource(DataSource dmMasterDataSource, - DataSource dmSlaveDataSource, - DataSource oracleMasterDataSource, - DataSource oracleSlaveDataSource) { - Map targetDataSources = new HashMap<>(); - targetDataSources.put(DataSourceKeys.DM_MASTER, dmMasterDataSource); - targetDataSources.put(DataSourceKeys.DM_SLAVE, dmSlaveDataSource); - targetDataSources.put(DataSourceKeys.ORACLE_MASTER, oracleMasterDataSource); - targetDataSources.put(DataSourceKeys.ORACLE_SLAVE, oracleSlaveDataSource); + public DynamicDataSource dataSource(@Qualifier("dmMasterDataSource") ObjectProvider dmMaster, + @Qualifier("dmSlaveDataSource") ObjectProvider dmSlave) { + Map targetDataSources = new HashMap<>(); + putIfPresent(targetDataSources, DataSourceKeys.DM_MASTER, dmMaster); + putIfPresent(targetDataSources, DataSourceKeys.DM_SLAVE, dmSlave); + // 默认使用达梦主库 - return new DynamicDataSource(dmMasterDataSource, targetDataSources); + DataSource defaultDataSource = dmMaster.getIfAvailable(); + if (defaultDataSource == null) { + defaultDataSource = targetDataSources.values().stream().findFirst() + .orElseThrow(() -> new IllegalStateException("未开启任何数据源,请至少启用一个数据源")); + } + return new DynamicDataSource(defaultDataSource, targetDataSources); } -} + + private DruidDataSource newDruidDataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setBreakAfterAcquireFailure(true); + dataSource.setConnectionErrorRetryAttempts(0); + return dataSource; + } + + private void putIfPresent(Map targetDataSources, String key, ObjectProvider provider) { + DataSource dataSource = provider.getIfAvailable(); + if (dataSource != null) { + targetDataSources.put(key, dataSource); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java new file mode 100644 index 00000000..1c722ba0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceController.java @@ -0,0 +1,219 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.config.ResponseResult; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.StatementCallback; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.util.*; + +/** + * 动态数据源管理控制器,提供运行时数据源注册/注销/热刷新/列表查询等操作。 + * + * 数据源配置存储在数据库表 {@code GEN_DATASOURCE_CONF} 中,通过此接口可: + * + * 查看当前已注册的所有数据源 + * 手动注册/注销单个数据源 + * 从数据库表热刷新全部数据源 + * + */ +@RestController +@RequestMapping("/datasource") +@Tag(name = "动态数据源管理") +@Validated +public class DynamicDataSourceController { + + @Resource + private DynamicDataSourceRegistry dynamicDataSourceRegistry; + + @Resource + private DynamicDataSource dynamicDataSource; + + @Resource + private DynamicDataSourceTestService dynamicDataSourceTestService; + + /** + * 列出所有已注册的数据源(含系统内置 dm-master/dm-slave) + */ + @GetMapping("/list") + @Operation(summary = "列出所有已注册的数据源") + public ResponseResult listDataSources() { + Set keys = dynamicDataSource.getRegisteredKeys(); + List> list = new ArrayList<>(keys.size()); + for (Object key : keys) { + Map item = new LinkedHashMap<>(); + item.put("key", key); + DataSource ds = dynamicDataSource.getDataSourceByKey(key.toString()); + item.put("type", ds == null ? "unknown" : ds.getClass().getSimpleName()); + item.put("alive", ds != null); + list.add(item); + } + // 内置 key 排前,扩展 key 排后 + list.sort(Comparator.comparing(m -> { + String k = (String) m.get("key"); + if (DataSourceKeys.DM_MASTER.equals(k)) return 0; + if (DataSourceKeys.DM_SLAVE.equals(k)) return 1; + return 2; + })); + return ResponseResult.successData(list); + } + + /** + * 热刷新所有数据源:从数据库表重新读取配置并注册 + */ + @PostMapping("/refresh") + @Operation(summary = "热刷新数据源(从数据库表重新读取并注册)") + public ResponseResult refreshDataSources() { + dynamicDataSourceRegistry.refresh(); + return ResponseResult.success("动态数据源热刷新完成"); + } + + /** + * 手动注册一个数据源(仅注册到路由,不持久化到数据库表) + */ + @PostMapping("/register") + @Operation(summary = "手动注册一个数据源(仅运行时,不持久化到表)") + public ResponseResult registerDataSource(@RequestBody GenDatasourceConf conf) { + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + return ResponseResult.error("dsKey 不能为空"); + } + if (conf.getUrl() == null || conf.getUrl().isBlank()) { + return ResponseResult.error("url 不能为空"); + } + if (dynamicDataSourceRegistry.registerRuntime(conf)) { + return ResponseResult.success("数据源手动注册成功: " + conf.getDsKey()); + } else { + return ResponseResult.error("数据源注册失败: " + conf.getDsKey()); + } + } + + /** + * 注销一个数据源 + */ + @DeleteMapping("/unregister/{key}") + @Operation(summary = "注销一个数据源") + public ResponseResult unregisterDataSource(@PathVariable("key") String key) { + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + return ResponseResult.error("系统内置数据源不允许注销"); + } + boolean removed = dynamicDataSource.unregister(key); + if (removed) { + return ResponseResult.success("数据源已注销: " + key); + } else { + return ResponseResult.error("未找到数据源: " + key); + } + } + + /** + * 测试指定数据源连通性,并执行一条查询验证 + * + * @param dsKey 数据源路由 key + * @param sql 可选 SQL(默认自动选择 SELECT 1 或 SELECT 1 FROM DUAL) + * @return 查询结果 + */ + @GetMapping("/test/{dsKey}") + @Operation(summary = "测试数据源连通性(执行查询验证)") + public ResponseResult testDataSource(@PathVariable("dsKey") String dsKey, + @RequestParam(value = "sql", required = false) String sql) { + DataSource ds = dynamicDataSource.getDataSourceByKey(dsKey); + if (ds == null) { + return ResponseResult.error("未找到数据源: " + dsKey + ",请先注册或查看 /datasource/list"); + } + + // 自动选择默认验证 SQL + if (sql == null || sql.isBlank()) { + String lowerKey = dsKey.toLowerCase(); + sql = lowerKey.contains("oracle") ? "SELECT 1 FROM DUAL" : "SELECT 1"; + } + final String finalSql = sql; + + try { + JdbcTemplate jt = new JdbcTemplate(ds); + List> result = jt.execute((StatementCallback>>) stmt -> { + try (ResultSet rs = stmt.executeQuery(finalSql)) { + ResultSetMetaData meta = rs.getMetaData(); + int colCount = meta.getColumnCount(); + List> rows = new ArrayList<>(); + while (rs.next()) { + Map row = new LinkedHashMap<>(); + for (int i = 1; i <= colCount; i++) { + row.put(meta.getColumnLabel(i), rs.getObject(i)); + } + rows.add(row); + } + return rows; + } + }); + + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("sql", sql); + data.put("dsType", ds.getClass().getSimpleName()); + data.put("rowCount", result.size()); + data.put("rows", result); + + return ResponseResult.successData(data); + } catch (Exception e) { + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("sql", sql); + data.put("error", e.getMessage()); + return ResponseResult.error("数据源查询失败: " + e.getMessage()); + } + } + + /** + * 使用 @TargetDataSource 注解测试数据源(AOP 路由方式) + * + * 根据 dsKey 路由到对应的注解方法,由 AOP 自动切换数据源,验证完整的注解路由链路。 + * 支持以下 key:dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave + */ + @GetMapping("/test-anno/{dsKey}") + @Operation(summary = "注解方式测试数据源(@TargetDataSource AOP 路由)") + public ResponseResult testDataSourceByAnnotation(@PathVariable("dsKey") String dsKey) { + try { + List> rows; + switch (dsKey) { + case "dm-master": + rows = dynamicDataSourceTestService.testDmMaster(); + break; + case "dm-slave": + rows = dynamicDataSourceTestService.testDmSlave(); + break; + case "oracle-master": + rows = dynamicDataSourceTestService.testOracleMaster(); + break; + case "oracle-slave": + rows = dynamicDataSourceTestService.testOracleSlave(); + break; + case "ext-oracle-master": + rows = dynamicDataSourceTestService.testDevtwOracleMaster(); + break; + case "ext-oracle-slave": + rows = dynamicDataSourceTestService.testDevtwOracleSlave(); + break; + default: + return ResponseResult.error("未预定义注解方法的数据源 key: " + dsKey + + ",可选: dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave"); + } + + // 方法执行完后 AOP 已自动清除上下文,在这里获取不到路由 key + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("method", "动态数据源切换方式"); + data.put("rowCount", rows.size()); + data.put("rows", rows); + return ResponseResult.successData(data); + } catch (Exception e) { + return ResponseResult.error("注解方式数据源测试失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java new file mode 100644 index 00000000..a0cc2dff --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java @@ -0,0 +1,332 @@ +package com.yfd.platform.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 动态数据源注册器,从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置, + * 构建 Druid 连接池并注册到 {@link DynamicDataSource},支持运行时热刷新。 + * + * 使用方式: + * + * 启动时 {@link #init()} 自动注册所有已启用的数据源 + * 运行时调用 {@link #refresh()} 重新读取表并热刷新(零中断) + * + */ +@Component +public class DynamicDataSourceRegistry { + + private static final Logger log = LoggerFactory.getLogger(DynamicDataSourceRegistry.class); + + /** 业务主库(dm-master)的 DataSource,用于查询 GEN_DATASOURCE_CONF 表 */ + @Resource + @Qualifier("dmMasterDataSource") + private DataSource dmMasterDataSource; + + @Resource + private DynamicDataSource dynamicDataSource; + + private final Object refreshLock = new Object(); + private static final ExecutorService REGISTRY_EXECUTOR = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "dynamic-ds-registry"); + t.setDaemon(true); + return t; + }); + + /** + * 启动时初始化:从数据库表加载所有已启用的数据源并注册 + * + * 异步执行,不阻塞 Spring Boot 启动流程(如 {@code JobRunner} 等 ApplicationRunner) + * 即使表不存在或连接不通,主线程启动不受影响,稍后手动 refresh 即可。 + */ + @PostConstruct + public void init() { + REGISTRY_EXECUTOR.submit(() -> { + try { + log.info("动态数据源后台初始化开始..."); + List configs = loadConfigs(); + if (configs.isEmpty()) { + log.info("GEN_DATASOURCE_CONF 表中无已启用的动态数据源配置,跳过注册"); + return; + } + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + log.info("动态数据源初始化完成: 成功={}, 失败={}", success, fail); + } catch (Exception e) { + log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage()); + } + }); + } + + /** + * 运行时热刷新:重新读取数据库表,自动注册新增/变更的数据源,注销已删除/禁用的数据源 + */ + public void refresh() { + synchronized (refreshLock) { + log.info("开始热刷新动态数据源..."); + List configs = loadConfigs(); + + // 1. 收集表中期望的 key + java.util.Set expectedKeys = new java.util.HashSet<>(); + for (GenDatasourceConf conf : configs) { + if (conf.getDsKey() != null) { + expectedKeys.add(conf.getDsKey()); + } + } + + // 2. 注册或替换表中数据源 + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + + // 3. 注销表中已不存在或已禁用的数据源(排除内置的 dm-master/dm-slave) + java.util.Set registeredKeys = dynamicDataSource.getRegisteredKeys(); + for (Object keyObj : registeredKeys) { + String key = keyObj.toString(); + // 跳过系统内置数据源 + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + continue; + } + if (!expectedKeys.contains(key)) { + dynamicDataSource.unregister(key); + log.info("热刷新: 已注销数据源 key={}", key); + } + } + + log.info("动态数据源热刷新完成: 成功={}, 失败={}, 注销={}", success, fail, + registeredKeys.size() - expectedKeys.size()); + } + } + + /** + * 从数据库表查询所有已启用的数据源配置 + */ + private List loadConfigs() { + JdbcTemplate jt = new JdbcTemplate(dmMasterDataSource); + String sql = "SELECT * FROM GEN_DATASOURCE_CONF WHERE NVL(IS_DELETED, 0) = 0 AND NVL(ENABLED, 1) = 1 ORDER BY ORDER_INDEX"; + List> rows = jt.queryForList(sql); + List list = new ArrayList<>(rows.size()); + for (Map row : rows) { + GenDatasourceConf conf = mapRow(row); + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + log.warn("GEN_DATASOURCE_CONF 记录 ID={} 缺少 DS_KEY,跳过", row.get("ID")); + continue; + } + list.add(conf); + } + return list; + } + + /** + * 尝试注册单个数据源 + * + * @return true-注册成功;false-注册失败 + */ + private boolean tryRegister(GenDatasourceConf conf) { + String key = conf.getDsKey().trim(); + try { + DruidDataSource ds = buildDataSource(conf); + // 使用 registerReplace 热替换,运行时零中断 + dynamicDataSource.registerReplace(key, ds); + log.info("数据源注册成功: key={}, url={}", key, conf.getUrl()); + return true; + } catch (Exception e) { + log.error("数据源注册失败: key={}, url={}, 原因={}", key, conf.getUrl(), e.getMessage(), e); + return false; + } + } + + /** + * 运行时手动注册(API 调用),不持久化到数据库表 + * + * @return true-注册成功 + */ + public boolean registerRuntime(GenDatasourceConf conf) { + return tryRegister(conf); + } + + /** + * 根据配置构建 Druid 数据源 + */ + private DruidDataSource buildDataSource(GenDatasourceConf conf) { + DruidDataSource ds = new DruidDataSource(); + + // 驱动:先按 URL 自动识别,再按配置 + String driver = conf.getDriver(); + if (driver == null || driver.isBlank()) { + driver = resolveDriverFromUrl(conf.getUrl()); + } + ds.setDriverClassName(driver); + ds.setUrl(conf.getUrl()); + ds.setUsername(conf.getUsername()); + ds.setPassword(conf.getPassword()); + + // 连接池大小 + int maxActive = (conf.getMaxActive() != null && conf.getMaxActive() > 0) + ? conf.getMaxActive() : 20; + ds.setInitialSize(Math.min(5, maxActive)); + ds.setMinIdle(Math.min(5, maxActive)); + ds.setMaxActive(maxActive); + + // 超时 + long connTimeout = (conf.getConnTimeout() != null && conf.getConnTimeout() > 0) + ? conf.getConnTimeout() : 30000L; + ds.setMaxWait(connTimeout); + + // 通用连接池配置:根据 URL 自动选择正确的 validationQuery + // Oracle 需要 SELECT 1 FROM DUAL,DM/MySQL/PostgreSQL 用 SELECT 1 即可 + ds.setValidationQuery(resolveValidationQuery(driver, conf.getUrl())); + ds.setValidationQueryTimeout(3); + ds.setTestWhileIdle(true); + ds.setTestOnBorrow(false); + ds.setTestOnReturn(false); + ds.setKeepAlive(true); + ds.setBreakAfterAcquireFailure(true); + ds.setConnectionErrorRetryAttempts(0); + ds.setTimeBetweenConnectErrorMillis(30000); + ds.setTimeBetweenEvictionRunsMillis(60000); + ds.setMinEvictableIdleTimeMillis(180000); + ds.setMaxEvictableIdleTimeMillis(300000); + ds.setRemoveAbandoned(true); + ds.setRemoveAbandonedTimeout(1800); + ds.setLogAbandoned(true); + + try { + ds.init(); + } catch (SQLException e) { + // 关闭半初始化的连接池再抛出 + ds.close(); + throw new IllegalStateException("初始化数据源失败: " + conf.getUrl(), e); + } + + return ds; + } + + /** + * 根据 URL 自动识别 JDBC 驱动类名 + */ + private String resolveDriverFromUrl(String url) { + if (url == null) { + throw new IllegalArgumentException("URL 为空,无法自动识别驱动类型"); + } + String lower = url.toLowerCase(); + if (lower.startsWith("jdbc:dm")) { + return "dm.jdbc.driver.DmDriver"; + } + if (lower.startsWith("jdbc:oracle")) { + return "oracle.jdbc.OracleDriver"; + } + if (lower.startsWith("jdbc:mysql")) { + return "com.mysql.cj.jdbc.Driver"; + } + if (lower.startsWith("jdbc:postgresql")) { + return "org.postgresql.Driver"; + } + if (lower.startsWith("jdbc:sqlserver") || lower.startsWith("jdbc:microsoft")) { + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + throw new IllegalArgumentException("无法根据 URL 自动识别驱动类型: " + url); + } + + /** + * 根据驱动/URL 自动选择正确的 validationQuery + * + * Oracle → {@code SELECT 1 FROM DUAL} + * DM / MySQL / PostgreSQL / SQLServer → {@code SELECT 1} + * + */ + private String resolveValidationQuery(String driverClassName, String url) { + String lowerDriver = driverClassName != null ? driverClassName.toLowerCase() : ""; + String lowerUrl = url != null ? url.toLowerCase() : ""; + // Oracle 驱动 + if (lowerDriver.contains("oracle") || lowerUrl.contains("jdbc:oracle")) { + return "SELECT 1 FROM DUAL"; + } + // 其他数据库(DM / MySQL / PostgreSQL / SQLServer 等)通用 + return "SELECT 1"; + } + + /** + * 将数据库行映射为实体 + */ + private GenDatasourceConf mapRow(Map row) { + GenDatasourceConf conf = new GenDatasourceConf(); + conf.setId(strVal(row.get("ID"))); + conf.setDriver(strVal(row.get("DRIVER"))); + conf.setUrl(strVal(row.get("URL"))); + conf.setUsername(strVal(row.get("USERNAME"))); + conf.setPassword(strVal(row.get("PASSWORD"))); + conf.setInternal(intVal(row.get("INTERNAL"))); + conf.setOrderIndex(intVal(row.get("ORDER_INDEX"))); + conf.setFilterContent(strVal(row.get("FILTER_CONTENT"))); + conf.setRecordUser(strVal(row.get("RECORD_USER"))); + conf.setRecordTime(dateVal(row.get("RECORD_TIME"))); + conf.setModifyUser(strVal(row.get("MODIFY_USER"))); + conf.setModifyTime(dateVal(row.get("MODIFY_TIME"))); + conf.setIsDeleted(intVal(row.get("IS_DELETED"))); + conf.setDeleteUser(strVal(row.get("DELETE_USER"))); + conf.setDeleteTime(dateVal(row.get("DELETE_TIME"))); + conf.setCreateDate(dateVal(row.get("CREATE_DATE"))); + conf.setUpdateDate(dateVal(row.get("UPDATE_DATE"))); + conf.setDelFlag(strVal(row.get("DEL_FLAG"))); + // 扩展字段 + conf.setDsKey(strVal(row.get("DS_KEY"))); + conf.setEnabled(intVal(row.get("ENABLED"))); + conf.setDsName(strVal(row.get("DS_NAME"))); + conf.setDsDesc(strVal(row.get("DS_DESC"))); + conf.setConnTimeout(longVal(row.get("CONN_TIMEOUT"))); + conf.setMaxActive(intVal(row.get("MAX_ACTIVE"))); + return conf; + } + + private String strVal(Object obj) { + return obj == null ? null : obj.toString(); + } + + private Integer intVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).intValue(); + try { return Integer.parseInt(obj.toString()); } catch (Exception e) { return null; } + } + + private Long longVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).longValue(); + try { return Long.parseLong(obj.toString()); } catch (Exception e) { return null; } + } + + private java.util.Date dateVal(Object obj) { + if (obj == null) return null; + if (obj instanceof java.util.Date) return (java.util.Date) obj; + if (obj instanceof java.sql.Date) return new java.util.Date(((java.sql.Date) obj).getTime()); + if (obj instanceof java.sql.Timestamp) return new java.util.Date(((java.sql.Timestamp) obj).getTime()); + return null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java new file mode 100644 index 00000000..22020bb6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java @@ -0,0 +1,50 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 动态数据源测试服务,使用 @TargetDataSource 注解切换数据源。 + * + * 每个方法对应一个固定数据源 key,通过注解指定,验证 AOP 路由是否正常工作。 + */ +@Service +public class DynamicDataSourceTestService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @TargetDataSource(DataSourceKeys.DM_MASTER) + public List> testDmMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource(DataSourceKeys.DM_SLAVE) + public List> testDmSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-master") + public List> testOracleMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-slave") + public List> testOracleSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("ext-oracle-master") + public List> testDevtwOracleMaster() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } + + @TargetDataSource("ext-oracle-slave") + public List> testDevtwOracleSlave() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java new file mode 100644 index 00000000..80eec524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java @@ -0,0 +1,125 @@ +package com.yfd.platform.datasource; + +import java.util.Date; + +/** + * GEN_DATASOURCE_CONF 数据源配置表实体,用于动态数据源注册 + * + * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 数据源配置存储在数据库表 {@code GEN_DATASOURCE_CONF} 中,通过此接口可: + *
+ * 根据 dsKey 路由到对应的注解方法,由 AOP 自动切换数据源,验证完整的注解路由链路。 + * 支持以下 key:dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave + */ + @GetMapping("/test-anno/{dsKey}") + @Operation(summary = "注解方式测试数据源(@TargetDataSource AOP 路由)") + public ResponseResult testDataSourceByAnnotation(@PathVariable("dsKey") String dsKey) { + try { + List> rows; + switch (dsKey) { + case "dm-master": + rows = dynamicDataSourceTestService.testDmMaster(); + break; + case "dm-slave": + rows = dynamicDataSourceTestService.testDmSlave(); + break; + case "oracle-master": + rows = dynamicDataSourceTestService.testOracleMaster(); + break; + case "oracle-slave": + rows = dynamicDataSourceTestService.testOracleSlave(); + break; + case "ext-oracle-master": + rows = dynamicDataSourceTestService.testDevtwOracleMaster(); + break; + case "ext-oracle-slave": + rows = dynamicDataSourceTestService.testDevtwOracleSlave(); + break; + default: + return ResponseResult.error("未预定义注解方法的数据源 key: " + dsKey + + ",可选: dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave"); + } + + // 方法执行完后 AOP 已自动清除上下文,在这里获取不到路由 key + Map data = new LinkedHashMap<>(); + data.put("dsKey", dsKey); + data.put("method", "动态数据源切换方式"); + data.put("rowCount", rows.size()); + data.put("rows", rows); + return ResponseResult.successData(data); + } catch (Exception e) { + return ResponseResult.error("注解方式数据源测试失败: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java new file mode 100644 index 00000000..a0cc2dff --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java @@ -0,0 +1,332 @@ +package com.yfd.platform.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 动态数据源注册器,从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置, + * 构建 Druid 连接池并注册到 {@link DynamicDataSource},支持运行时热刷新。 + * + * 使用方式: + * + * 启动时 {@link #init()} 自动注册所有已启用的数据源 + * 运行时调用 {@link #refresh()} 重新读取表并热刷新(零中断) + * + */ +@Component +public class DynamicDataSourceRegistry { + + private static final Logger log = LoggerFactory.getLogger(DynamicDataSourceRegistry.class); + + /** 业务主库(dm-master)的 DataSource,用于查询 GEN_DATASOURCE_CONF 表 */ + @Resource + @Qualifier("dmMasterDataSource") + private DataSource dmMasterDataSource; + + @Resource + private DynamicDataSource dynamicDataSource; + + private final Object refreshLock = new Object(); + private static final ExecutorService REGISTRY_EXECUTOR = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "dynamic-ds-registry"); + t.setDaemon(true); + return t; + }); + + /** + * 启动时初始化:从数据库表加载所有已启用的数据源并注册 + * + * 异步执行,不阻塞 Spring Boot 启动流程(如 {@code JobRunner} 等 ApplicationRunner) + * 即使表不存在或连接不通,主线程启动不受影响,稍后手动 refresh 即可。 + */ + @PostConstruct + public void init() { + REGISTRY_EXECUTOR.submit(() -> { + try { + log.info("动态数据源后台初始化开始..."); + List configs = loadConfigs(); + if (configs.isEmpty()) { + log.info("GEN_DATASOURCE_CONF 表中无已启用的动态数据源配置,跳过注册"); + return; + } + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + log.info("动态数据源初始化完成: 成功={}, 失败={}", success, fail); + } catch (Exception e) { + log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage()); + } + }); + } + + /** + * 运行时热刷新:重新读取数据库表,自动注册新增/变更的数据源,注销已删除/禁用的数据源 + */ + public void refresh() { + synchronized (refreshLock) { + log.info("开始热刷新动态数据源..."); + List configs = loadConfigs(); + + // 1. 收集表中期望的 key + java.util.Set expectedKeys = new java.util.HashSet<>(); + for (GenDatasourceConf conf : configs) { + if (conf.getDsKey() != null) { + expectedKeys.add(conf.getDsKey()); + } + } + + // 2. 注册或替换表中数据源 + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + + // 3. 注销表中已不存在或已禁用的数据源(排除内置的 dm-master/dm-slave) + java.util.Set registeredKeys = dynamicDataSource.getRegisteredKeys(); + for (Object keyObj : registeredKeys) { + String key = keyObj.toString(); + // 跳过系统内置数据源 + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + continue; + } + if (!expectedKeys.contains(key)) { + dynamicDataSource.unregister(key); + log.info("热刷新: 已注销数据源 key={}", key); + } + } + + log.info("动态数据源热刷新完成: 成功={}, 失败={}, 注销={}", success, fail, + registeredKeys.size() - expectedKeys.size()); + } + } + + /** + * 从数据库表查询所有已启用的数据源配置 + */ + private List loadConfigs() { + JdbcTemplate jt = new JdbcTemplate(dmMasterDataSource); + String sql = "SELECT * FROM GEN_DATASOURCE_CONF WHERE NVL(IS_DELETED, 0) = 0 AND NVL(ENABLED, 1) = 1 ORDER BY ORDER_INDEX"; + List> rows = jt.queryForList(sql); + List list = new ArrayList<>(rows.size()); + for (Map row : rows) { + GenDatasourceConf conf = mapRow(row); + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + log.warn("GEN_DATASOURCE_CONF 记录 ID={} 缺少 DS_KEY,跳过", row.get("ID")); + continue; + } + list.add(conf); + } + return list; + } + + /** + * 尝试注册单个数据源 + * + * @return true-注册成功;false-注册失败 + */ + private boolean tryRegister(GenDatasourceConf conf) { + String key = conf.getDsKey().trim(); + try { + DruidDataSource ds = buildDataSource(conf); + // 使用 registerReplace 热替换,运行时零中断 + dynamicDataSource.registerReplace(key, ds); + log.info("数据源注册成功: key={}, url={}", key, conf.getUrl()); + return true; + } catch (Exception e) { + log.error("数据源注册失败: key={}, url={}, 原因={}", key, conf.getUrl(), e.getMessage(), e); + return false; + } + } + + /** + * 运行时手动注册(API 调用),不持久化到数据库表 + * + * @return true-注册成功 + */ + public boolean registerRuntime(GenDatasourceConf conf) { + return tryRegister(conf); + } + + /** + * 根据配置构建 Druid 数据源 + */ + private DruidDataSource buildDataSource(GenDatasourceConf conf) { + DruidDataSource ds = new DruidDataSource(); + + // 驱动:先按 URL 自动识别,再按配置 + String driver = conf.getDriver(); + if (driver == null || driver.isBlank()) { + driver = resolveDriverFromUrl(conf.getUrl()); + } + ds.setDriverClassName(driver); + ds.setUrl(conf.getUrl()); + ds.setUsername(conf.getUsername()); + ds.setPassword(conf.getPassword()); + + // 连接池大小 + int maxActive = (conf.getMaxActive() != null && conf.getMaxActive() > 0) + ? conf.getMaxActive() : 20; + ds.setInitialSize(Math.min(5, maxActive)); + ds.setMinIdle(Math.min(5, maxActive)); + ds.setMaxActive(maxActive); + + // 超时 + long connTimeout = (conf.getConnTimeout() != null && conf.getConnTimeout() > 0) + ? conf.getConnTimeout() : 30000L; + ds.setMaxWait(connTimeout); + + // 通用连接池配置:根据 URL 自动选择正确的 validationQuery + // Oracle 需要 SELECT 1 FROM DUAL,DM/MySQL/PostgreSQL 用 SELECT 1 即可 + ds.setValidationQuery(resolveValidationQuery(driver, conf.getUrl())); + ds.setValidationQueryTimeout(3); + ds.setTestWhileIdle(true); + ds.setTestOnBorrow(false); + ds.setTestOnReturn(false); + ds.setKeepAlive(true); + ds.setBreakAfterAcquireFailure(true); + ds.setConnectionErrorRetryAttempts(0); + ds.setTimeBetweenConnectErrorMillis(30000); + ds.setTimeBetweenEvictionRunsMillis(60000); + ds.setMinEvictableIdleTimeMillis(180000); + ds.setMaxEvictableIdleTimeMillis(300000); + ds.setRemoveAbandoned(true); + ds.setRemoveAbandonedTimeout(1800); + ds.setLogAbandoned(true); + + try { + ds.init(); + } catch (SQLException e) { + // 关闭半初始化的连接池再抛出 + ds.close(); + throw new IllegalStateException("初始化数据源失败: " + conf.getUrl(), e); + } + + return ds; + } + + /** + * 根据 URL 自动识别 JDBC 驱动类名 + */ + private String resolveDriverFromUrl(String url) { + if (url == null) { + throw new IllegalArgumentException("URL 为空,无法自动识别驱动类型"); + } + String lower = url.toLowerCase(); + if (lower.startsWith("jdbc:dm")) { + return "dm.jdbc.driver.DmDriver"; + } + if (lower.startsWith("jdbc:oracle")) { + return "oracle.jdbc.OracleDriver"; + } + if (lower.startsWith("jdbc:mysql")) { + return "com.mysql.cj.jdbc.Driver"; + } + if (lower.startsWith("jdbc:postgresql")) { + return "org.postgresql.Driver"; + } + if (lower.startsWith("jdbc:sqlserver") || lower.startsWith("jdbc:microsoft")) { + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + throw new IllegalArgumentException("无法根据 URL 自动识别驱动类型: " + url); + } + + /** + * 根据驱动/URL 自动选择正确的 validationQuery + * + * Oracle → {@code SELECT 1 FROM DUAL} + * DM / MySQL / PostgreSQL / SQLServer → {@code SELECT 1} + * + */ + private String resolveValidationQuery(String driverClassName, String url) { + String lowerDriver = driverClassName != null ? driverClassName.toLowerCase() : ""; + String lowerUrl = url != null ? url.toLowerCase() : ""; + // Oracle 驱动 + if (lowerDriver.contains("oracle") || lowerUrl.contains("jdbc:oracle")) { + return "SELECT 1 FROM DUAL"; + } + // 其他数据库(DM / MySQL / PostgreSQL / SQLServer 等)通用 + return "SELECT 1"; + } + + /** + * 将数据库行映射为实体 + */ + private GenDatasourceConf mapRow(Map row) { + GenDatasourceConf conf = new GenDatasourceConf(); + conf.setId(strVal(row.get("ID"))); + conf.setDriver(strVal(row.get("DRIVER"))); + conf.setUrl(strVal(row.get("URL"))); + conf.setUsername(strVal(row.get("USERNAME"))); + conf.setPassword(strVal(row.get("PASSWORD"))); + conf.setInternal(intVal(row.get("INTERNAL"))); + conf.setOrderIndex(intVal(row.get("ORDER_INDEX"))); + conf.setFilterContent(strVal(row.get("FILTER_CONTENT"))); + conf.setRecordUser(strVal(row.get("RECORD_USER"))); + conf.setRecordTime(dateVal(row.get("RECORD_TIME"))); + conf.setModifyUser(strVal(row.get("MODIFY_USER"))); + conf.setModifyTime(dateVal(row.get("MODIFY_TIME"))); + conf.setIsDeleted(intVal(row.get("IS_DELETED"))); + conf.setDeleteUser(strVal(row.get("DELETE_USER"))); + conf.setDeleteTime(dateVal(row.get("DELETE_TIME"))); + conf.setCreateDate(dateVal(row.get("CREATE_DATE"))); + conf.setUpdateDate(dateVal(row.get("UPDATE_DATE"))); + conf.setDelFlag(strVal(row.get("DEL_FLAG"))); + // 扩展字段 + conf.setDsKey(strVal(row.get("DS_KEY"))); + conf.setEnabled(intVal(row.get("ENABLED"))); + conf.setDsName(strVal(row.get("DS_NAME"))); + conf.setDsDesc(strVal(row.get("DS_DESC"))); + conf.setConnTimeout(longVal(row.get("CONN_TIMEOUT"))); + conf.setMaxActive(intVal(row.get("MAX_ACTIVE"))); + return conf; + } + + private String strVal(Object obj) { + return obj == null ? null : obj.toString(); + } + + private Integer intVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).intValue(); + try { return Integer.parseInt(obj.toString()); } catch (Exception e) { return null; } + } + + private Long longVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).longValue(); + try { return Long.parseLong(obj.toString()); } catch (Exception e) { return null; } + } + + private java.util.Date dateVal(Object obj) { + if (obj == null) return null; + if (obj instanceof java.util.Date) return (java.util.Date) obj; + if (obj instanceof java.sql.Date) return new java.util.Date(((java.sql.Date) obj).getTime()); + if (obj instanceof java.sql.Timestamp) return new java.util.Date(((java.sql.Timestamp) obj).getTime()); + return null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java new file mode 100644 index 00000000..22020bb6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java @@ -0,0 +1,50 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 动态数据源测试服务,使用 @TargetDataSource 注解切换数据源。 + * + * 每个方法对应一个固定数据源 key,通过注解指定,验证 AOP 路由是否正常工作。 + */ +@Service +public class DynamicDataSourceTestService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @TargetDataSource(DataSourceKeys.DM_MASTER) + public List> testDmMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource(DataSourceKeys.DM_SLAVE) + public List> testDmSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-master") + public List> testOracleMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-slave") + public List> testOracleSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("ext-oracle-master") + public List> testDevtwOracleMaster() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } + + @TargetDataSource("ext-oracle-slave") + public List> testDevtwOracleSlave() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java new file mode 100644 index 00000000..80eec524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java @@ -0,0 +1,125 @@ +package com.yfd.platform.datasource; + +import java.util.Date; + +/** + * GEN_DATASOURCE_CONF 数据源配置表实体,用于动态数据源注册 + * + * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 使用方式: + *
+ * 异步执行,不阻塞 Spring Boot 启动流程(如 {@code JobRunner} 等 ApplicationRunner) + * 即使表不存在或连接不通,主线程启动不受影响,稍后手动 refresh 即可。 + */ + @PostConstruct + public void init() { + REGISTRY_EXECUTOR.submit(() -> { + try { + log.info("动态数据源后台初始化开始..."); + List configs = loadConfigs(); + if (configs.isEmpty()) { + log.info("GEN_DATASOURCE_CONF 表中无已启用的动态数据源配置,跳过注册"); + return; + } + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + log.info("动态数据源初始化完成: 成功={}, 失败={}", success, fail); + } catch (Exception e) { + log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage()); + } + }); + } + + /** + * 运行时热刷新:重新读取数据库表,自动注册新增/变更的数据源,注销已删除/禁用的数据源 + */ + public void refresh() { + synchronized (refreshLock) { + log.info("开始热刷新动态数据源..."); + List configs = loadConfigs(); + + // 1. 收集表中期望的 key + java.util.Set expectedKeys = new java.util.HashSet<>(); + for (GenDatasourceConf conf : configs) { + if (conf.getDsKey() != null) { + expectedKeys.add(conf.getDsKey()); + } + } + + // 2. 注册或替换表中数据源 + int success = 0; + int fail = 0; + for (GenDatasourceConf conf : configs) { + if (tryRegister(conf)) { + success++; + } else { + fail++; + } + } + + // 3. 注销表中已不存在或已禁用的数据源(排除内置的 dm-master/dm-slave) + java.util.Set registeredKeys = dynamicDataSource.getRegisteredKeys(); + for (Object keyObj : registeredKeys) { + String key = keyObj.toString(); + // 跳过系统内置数据源 + if (DataSourceKeys.DM_MASTER.equals(key) || DataSourceKeys.DM_SLAVE.equals(key)) { + continue; + } + if (!expectedKeys.contains(key)) { + dynamicDataSource.unregister(key); + log.info("热刷新: 已注销数据源 key={}", key); + } + } + + log.info("动态数据源热刷新完成: 成功={}, 失败={}, 注销={}", success, fail, + registeredKeys.size() - expectedKeys.size()); + } + } + + /** + * 从数据库表查询所有已启用的数据源配置 + */ + private List loadConfigs() { + JdbcTemplate jt = new JdbcTemplate(dmMasterDataSource); + String sql = "SELECT * FROM GEN_DATASOURCE_CONF WHERE NVL(IS_DELETED, 0) = 0 AND NVL(ENABLED, 1) = 1 ORDER BY ORDER_INDEX"; + List> rows = jt.queryForList(sql); + List list = new ArrayList<>(rows.size()); + for (Map row : rows) { + GenDatasourceConf conf = mapRow(row); + if (conf.getDsKey() == null || conf.getDsKey().isBlank()) { + log.warn("GEN_DATASOURCE_CONF 记录 ID={} 缺少 DS_KEY,跳过", row.get("ID")); + continue; + } + list.add(conf); + } + return list; + } + + /** + * 尝试注册单个数据源 + * + * @return true-注册成功;false-注册失败 + */ + private boolean tryRegister(GenDatasourceConf conf) { + String key = conf.getDsKey().trim(); + try { + DruidDataSource ds = buildDataSource(conf); + // 使用 registerReplace 热替换,运行时零中断 + dynamicDataSource.registerReplace(key, ds); + log.info("数据源注册成功: key={}, url={}", key, conf.getUrl()); + return true; + } catch (Exception e) { + log.error("数据源注册失败: key={}, url={}, 原因={}", key, conf.getUrl(), e.getMessage(), e); + return false; + } + } + + /** + * 运行时手动注册(API 调用),不持久化到数据库表 + * + * @return true-注册成功 + */ + public boolean registerRuntime(GenDatasourceConf conf) { + return tryRegister(conf); + } + + /** + * 根据配置构建 Druid 数据源 + */ + private DruidDataSource buildDataSource(GenDatasourceConf conf) { + DruidDataSource ds = new DruidDataSource(); + + // 驱动:先按 URL 自动识别,再按配置 + String driver = conf.getDriver(); + if (driver == null || driver.isBlank()) { + driver = resolveDriverFromUrl(conf.getUrl()); + } + ds.setDriverClassName(driver); + ds.setUrl(conf.getUrl()); + ds.setUsername(conf.getUsername()); + ds.setPassword(conf.getPassword()); + + // 连接池大小 + int maxActive = (conf.getMaxActive() != null && conf.getMaxActive() > 0) + ? conf.getMaxActive() : 20; + ds.setInitialSize(Math.min(5, maxActive)); + ds.setMinIdle(Math.min(5, maxActive)); + ds.setMaxActive(maxActive); + + // 超时 + long connTimeout = (conf.getConnTimeout() != null && conf.getConnTimeout() > 0) + ? conf.getConnTimeout() : 30000L; + ds.setMaxWait(connTimeout); + + // 通用连接池配置:根据 URL 自动选择正确的 validationQuery + // Oracle 需要 SELECT 1 FROM DUAL,DM/MySQL/PostgreSQL 用 SELECT 1 即可 + ds.setValidationQuery(resolveValidationQuery(driver, conf.getUrl())); + ds.setValidationQueryTimeout(3); + ds.setTestWhileIdle(true); + ds.setTestOnBorrow(false); + ds.setTestOnReturn(false); + ds.setKeepAlive(true); + ds.setBreakAfterAcquireFailure(true); + ds.setConnectionErrorRetryAttempts(0); + ds.setTimeBetweenConnectErrorMillis(30000); + ds.setTimeBetweenEvictionRunsMillis(60000); + ds.setMinEvictableIdleTimeMillis(180000); + ds.setMaxEvictableIdleTimeMillis(300000); + ds.setRemoveAbandoned(true); + ds.setRemoveAbandonedTimeout(1800); + ds.setLogAbandoned(true); + + try { + ds.init(); + } catch (SQLException e) { + // 关闭半初始化的连接池再抛出 + ds.close(); + throw new IllegalStateException("初始化数据源失败: " + conf.getUrl(), e); + } + + return ds; + } + + /** + * 根据 URL 自动识别 JDBC 驱动类名 + */ + private String resolveDriverFromUrl(String url) { + if (url == null) { + throw new IllegalArgumentException("URL 为空,无法自动识别驱动类型"); + } + String lower = url.toLowerCase(); + if (lower.startsWith("jdbc:dm")) { + return "dm.jdbc.driver.DmDriver"; + } + if (lower.startsWith("jdbc:oracle")) { + return "oracle.jdbc.OracleDriver"; + } + if (lower.startsWith("jdbc:mysql")) { + return "com.mysql.cj.jdbc.Driver"; + } + if (lower.startsWith("jdbc:postgresql")) { + return "org.postgresql.Driver"; + } + if (lower.startsWith("jdbc:sqlserver") || lower.startsWith("jdbc:microsoft")) { + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + throw new IllegalArgumentException("无法根据 URL 自动识别驱动类型: " + url); + } + + /** + * 根据驱动/URL 自动选择正确的 validationQuery + * + * Oracle → {@code SELECT 1 FROM DUAL} + * DM / MySQL / PostgreSQL / SQLServer → {@code SELECT 1} + * + */ + private String resolveValidationQuery(String driverClassName, String url) { + String lowerDriver = driverClassName != null ? driverClassName.toLowerCase() : ""; + String lowerUrl = url != null ? url.toLowerCase() : ""; + // Oracle 驱动 + if (lowerDriver.contains("oracle") || lowerUrl.contains("jdbc:oracle")) { + return "SELECT 1 FROM DUAL"; + } + // 其他数据库(DM / MySQL / PostgreSQL / SQLServer 等)通用 + return "SELECT 1"; + } + + /** + * 将数据库行映射为实体 + */ + private GenDatasourceConf mapRow(Map row) { + GenDatasourceConf conf = new GenDatasourceConf(); + conf.setId(strVal(row.get("ID"))); + conf.setDriver(strVal(row.get("DRIVER"))); + conf.setUrl(strVal(row.get("URL"))); + conf.setUsername(strVal(row.get("USERNAME"))); + conf.setPassword(strVal(row.get("PASSWORD"))); + conf.setInternal(intVal(row.get("INTERNAL"))); + conf.setOrderIndex(intVal(row.get("ORDER_INDEX"))); + conf.setFilterContent(strVal(row.get("FILTER_CONTENT"))); + conf.setRecordUser(strVal(row.get("RECORD_USER"))); + conf.setRecordTime(dateVal(row.get("RECORD_TIME"))); + conf.setModifyUser(strVal(row.get("MODIFY_USER"))); + conf.setModifyTime(dateVal(row.get("MODIFY_TIME"))); + conf.setIsDeleted(intVal(row.get("IS_DELETED"))); + conf.setDeleteUser(strVal(row.get("DELETE_USER"))); + conf.setDeleteTime(dateVal(row.get("DELETE_TIME"))); + conf.setCreateDate(dateVal(row.get("CREATE_DATE"))); + conf.setUpdateDate(dateVal(row.get("UPDATE_DATE"))); + conf.setDelFlag(strVal(row.get("DEL_FLAG"))); + // 扩展字段 + conf.setDsKey(strVal(row.get("DS_KEY"))); + conf.setEnabled(intVal(row.get("ENABLED"))); + conf.setDsName(strVal(row.get("DS_NAME"))); + conf.setDsDesc(strVal(row.get("DS_DESC"))); + conf.setConnTimeout(longVal(row.get("CONN_TIMEOUT"))); + conf.setMaxActive(intVal(row.get("MAX_ACTIVE"))); + return conf; + } + + private String strVal(Object obj) { + return obj == null ? null : obj.toString(); + } + + private Integer intVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).intValue(); + try { return Integer.parseInt(obj.toString()); } catch (Exception e) { return null; } + } + + private Long longVal(Object obj) { + if (obj == null) return null; + if (obj instanceof Number) return ((Number) obj).longValue(); + try { return Long.parseLong(obj.toString()); } catch (Exception e) { return null; } + } + + private java.util.Date dateVal(Object obj) { + if (obj == null) return null; + if (obj instanceof java.util.Date) return (java.util.Date) obj; + if (obj instanceof java.sql.Date) return new java.util.Date(((java.sql.Date) obj).getTime()); + if (obj instanceof java.sql.Timestamp) return new java.util.Date(((java.sql.Timestamp) obj).getTime()); + return null; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java new file mode 100644 index 00000000..22020bb6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceTestService.java @@ -0,0 +1,50 @@ +package com.yfd.platform.datasource; + +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 动态数据源测试服务,使用 @TargetDataSource 注解切换数据源。 + * + * 每个方法对应一个固定数据源 key,通过注解指定,验证 AOP 路由是否正常工作。 + */ +@Service +public class DynamicDataSourceTestService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @TargetDataSource(DataSourceKeys.DM_MASTER) + public List> testDmMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource(DataSourceKeys.DM_SLAVE) + public List> testDmSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-master") + public List> testOracleMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-slave") + public List> testOracleSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("ext-oracle-master") + public List> testDevtwOracleMaster() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } + + @TargetDataSource("ext-oracle-slave") + public List> testDevtwOracleSlave() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java new file mode 100644 index 00000000..80eec524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java @@ -0,0 +1,125 @@ +package com.yfd.platform.datasource; + +import java.util.Date; + +/** + * GEN_DATASOURCE_CONF 数据源配置表实体,用于动态数据源注册 + * + * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 每个方法对应一个固定数据源 key,通过注解指定,验证 AOP 路由是否正常工作。 + */ +@Service +public class DynamicDataSourceTestService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @TargetDataSource(DataSourceKeys.DM_MASTER) + public List> testDmMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource(DataSourceKeys.DM_SLAVE) + public List> testDmSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-master") + public List> testOracleMaster() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("oracle-slave") + public List> testOracleSlave() { + return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null); + } + + @TargetDataSource("ext-oracle-master") + public List> testDevtwOracleMaster() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } + + @TargetDataSource("ext-oracle-slave") + public List> testDevtwOracleSlave() { + return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java new file mode 100644 index 00000000..80eec524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/datasource/GenDatasourceConf.java @@ -0,0 +1,125 @@ +package com.yfd.platform.datasource; + +import java.util.Date; + +/** + * GEN_DATASOURCE_CONF 数据源配置表实体,用于动态数据源注册 + * + * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 字段与数据库表一一对应,使用 {@link com.yfd.platform.common.MicroservicDynamicSQLMapper#getAllList} + * 动态 SQL 查询 / 手动映射,不依赖 MyBatis-Plus 实体扫描。 + */ +public class GenDatasourceConf { + + private String id; + private String driver; + private String url; + private String username; + private String password; + private Integer internal; + private Integer orderIndex; + private String filterContent; + private String recordUser; + private Date recordTime; + private String modifyUser; + private Date modifyTime; + private Integer isDeleted; + private String deleteUser; + private Date deleteTime; + private Date createDate; + private Date updateDate; + private String delFlag; + + // ========== 扩展字段 ========== + + /** 数据源路由 key,全局唯一 */ + private String dsKey; + + /** 是否启用:0=禁用 1=启用 */ + private Integer enabled; + + /** 数据源显示名称 */ + private String dsName; + + /** 数据源描述 */ + private String dsDesc; + + /** 连接超时(毫秒),默认30000 */ + private Long connTimeout; + + /** 最大活跃连接数,默认20 */ + private Integer maxActive; + + // ==================== Getters & Setters ==================== + + public String getId() { return id; } + public void setId(String id) { this.id = id; } + + public String getDriver() { return driver; } + public void setDriver(String driver) { this.driver = driver; } + + public String getUrl() { return url; } + public void setUrl(String url) { this.url = url; } + + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + + public Integer getInternal() { return internal; } + public void setInternal(Integer internal) { this.internal = internal; } + + public Integer getOrderIndex() { return orderIndex; } + public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } + + public String getFilterContent() { return filterContent; } + public void setFilterContent(String filterContent) { this.filterContent = filterContent; } + + public String getRecordUser() { return recordUser; } + public void setRecordUser(String recordUser) { this.recordUser = recordUser; } + + public Date getRecordTime() { return recordTime; } + public void setRecordTime(Date recordTime) { this.recordTime = recordTime; } + + public String getModifyUser() { return modifyUser; } + public void setModifyUser(String modifyUser) { this.modifyUser = modifyUser; } + + public Date getModifyTime() { return modifyTime; } + public void setModifyTime(Date modifyTime) { this.modifyTime = modifyTime; } + + public Integer getIsDeleted() { return isDeleted; } + public void setIsDeleted(Integer isDeleted) { this.isDeleted = isDeleted; } + + public String getDeleteUser() { return deleteUser; } + public void setDeleteUser(String deleteUser) { this.deleteUser = deleteUser; } + + public Date getDeleteTime() { return deleteTime; } + public void setDeleteTime(Date deleteTime) { this.deleteTime = deleteTime; } + + public Date getCreateDate() { return createDate; } + public void setCreateDate(Date createDate) { this.createDate = createDate; } + + public Date getUpdateDate() { return updateDate; } + public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } + + public String getDelFlag() { return delFlag; } + public void setDelFlag(String delFlag) { this.delFlag = delFlag; } + + public String getDsKey() { return dsKey; } + public void setDsKey(String dsKey) { this.dsKey = dsKey; } + + public Integer getEnabled() { return enabled; } + public void setEnabled(Integer enabled) { this.enabled = enabled; } + + public String getDsName() { return dsName; } + public void setDsName(String dsName) { this.dsName = dsName; } + + public String getDsDesc() { return dsDesc; } + public void setDsDesc(String dsDesc) { this.dsDesc = dsDesc; } + + public Long getConnTimeout() { return connTimeout; } + public void setConnTimeout(Long connTimeout) { this.connTimeout = connTimeout; } + + public Integer getMaxActive() { return maxActive; } + public void setMaxActive(Integer maxActive) { this.maxActive = maxActive; } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java index 60f49177..8dcd1dad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAiboxBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAiboxBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAiboxBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/aibox") @@ -51,4 +58,11 @@ public class SdAiboxBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI边缘计算盒子导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAiboxBH.class).exportExcel(response, page.getRecords(), "AI边缘计算盒子数据", "AI边缘计算盒子导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java index 313ad157..d498200a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAimonitorBHController.java @@ -7,10 +7,17 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdAimonitorBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdAimonitorBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; /** * AI智能监测装置管理 @@ -55,4 +62,11 @@ public class SdAimonitorBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "AI智能监测装置导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdAimonitorBH.class).exportExcel(response, page.getRecords(), "AI智能监测装置数据", "AI智能监测装置导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java new file mode 100644 index 00000000..363dc8d1 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdAnimalDictoryBController.java @@ -0,0 +1,255 @@ +package com.yfd.platform.qgc_base.controller; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.annotation.Log; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_data.service.AttachmentUploadService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +/** + * + * 动物字典表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("/env/animalDictory") +@Tag(name = "动物字典管理") +public class SdAnimalDictoryBController { + + @Resource + private ISdAnimalDictoryBService sdAnimalDictoryBService; + + @Resource + private ObjectMapper objectMapper; + + @Resource + private AttachmentUploadService attachmentUploadService; + + @PostMapping("/queryPageList") + @Operation(summary = "分页查询动物字典列表(支持动态过滤和排序)") + public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { + Page page = sdAnimalDictoryBService.queryPageList(request); + return ResponseResult.successData(page); + } + + @PostMapping("/list") + @Operation(summary = "查询动物字典列表(支持动态过滤和排序,不分页)") + public ResponseResult list(@RequestBody DataSourceRequest request) { + List list = DataSourceRequestUtil.executeList(request, SdAnimalDictoryB.class, sdAnimalDictoryBService); + return ResponseResult.successData(list); + } + + @GetMapping("/listByName") + @Operation(summary = "根据名称查询所有动物字典") + public ResponseResult listByName(@RequestParam(required = false) String name) { + return ResponseResult.successData(sdAnimalDictoryBService.list( + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdAnimalDictoryB::getName, name) + .select(SdAnimalDictoryB::getId, SdAnimalDictoryB::getName, SdAnimalDictoryB::getAlias) + )); + } + + @GetMapping("/getById") + @Operation(summary = "根据ID查询动物字典") + public ResponseResult getById(@RequestParam String id) { + return ResponseResult.successData(sdAnimalDictoryBService.getById(id)); + } + + @Log(module = "动物字典管理", value = "新增动物字典") + @PostMapping("/add") + @Operation(summary = "新增动物字典") + public ResponseResult add(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + SdAnimalDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdAnimalDictoryB.class); + if (entity == null) { + return ResponseResult.error("数据不能为空"); + } + entity.setId(IdUtil.fastUUID()); + entity.setCode(entity.getId()); + + // 名称重名校验 + if (sdAnimalDictoryBService.existsByName(entity.getName())) { + return ResponseResult.error("该动物名称已存在"); + } + + // 上传文件并设置附件ID到实体 + applyUploadedFiles(entity, files); + + boolean result = sdAnimalDictoryBService.add(entity, request.getSource()); + return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); + } catch (Exception e) { + log.error("新增动物字典失败", e); + return ResponseResult.error("新增失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "修改动物字典") + @PostMapping("/update") + @Operation(summary = "修改动物字典") + public ResponseResult update(@RequestParam("data") String dataStr, + @RequestParam(value = "files", required = false) List files) { + try { + SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class); + Map engInfo = request == null ? null : request.getEngInfo(); + if (engInfo == null || engInfo.get("id") == null) { + return ResponseResult.error("数据或ID不能为空"); + } + + // 名称重名校验(仅当本次修改了名称时校验) + Object newName = engInfo.get("name"); + if (newName != null && StrUtil.isNotBlank(newName.toString())) { + String name = newName.toString(); + if (sdAnimalDictoryBService.existsByNameExcludeId(name, (String) engInfo.get("id"))) { + return ResponseResult.error("该动物名称已存在"); + } + } + + // 获取修改前的实体,用于后续清理旧文件 + SdAnimalDictoryB before = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList(); + + // 上传新文件并设置附件ID + SdAnimalDictoryB tempEntity = objectMapper.convertValue(engInfo, SdAnimalDictoryB.class); + applyUploadedFiles(tempEntity, files); + // 将文件处理后 inffile 合并回 patch map + engInfo.put("inffile", tempEntity.getInffile()); + + boolean result = sdAnimalDictoryBService.update(engInfo, request.getSource()); + if (result) { + // 清理被替换的旧文件 + SdAnimalDictoryB after = sdAnimalDictoryBService.getById((String) engInfo.get("id")); + deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(after)); + } + return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); + } catch (Exception e) { + log.error("修改动物字典失败", e); + return ResponseResult.error("修改失败: " + e.getMessage()); + } + } + + @Log(module = "动物字典管理", value = "删除动物字典") + @PostMapping("/delete") + @Operation(summary = "删除动物字典") + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + List ids = request == null ? null : request.getIds(); + if (ids == null || ids.isEmpty()) { + return ResponseResult.error("ID不能为空"); + } + + // 删除前先收集所有需要清理的附件ID + List allAttachmentIds = new ArrayList<>(); + for (String id : ids) { + SdAnimalDictoryB entity = sdAnimalDictoryBService.getById(id); + if (entity != null) { + allAttachmentIds.addAll(collectAttachmentIds(entity)); + } + } + + boolean result = sdAnimalDictoryBService.delete(ids, request.getSource()); + if (result) { + // 删除关联的附件 + deleteAttachments(allAttachmentIds); + } + return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); + } + + @GetMapping("/similar") + @Operation(summary = "查询相似动物列表") + public ResponseResult findSimilarAnimals( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdAnimalDictoryBService.findSimilarAnimals(name, limit)); + } + + @PostMapping("/export") + @Operation(summary = "动物字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdAnimalDictoryBService.queryPageList(request); + new ExcelUtil<>(SdAnimalDictoryB.class).exportExcel(response, page.getRecords(), "动物字典数据", "动物字典导出"); + } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接) + */ + private void applyUploadedFiles(SdAnimalDictoryB entity, List files) { + if (files == null || files.isEmpty()) { + return; + } + List attachmentIds = attachmentUploadService.uploadMultipartFiles(files); + if (attachmentIds.isEmpty()) { + return; + } + String newIds = attachmentIds.stream() + .filter(StrUtil::isNotBlank) + .collect(Collectors.joining(",")); + if (StrUtil.isBlank(newIds)) { + return; + } + String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : ""; + String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds; + entity.setInffile(merged); + } + + /** + * 收集实体中inffile字段的附件ID + */ + private List collectAttachmentIds(SdAnimalDictoryB entity) { + List ids = new ArrayList<>(); + if (StrUtil.isNotBlank(entity.getInffile())) { + Arrays.stream(entity.getInffile().split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .forEach(ids::add); + } + return ids; + } + + /** + * 删除被替换的旧文件(old中有但new中没有的) + */ + private void deleteReplacedFiles(List oldIds, List newIds) { + for (String oldId : oldIds) { + if (StrUtil.isBlank(oldId)) continue; + if (!newIds.contains(oldId)) { + attachmentUploadService.deleteFile(oldId); + } + } + } + + /** + * 批量删除附件 + */ + private void deleteAttachments(List attachmentIds) { + for (String id : attachmentIds) { + if (StrUtil.isNotBlank(id)) { + attachmentUploadService.deleteFile(id); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java index 66bf3459..bca3380d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdArtsgBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdArtsgBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdArtsgBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/artsg") @@ -51,4 +58,11 @@ public class SdArtsgBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdArtsgBH.class).exportExcel(response, page.getRecords(), "人工产卵场数据", "人工产卵场导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java index 190b5103..d3cb2df2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdDwBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdDwBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdDwBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/dw") @@ -51,4 +58,11 @@ public class SdDwBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "低温水设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdDwBH.class).exportExcel(response, page.getRecords(), "低温水设施数据", "低温水设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index 82432c41..35a71734 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -25,7 +25,7 @@ public class SdEngMonitorController { private ISdEngInfoBHService engInfoBHService; @GetMapping("/msstbprpt/getStInfoByStcd") - @Operation(summary = "根据站码查询单条电站基础数据") + @Operation(summary = "根据站码查询电站基础数据及关联站点列表") public ResponseResult getStInfoByStcd(@RequestParam String stcd) { return ResponseResult.successData(engInfoBHService.getStInfoByStcd(stcd)); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java index 0a2ba725..26afc4c3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdEqBH; import com.yfd.platform.qgc_base.service.ISdEqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/eq") @@ -51,4 +58,11 @@ public class SdEqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "生态流量设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdEqBH.class).exportExcel(response, page.getRecords(), "生态流量设施数据", "生态流量设施导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java index 89a4119e..d4aecd04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFbrdBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFbrdBH; import com.yfd.platform.qgc_base.service.ISdFbrdBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fbrd") @@ -51,4 +58,11 @@ public class SdFbrdBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "鱼类增殖站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFbrdBH.class).exportExcel(response, page.getRecords(), "鱼类增殖站数据", "鱼类增殖站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java index 735d7106..8ef2aaec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFhbtBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdFhbtBH; import com.yfd.platform.qgc_base.service.ISdFhbtBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/fhbt") @@ -51,4 +58,11 @@ public class SdFhbtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "栖息地保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdFhbtBH.class).exportExcel(response, page.getRecords(), "栖息地保护工程数据", "栖息地保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java index b78b83a4..61049351 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFishDictoryBController.java @@ -13,13 +13,16 @@ import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.qgc_data.service.AttachmentUploadService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.*; import java.util.stream.Collectors; @@ -174,6 +177,13 @@ public class SdFishDictoryBController { return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + @PostMapping("/export") + @Operation(summary = "鱼类字典导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFishDictoryBService.queryPageList(request); + new ExcelUtil<>(SdFishDictoryB.class).exportExcel(response, page.getRecords(), "鱼类字典数据", "鱼类字典导出"); + } + @GetMapping("/similar") @Operation(summary = "查询相似鱼类列表") public ResponseResult findSimilarFish( diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java index 037b0da3..3dd794e8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssBHController.java @@ -8,11 +8,15 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.domain.SdFpssBH; import com.yfd.platform.qgc_base.service.ISdFpssBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + /** * * 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 动物字典表 前端控制器 + *
* 过鱼设施表 前端控制器 @@ -108,4 +112,11 @@ public class SdFpssBHController { boolean result = sdFpssBHService.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "过鱼设施导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = sdFpssBHService.queryPageList(request); + new ExcelUtil<>(SdFpssBH.class).exportExcel(response, page.getRecords(), "过鱼设施数据", "过鱼设施导出"); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java index a47d3826..8d0dbca1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOpinfoBHController.java @@ -6,12 +6,17 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdOpinfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOpinfoBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/opinfo") @Tag(name = "倾斜摄影管理") @@ -51,4 +56,11 @@ public class SdOpinfoBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "倾斜摄影导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOpinfoBH.class).exportExcel(response, page.getRecords(), "倾斜摄影数据", "倾斜摄影导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java index 9e12585a..dfde46a8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtteBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtteBH; import com.yfd.platform.qgc_base.service.ISdOtteBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otte") @@ -51,4 +58,11 @@ public class SdOtteBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtteBH.class).exportExcel(response, page.getRecords(), "陆生生态保护工程数据", "陆生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java index f5ff3740..60baae2e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdOtweBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdOtweBH; import com.yfd.platform.qgc_base.service.ISdOtweBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/otwe") @@ -51,4 +58,11 @@ public class SdOtweBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdOtweBH.class).exportExcel(response, page.getRecords(), "水生生态保护工程数据", "水生生态保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java index 71189278..19590dec 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdSonarBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdSonarBH; import com.yfd.platform.qgc_base.service.ISdSonarBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/sonar") @@ -51,4 +58,11 @@ public class SdSonarBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "声呐及水下摄像导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdSonarBH.class).exportExcel(response, page.getRecords(), "声呐及水下摄像数据", "声呐及水下摄像导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java index c6cdb59a..04c2715d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdTeBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdTeBH; import com.yfd.platform.qgc_base.service.ISdTeBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/te") @@ -51,4 +58,11 @@ public class SdTeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "陆生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdTeBH.class).exportExcel(response, page.getRecords(), "陆生生态调查断面数据", "陆生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java index 6c98dbbc..de6806ac 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVaBHController.java @@ -4,13 +4,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVaBH; import com.yfd.platform.qgc_base.service.ISdVaBHService; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/va") @@ -51,4 +58,11 @@ public class SdVaBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "动物救助站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVaBH.class).exportExcel(response, page.getRecords(), "动物救助站数据", "动物救助站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java index 40451528..dae6ab53 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVdinfoBController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVdinfoB; import com.yfd.platform.qgc_base.service.ISdVdinfoBService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vdinfo") @@ -51,4 +58,11 @@ public class SdVdinfoBController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "视频站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVdinfoB.class).exportExcel(response, page.getRecords(), "视频站数据", "视频站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java index bc82d44f..94ecf986 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdVpBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdVpBH; import com.yfd.platform.qgc_base.service.ISdVpBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/vp") @@ -51,4 +58,11 @@ public class SdVpBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "珍稀植物保护工程导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdVpBH.class).exportExcel(response, page.getRecords(), "珍稀植物保护工程数据", "珍稀植物保护工程导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java index 1c3c3c21..f2b36dc9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWeBHController.java @@ -5,13 +5,18 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.domain.SdWeBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWeBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import java.io.IOException; + @RestController @RequestMapping("/base/we") @Tag(name = "水生生态调查断面管理") @@ -51,4 +56,11 @@ public class SdWeBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水生生态调查断面导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWeBH.class).exportExcel(response, page.getRecords(), "水生生态调查断面数据", "水生生态调查断面导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java index 3dedefc1..0fb1ae98 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWqBHController.java @@ -1,16 +1,23 @@ package com.yfd.platform.qgc_base.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.databind.ObjectMapper; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; +import com.yfd.platform.qgc_base.domain.SdWqBH; import com.yfd.platform.qgc_base.service.ISdWqBHService; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; @RestController @RequestMapping("/base/wq") @@ -51,4 +58,11 @@ public class SdWqBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水质站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWqBH.class).exportExcel(response, page.getRecords(), "水质站数据", "水质站导出"); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java index 2eb6d5c9..790bf783 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdWtBHController.java @@ -7,10 +7,16 @@ import com.yfd.platform.qgc_base.domain.SdWtBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdWtBHService; import com.fasterxml.jackson.databind.ObjectMapper; +import com.yfd.platform.utils.ExcelUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Map; @RestController @RequestMapping("/base/wt") @@ -51,4 +57,19 @@ public class SdWtBHController { boolean result = service.delete(request == null ? null : request.getIds(), request == null ? null : request.getSource()); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @PostMapping("/export") + @Operation(summary = "水温站导出") + public void export(@RequestBody DataSourceRequest request, HttpServletResponse response) throws IOException { + Page page = service.queryPageList(request); + new ExcelUtil<>(SdWtBH.class).exportExcel(response, page.getRecords(), "水温站数据", "水温站导出"); + } + + @PostMapping("/import") + @Operation(summary = "水温站导入") + public ResponseResult importData(@RequestParam("file") MultipartFile file, + @RequestParam(value = "source", required = false) String source) throws Exception { + Map result = service.importData(file, source); + return ResponseResult.successData(result); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java index 485aa4fb..d2913126 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsEiaApprovalB.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import lombok.Data; import java.io.Serializable; @@ -22,102 +23,127 @@ public class MsEiaApprovalB implements Serializable { /** 电站编码 */ @TableField("STCD") + @Excel(name = "电站编码") private String stcd; /** 电站名称 */ @TableField("ENNM") + @Excel(name = "电站名称") private String ennm; /** 所属流域 */ @TableField("BASIN") + @Excel(name = "所属流域") private String basin; /** 所属河流 */ @TableField("RIVER") + @Excel(name = "所属河流") private String river; /** 所属水电基地 */ @TableField("BASEID") + @Excel(name = "所属水电基地") private String baseid; /** 所属水电基地流域 */ @TableField("HBRVCD") + @Excel(name = "所属水电基地流域") private String hbrvcd; /** 批复文号 */ @TableField("APPROVAL_FILE_NO") + @Excel(name = "批复文号") private String approvalFileNo; /** 批复文件标题 */ @TableField("APPROVAL_FILE_TITLE") + @Excel(name = "批复文件标题") private String approvalFileTitle; /** 文件名 */ @TableField("FILE_NAME") + @Excel(name = "文件名") private String fileName; /** 附件下载地址 */ @TableField("FLPATH") + @Excel(name = "附件下载地址") private String flpath; /** 生态流量 */ @TableField("ECOLOGICAL_FLOW") + @Excel(name = "生态流量") private String ecologicalFlow; /** 水环境保护措施 */ @TableField("WATER_ENV_PROTECTION") + @Excel(name = "水环境保护措施") private String waterEnvProtection; /** 低温水减缓措施 */ @TableField("COLD_WATER_MITIGATION") + @Excel(name = "低温水减缓措施") private String coldWaterMitigation; /** 栖息地保护 */ @TableField("HABITAT_PROTECTION") + @Excel(name = "栖息地保护") private String habitatProtection; /** 过鱼措施 */ @TableField("FISH_PASSAGE_MEASURES") + @Excel(name = "过鱼措施") private String fishPassageMeasures; /** 鱼类增殖放流 */ @TableField("FISH_STOCKING") + @Excel(name = "鱼类增殖放流") private String fishStocking; /** 陆生生态保护/水土保持措施 */ @TableField("TERRESTRIAL_ECO_SOIL_CONS") + @Excel(name = "陆生生态保护/水土保持措施") private String terrestrialEcoSoilCons; /** 珍稀植物保护措施 */ @TableField("RARE_PLANT_PROTECTION") + @Excel(name = "珍稀植物保护措施") private String rarePlantProtection; /** 动物救助 */ @TableField("ANIMAL_RESCUE") + @Excel(name = "动物救助") private String animalRescue; /** 移民安置 */ @TableField("RESETTLEMENT_MEASURES") + @Excel(name = "移民安置") private String resettlementMeasures; /** 施工期防治措施或其他环境保护措施 */ @TableField("CONSTRUCTION_POLLUTION_CTRL") + @Excel(name = "施工期防治措施或其他环境保护措施") private String constructionPollutionCtrl; /** 地下水及地质环境保护措施 */ @TableField("GROUNDWATER_GEO_PROTECT") + @Excel(name = "地下水及地质环境保护措施") private String groundwaterGeoProtect; /** 风景名胜区保护措施 */ @TableField("SCENIC_AREA_PROTECTION") + @Excel(name = "风景名胜区保护措施") private String scenicAreaProtection; /** 环境监测要求 */ @TableField("ENV_MONITORING_REQUIRE") + @Excel(name = "环境监测要求") private String envMonitoringRequire; /** 附件ID */ @TableField("FLID") + @Excel(name = "附件ID") private String flid; // ---------- 审计字段 ---------- diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java index 3933e989..e656fbbb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAiboxBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -27,21 +28,25 @@ public class SdAiboxBH implements Serializable { */ @TableId(type = IdType.INPUT) @FieldChinese("测站编码") + @Excel(name = "测站编码") private String stcd; /** * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) + @Excel(name = "测站类型名称") private String sttpName; /** @@ -49,36 +54,42 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -86,6 +97,7 @@ public class SdAiboxBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -93,33 +105,40 @@ public class SdAiboxBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态代码名称") private String bldsttCodeName; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -127,138 +146,163 @@ public class SdAiboxBH implements Serializable { * 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** * 站索引 */ @FieldChinese("站索引") + @Excel(name = "站索引") private String stindx; /** * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "测站名称") private String ennm; /** * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属基地名称") private String baseName; /** * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** * 供电方式 */ @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** * AI配置 */ @FieldChinese("AI配置") + @Excel(name = "AI配置") private String aipz; /** * 模型版本 */ @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** * IP地址 */ @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** * SIM卡信息 */ @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** * 联系人 */ @FieldChinese("联系人") + @Excel(name = "联系人") private String lxr; /** * 用途 */ @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** @@ -266,6 +310,7 @@ public class SdAiboxBH implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") private Date vlsrTm; /** @@ -312,4 +357,4 @@ public class SdAiboxBH implements Serializable { @FieldChinese("删除时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java index bc1b1dd7..babeac6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAimonitorBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -22,191 +23,235 @@ public class SdAimonitorBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度(单位:°)") + @Excel(name = "经度(单位:°)") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度(单位:°)") + @Excel(name = "纬度(单位:°)") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程(单位:m)") + @Excel(name = "高程(单位:m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @TableField("BLDSTT_CODE") @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("DTIN_TM") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @TableField("STINDX") @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @TableField("ORDER_INDEX") @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @TableField("BASE_ID") @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "流域名称") private String rvnm; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次(单位:min)") + @Excel(name = "数据监测频次(单位:min)") private Integer dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @TableField("VLSR_TM") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 服务对象 */ @TableField("FWDX") @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 供电方式 */ @TableField("GDFS") @FieldChinese("供电方式") + @Excel(name = "供电方式") private String gdfs; /** AI盒子配置 */ @TableField("AIPZ") @FieldChinese("AI盒子配置") + @Excel(name = "AI盒子配置") private String aipz; /** 模型版本 */ @TableField("MXBB") @FieldChinese("模型版本") + @Excel(name = "模型版本") private String mxbb; /** IP地址 */ @TableField("IPADDR") @FieldChinese("IP地址") + @Excel(name = "IP地址") private String ipaddr; /** SIM卡信息 */ @TableField("SIMINFO") @FieldChinese("SIM卡信息") + @Excel(name = "SIM卡信息") private String siminfo; /** 用途 */ @TableField("PURPOSE") @FieldChinese("用途") + @Excel(name = "用途") private String purpose; /** 观察方式 */ @TableField("OBSERVE") @FieldChinese("观察方式") + @Excel(name = "观察方式") private String observe; /** 地形裁剪范围 */ @TableField("BOX") @FieldChinese("地形裁剪范围") + @Excel(name = "地形裁剪范围") private String box; // ---------- 审计字段 ---------- @@ -248,4 +293,4 @@ public class SdAimonitorBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java new file mode 100644 index 00000000..6d8118c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdAnimalDictoryB.java @@ -0,0 +1,261 @@ +package com.yfd.platform.qgc_base.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yfd.platform.annotation.Excel; +import com.yfd.platform.annotation.FieldChinese; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * + * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("SD_ANIMALDICTORY_B") +public class SdAnimalDictoryB implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 主键 */ + @TableId(type = IdType.INPUT) + @FieldChinese("主键") + @Excel(name = "主键") + private String id; + + /** 编码 */ + @FieldChinese("编码") + @Excel(name = "编码") + private String code; + + /** 名称 */ + @FieldChinese("名称") + @Excel(name = "名称") + private String name; + + /** 英文名称 */ + @FieldChinese("英文名称") + @Excel(name = "英文名称") + private String nameEn; + + /** 俗名 */ + @FieldChinese("俗名") + @Excel(name = "俗名") + private String alias; + + /** 动物类群:1=哺乳动物 2=鸟类 3=两栖动物 4=爬行动物 5=节肢动物 6=其他 */ + @FieldChinese("动物类群") + @Excel(name = "动物类群") + private Integer category; + + @TableField(exist = false) + @Excel(name = "动物类群名称") + private String categoryName; + + /** 分类(生境类型):1=陆生 2=水生 3=两栖 */ + @FieldChinese("生境类型") + @Excel(name = "生境类型") + private Integer type; + + @TableField(exist = false) + @Excel(name = "生境类型名称") + private String typeName; + + /** 是否珍稀动物:0=否 1=是 */ + @FieldChinese("是否珍稀动物") + @Excel(name = "是否珍稀动物") + private Integer rare; + + @TableField(exist = false) + @Excel(name = "是否珍稀动物名称") + private String rareName; + + /** 物种来源:1=本土物种 2=外来物种 */ + @FieldChinese("物种来源") + @Excel(name = "物种来源") + private Integer specOrigin; + + @TableField(exist = false) + @Excel(name = "物种来源名称") + private String specOriginName; + + /** 保护级别 */ + @FieldChinese("保护级别") + @Excel(name = "保护级别") + private Integer ptype; + + @TableField(exist = false) + @Excel(name = "保护级别名称") + private String ptypeName; + + /** 保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危 */ + @FieldChinese("保护等级") + @Excel(name = "保护等级") + private Integer situation; + + @TableField(exist = false) + @Excel(name = "保护等级名称") + private String situationName; + + /** 主要生活环境 */ + @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") + private Integer habitat; + + @TableField(exist = false) + @Excel(name = "主要生活环境名称") + private String habitatName; + + /** 门 */ + @FieldChinese("门") + @Excel(name = "门") + private String filum; + + /** 纲 */ + @FieldChinese("纲") + @Excel(name = "纲") + private String classis; + + /** 目 */ + @FieldChinese("目") + @Excel(name = "目") + private String orders; + + /** 科 */ + @FieldChinese("科") + @Excel(name = "科") + private String family; + + /** 属 */ + @FieldChinese("属") + @Excel(name = "属") + private String genus; + + /** 种 */ + @FieldChinese("种") + @Excel(name = "种") + private String species; + + /** 体型大小 */ + @FieldChinese("体型大小") + @Excel(name = "体型大小") + private String fsz; + + /** 食性:1=肉食 2=草食 3=杂食 */ + @FieldChinese("食性") + @Excel(name = "食性") + private String feedingHabit; + + @TableField(exist = false) + @Excel(name = "食性名称") + private String feedingHabitName; + + /** 活动时律:1=昼行 2=夜行 3=晨昏 */ + @FieldChinese("活动时律") + @Excel(name = "活动时律") + private String activityTime; + + @TableField(exist = false) + @Excel(name = "活动时律名称") + private String activityTimeName; + + /** 分布区域 */ + @FieldChinese("分布区域") + @Excel(name = "分布区域") + private String distribution; + + /** 形态特征/识别特征 */ + @FieldChinese("形态特征") + @Excel(name = "形态特征") + private String symbol; + + /** 栖息习性 */ + @FieldChinese("栖息习性") + @Excel(name = "栖息习性") + private String habitation; + + /** LOGO */ + @FieldChinese("LOGO") + @Excel(name = "LOGO") + private String logo; + + /** 介绍 */ + @FieldChinese("介绍") + @Excel(name = "介绍") + private String introduce; + + /** 介绍弹窗图片 */ + @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") + private String inffile; + + /** 附件 */ + @FieldChinese("附件") + @Excel(name = "附件") + private String fid; + + /** 描述 */ + @FieldChinese("描述") + @Excel(name = "描述") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @FieldChinese("是否启用") + @Excel(name = "是否启用") + private Integer enable; + + /** 系统内置项:0=否 1=是 */ + @FieldChinese("系统内置项") + @Excel(name = "系统内置项") + private Integer internal; + + /** 排序 */ + @FieldChinese("排序") + @Excel(name = "排序") + private Integer orderIndex; + + /** 创建人 */ + @FieldChinese("创建人") + private String recordUser; + + /** 创建时间 */ + @FieldChinese("创建时间") + private Date recordTime; + + /** 更新人 */ + @FieldChinese("更新人") + private String modifyUser; + + /** 更新时间 */ + @FieldChinese("更新时间") + private Date modifyTime; + + /** 是否已删除 */ + @FieldChinese("是否已删除") + private Integer isDeleted; + + /** 删除人 */ + @FieldChinese("删除人") + private String deleteUser; + + /** 删除时间 */ + @FieldChinese("删除时间") + private Date deleteTime; + + /** 数据来源 */ + @FieldChinese("数据来源") + @Excel(name = "数据来源") + private String vlsr; + + /** 数据来源时间 */ + @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") + private Date vlsrTm; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index b7b0fcc9..6e00aad7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,6 +27,7 @@ public class SdArtsgBH implements Serializable { * 测站编码 */ @FieldChinese("测站编码") + @Excel(name = "测站编码") @TableId(type = IdType.INPUT) private String stcd; @@ -33,12 +35,14 @@ public class SdArtsgBH implements Serializable { * 测站名称 */ @FieldChinese("测站名称") + @Excel(name = "测站名称") private String stnm; /** * 测站类型 */ @FieldChinese("测站类型") + @Excel(name = "测站类型") private String sttp; @TableField(exist = false) @@ -48,6 +52,7 @@ public class SdArtsgBH implements Serializable { * 数据时间 */ @FieldChinese("数据时间") + @Excel(name = "数据时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; @@ -55,36 +60,42 @@ public class SdArtsgBH implements Serializable { * 位置经度 */ @FieldChinese("位置经度") + @Excel(name = "位置经度") private BigDecimal lgtd; /** * 位置纬度 */ @FieldChinese("位置纬度") + @Excel(name = "位置纬度") private BigDecimal lttd; /** * 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** * 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** * 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** * 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -94,6 +105,7 @@ public class SdArtsgBH implements Serializable { * 数据接入时间 */ @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; @@ -101,12 +113,14 @@ public class SdArtsgBH implements Serializable { * 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** * 关联测站编码 */ @FieldChinese("关联测站编码") + @Excel(name = "关联测站编码") private String rstcd; @TableField(exist = false) @@ -116,6 +130,7 @@ public class SdArtsgBH implements Serializable { * 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -125,12 +140,14 @@ public class SdArtsgBH implements Serializable { * 所属基地流域编码 */ @FieldChinese("所属基地流域编码") + @Excel(name = "所属基地流域编码") private String hbrvcd; /** * 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @@ -141,12 +158,14 @@ public class SdArtsgBH implements Serializable { * 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** * 规划设计日期 */ @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; @@ -154,6 +173,7 @@ public class SdArtsgBH implements Serializable { * 计划开工日期 */ @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; @@ -161,6 +181,7 @@ public class SdArtsgBH implements Serializable { * 计划完工日期 */ @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; @@ -168,6 +189,7 @@ public class SdArtsgBH implements Serializable { * 开工日期 */ @FieldChinese("开工日期") + @Excel(name = "开工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; @@ -175,6 +197,7 @@ public class SdArtsgBH implements Serializable { * 建成日期 */ @FieldChinese("建成日期") + @Excel(name = "建成日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jcdt; @@ -182,6 +205,7 @@ public class SdArtsgBH implements Serializable { * 退役/拆除日期 */ @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; @@ -189,6 +213,7 @@ public class SdArtsgBH implements Serializable { * 建设状态代码 */ @FieldChinese("建设状态代码") + @Excel(name = "建设状态代码") private Integer bldsttCode; @TableField(exist = false) @@ -198,84 +223,98 @@ public class SdArtsgBH implements Serializable { * 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** * LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** * 介绍文件 */ @FieldChinese("介绍文件") + @Excel(name = "介绍文件") private String inffile; /** * 投资 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** * 投资金额 */ @FieldChinese("投资金额") + @Excel(name = "投资金额") private Integer invinmn; /** * 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String prtcts; /** * 数量 */ @FieldChinese("数量") + @Excel(name = "数量") private Integer cnt; /** * 面积 */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal ar; /** * 类型 */ @FieldChinese("类型") + @Excel(name = "类型") private String tp; /** * 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String attm; /** * 数据频率 */ @FieldChinese("数据频率") + @Excel(name = "数据频率") private String dtfrqcy; /** * 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** * 植被覆盖类型 */ @FieldChinese("植被覆盖类型") + @Excel(name = "植被覆盖类型") private String vlsr; /** * 植被覆盖调查时间 */ @FieldChinese("植被覆盖调查时间") + @Excel(name = "植被覆盖调查时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java index 1b097d7c..d37281aa 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdDwBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdDwBH implements Serializable { /** 低温水减缓设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("低温水减缓设施编码") + @Excel(name = "低温水减缓设施编码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 低温水减缓设施名称 */ @FieldChinese("低温水减缓设施名称") + @Excel(name = "低温水减缓设施名称") private String stnm; /** 低温水减缓设施类型 */ @FieldChinese("低温水减缓设施类型") + @Excel(name = "低温水减缓设施类型") private String sttp; @TableField(exist = false) @@ -45,22 +50,27 @@ public class SdDwBH implements Serializable { /** 经度(°) */ @FieldChinese("经度(°)") + @Excel(name = "经度(°)") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度(°)") + @Excel(name = "纬度(°)") private BigDecimal lttd; /** 高程(m) */ @FieldChinese("高程(m)") + @Excel(name = "高程(m)") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) @@ -68,6 +78,7 @@ public class SdDwBH implements Serializable { /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -76,14 +87,17 @@ public class SdDwBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) @@ -91,10 +105,12 @@ public class SdDwBH implements Serializable { /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -103,35 +119,42 @@ public class SdDwBH implements Serializable { /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -139,22 +162,27 @@ public class SdDwBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 总投资(亿元) */ @FieldChinese("总投资(亿元)") + @Excel(name = "总投资(亿元)") private BigDecimal inv; /** 投资是否计入主体工程:0=否 1=是 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; @TableField(exist = false) @@ -162,6 +190,7 @@ public class SdDwBH implements Serializable { /** 是否有调度规程分析:0=无调度规程 1=有调度规程 */ @FieldChinese("是否有调度规程分析") + @Excel(name = "是否有调度规程分析") private Integer dispatch; @TableField(exist = false) @@ -169,111 +198,138 @@ public class SdDwBH implements Serializable { /** 调度规程文字描述 */ @FieldChinese("调度规程文字描述") + @Excel(name = "调度规程文字描述") private String dispatchDes; /** 调度规程文件 */ @FieldChinese("调度规程文件") + @Excel(name = "调度规程文件") private String dispatchFile; /** 多层式进水口-每层取水口高程(用"/"隔断) */ @FieldChinese("多层式进水口-每层取水口高程") + @Excel(name = "多层式进水口-每层取水口高程") private String dcshg; /** 多层式进水口-取水口个数 */ @FieldChinese("多层式进水口-取水口个数") + @Excel(name = "多层式进水口-取水口个数") private BigDecimal dcsqskgs; /** 叠梁门/翻板门式进水口的门叶数量 */ @FieldChinese("叠梁门/翻板门式进水口的门叶数量") + @Excel(name = "叠梁门/翻板门式进水口的门叶数量") private Integer dlmcnt; /** 叠梁门/翻板门式进水口的单节门叶高度 */ @FieldChinese("叠梁门/翻板门式进水口的单节门叶高度") + @Excel(name = "叠梁门/翻板门式进水口的单节门叶高度") private BigDecimal dlmhg; /** 叠梁门/翻板门顶部高程 */ @FieldChinese("叠梁门/翻板门顶部高程") + @Excel(name = "叠梁门/翻板门顶部高程") private BigDecimal dlmdbgc; /** 叠梁门/翻板门式进水口的最大淹没水深 */ @FieldChinese("叠梁门/翻板门式进水口的最大淹没水深") + @Excel(name = "叠梁门/翻板门式进水口的最大淹没水深") private BigDecimal dlmmxwdp; /** 套筒式进水口的套筒数量 */ @FieldChinese("套筒式进水口的套筒数量") + @Excel(name = "套筒式进水口的套筒数量") private Integer ttscnt; /** 套筒式进水口的单个套筒高度 */ @FieldChinese("套筒式进水口的单个套筒高度") + @Excel(name = "套筒式进水口的单个套筒高度") private BigDecimal ttshg; /** 套筒式进水口的最大淹没水深 */ @FieldChinese("套筒式进水口的最大淹没水深") + @Excel(name = "套筒式进水口的最大淹没水深") private BigDecimal ttszdss; /** 前置挡墙/隔水幕墙的结构形式 */ @FieldChinese("前置挡墙/隔水幕墙的结构形式") + @Excel(name = "前置挡墙/隔水幕墙的结构形式") private String qzdqjg; /** 前置挡墙的挡墙顶高程 */ @FieldChinese("前置挡墙的挡墙顶高程") + @Excel(name = "前置挡墙的挡墙顶高程") private BigDecimal qzdqhg; /** 隔水幕墙的长度 */ @FieldChinese("隔水幕墙的长度") + @Excel(name = "隔水幕墙的长度") private BigDecimal gsmqcd; /** 隔水幕墙的宽度 */ @FieldChinese("隔水幕墙的宽度") + @Excel(name = "隔水幕墙的宽度") private BigDecimal gsmqkd; /** 隔水幕墙材料 */ @FieldChinese("隔水幕墙材料") + @Excel(name = "隔水幕墙材料") private BigDecimal gsmqcl; /** 其他设施具体型式 */ @FieldChinese("其他设施具体型式") + @Excel(name = "其他设施具体型式") private String qtssjbtx; /** 天然河流平均水温 */ @FieldChinese("天然河流平均水温") + @Excel(name = "天然河流平均水温") private BigDecimal nravwt; /** 天然河流最高温月份多年平均水温 */ @FieldChinese("天然河流最高温月份多年平均水温") + @Excel(name = "天然河流最高温月份多年平均水温") private BigDecimal nrmxavwt; /** 天然河流最低温月份多年平均水温 */ @FieldChinese("天然河流最低温月份多年平均水温") + @Excel(name = "天然河流最低温月份多年平均水温") private BigDecimal nrmnavwt; /** 建成后坝下平均水温 */ @FieldChinese("建成后坝下平均水温") + @Excel(name = "建成后坝下平均水温") private BigDecimal dnavwt; /** 建成后坝下最高温月份多年平均水温 */ @FieldChinese("建成后坝下最高温月份多年平均水温") + @Excel(name = "建成后坝下最高温月份多年平均水温") private BigDecimal dnmxavwt; /** 建成后坝下最低温月份多年平均水温 */ @FieldChinese("建成后坝下最低温月份多年平均水温") + @Excel(name = "建成后坝下最低温月份多年平均水温") private BigDecimal dnmnavwt; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java index d6086073..d75d1c6a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEqBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,19 +26,23 @@ public class SdEqBH implements Serializable { /** 生态流量泄放设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("生态流量泄放设施编码") + @Excel(name = "生态流量泄放设施编码") private String stcd; /** 生态流量泄放设施名称 */ @FieldChinese("生态流量泄放设施名称") + @Excel(name = "生态流量泄放设施名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 生态流量泄放设施类型 */ @FieldChinese("生态流量泄放设施类型") + @Excel(name = "生态流量泄放设施类型") private String sttp; @TableField(exist = false) @@ -45,30 +50,37 @@ public class SdEqBH implements Serializable { /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdEqBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdEqBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,40 +115,48 @@ public class SdEqBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -140,95 +164,118 @@ public class SdEqBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 生态放流孔(闸、洞、管)-结构形式 */ @FieldChinese("生态放流孔(闸、洞、管)-结构形式") + @Excel(name = "生态放流孔(闸、洞、管)-结构形式") private String flkjg; /** 生态放流孔(闸、洞、管)-孔口尺寸(单位:m) */ @FieldChinese("生态放流孔(闸、洞、管)-孔口尺寸") + @Excel(name = "生态放流孔(闸、洞、管)-孔口尺寸") private String flksz; /** 生态放流孔(闸、洞、管)-死水位时保证流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-死水位时保证流量") + @Excel(name = "生态放流孔(闸、洞、管)-死水位时保证流量") private String ddzgq; /** 生态放流孔(闸、洞、管)-最大泄放流量(单位:m³/s) */ @FieldChinese("生态放流孔(闸、洞、管)-最大泄放流量") + @Excel(name = "生态放流孔(闸、洞、管)-最大泄放流量") private String flkq; /** 生态放流孔(闸、洞、管)或生态机组-进水口地板高程(单位:m) */ @FieldChinese("进水口底板高程") + @Excel(name = "进水口底板高程") private BigDecimal jskdbgc; /** 生态放流孔(闸、洞、管)或生态机组-出水口地板高程(单位:m) */ @FieldChinese("出水口底板高程") + @Excel(name = "出水口底板高程") private BigDecimal cskdbgc; /** 基荷发电工况(单位:MW) */ @FieldChinese("基荷发电工况") + @Excel(name = "基荷发电工况") private String jhfdgk; /** 基荷发电或生态机组-发电流量(单位:m³/s) */ @FieldChinese("发电流量") + @Excel(name = "发电流量") private BigDecimal fdll; /** 生态机组装机容量 */ @FieldChinese("生态机组装机容量") + @Excel(name = "生态机组装机容量") private BigDecimal stjzzjrl; /** 生态机组额定流量 */ @FieldChinese("生态机组额定流量") + @Excel(name = "生态机组额定流量") private BigDecimal stjzysq; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 考核方式 */ @FieldChinese("考核方式") + @Excel(name = "考核方式") private String assessMethod; /** 是否建设期的考核要求 */ @FieldChinese("是否建设期的考核要求") + @Excel(name = "是否建设期的考核要求") private Integer isJsq; /** 是否有下泄生态流量要求 */ @FieldChinese("是否有下泄生态流量要求") + @Excel(name = "是否有下泄生态流量要求") private String isFlow; /** 最小保证下泄生态流量值(单位:m³/s) */ @FieldChinese("最小保证下泄生态流量值") + @Excel(name = "最小保证下泄生态流量值") private BigDecimal minFlow; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java index e96193f4..3f307bfe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFbrdBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,14 +26,17 @@ public class SdFbrdBH implements Serializable { /** 鱼类增殖站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("鱼类增殖站编码") + @Excel(name = "鱼类增殖站编码") private String stcd; /** 鱼类增殖站名称 */ @FieldChinese("鱼类增殖站名称") + @Excel(name = "鱼类增殖站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) @@ -41,34 +45,42 @@ public class SdFbrdBH implements Serializable { /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -77,14 +89,17 @@ public class SdFbrdBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) @@ -92,6 +107,7 @@ public class SdFbrdBH implements Serializable { /** 所属基地编码 */ @FieldChinese("所属基地编码") + @Excel(name = "所属基地编码") private String baseId; @TableField(exist = false) @@ -99,44 +115,53 @@ public class SdFbrdBH implements Serializable { /** 所属基地河段编码 */ @FieldChinese("所属基地河段编码") + @Excel(name = "所属基地河段编码") private String hbrvcd; /** 服务电站对象列表 */ @FieldChinese("服务电站对象列表") + @Excel(name = "服务电站对象列表") private String rengcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) @@ -144,83 +169,103 @@ public class SdFbrdBH implements Serializable { /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 总占地面积(单位:km²) */ @FieldChinese("总占地面积") + @Excel(name = "总占地面积") private BigDecimal zzflar; /** 生产工艺 */ @FieldChinese("生产工艺") + @Excel(name = "生产工艺") private String zzflgy; /** 养殖模式 */ @FieldChinese("养殖模式") + @Excel(name = "养殖模式") private String zzflyzms; /** 标记方式 */ @FieldChinese("标记方式") + @Excel(name = "标记方式") private String zzflbjfs; /** 放流对象 */ @FieldChinese("放流对象") + @Excel(name = "放流对象") private String zzfldx; /** 放流规模(单位:尾/年) */ @FieldChinese("放流规模") + @Excel(name = "放流规模") private Integer zzflcnt; /** 放流地点 */ @FieldChinese("放流地点") + @Excel(name = "放流地点") private String zzflfllc; /** 放流时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("放流时间") + @Excel(name = "放流时间") private Date zzfltm; /** 承担放流任务 */ @FieldChinese("承担放流任务") + @Excel(name = "承担放流任务") private String zzflrw; /** 设计单位 */ @FieldChinese("设计单位") + @Excel(name = "设计单位") private String dsun; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java index 761db789..efb1e44a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFhbtBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,177 +26,221 @@ public class SdFhbtBH implements Serializable { /** 栖息地编码 */ @TableId(type = IdType.INPUT) @FieldChinese("栖息地编码") + @Excel(name = "栖息地编码") private String stcd; /** 栖息地名称 */ @FieldChinese("栖息地名称") + @Excel(name = "栖息地名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 图层编码 */ @FieldChinese("图层编码") + @Excel(name = "图层编码") private String layerCode; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 河段描述 */ @FieldChinese("河段描述") + @Excel(name = "河段描述") private String reachdes; /** 栖息地范围经纬度列表 */ @FieldChinese("栖息地范围经纬度列表") + @Excel(name = "栖息地范围经纬度列表") private String lglttd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 保护对象 */ @FieldChinese("保护对象") + @Excel(name = "保护对象") private String bhdx; /** 保护范围 */ @FieldChinese("保护范围") + @Excel(name = "保护范围") private String bhfw; /** 保护长度(单位:km) */ @FieldChinese("保护长度") + @Excel(name = "保护长度") private String bhcd; /** 保护面积(单位:km²) */ @FieldChinese("保护面积") + @Excel(name = "保护面积") private BigDecimal bhmj; /** 保护河流 */ @FieldChinese("保护河流") + @Excel(name = "保护河流") private String bhhl; /** 保护河段 */ @FieldChinese("保护河段") + @Excel(name = "保护河段") private String bhhd; /** 保护措施 */ @FieldChinese("保护措施") + @Excel(name = "保护措施") private String bhcs; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 实施时间 */ @FieldChinese("实施时间") + @Excel(name = "实施时间") private String attm; /** 保护外围长度(单位:km) */ @FieldChinese("保护外围长度") + @Excel(name = "保护外围长度") private String bhwwcd; /** 保护核心长度(单位:km) */ @FieldChinese("保护核心长度") + @Excel(name = "保护核心长度") private String bhhxcd; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -228,4 +273,4 @@ public class SdFhbtBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 2f62b2cc..17939fed 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; import lombok.EqualsAndHashCode; @@ -23,186 +24,234 @@ public class SdFishDictoryB implements Serializable { /** 主键 */ @TableId(type = IdType.INPUT) @FieldChinese("主键") + @Excel(name = "主键") private String id; /** 编码 */ @FieldChinese("编码") + @Excel(name = "编码") private String code; /** 名称 */ @FieldChinese("名称") + @Excel(name = "名称") private String name; /** 英文名称 */ @FieldChinese("英文名称") + @Excel(name = "英文名称") private String nameEn; /** 俗名 */ @FieldChinese("俗名") + @Excel(name = "俗名") private String alias; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍 */ @FieldChinese("介绍") + @Excel(name = "介绍") private String introduce; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 目 */ @FieldChinese("目") + @Excel(name = "目") private String orders; /** 科 */ @FieldChinese("科") + @Excel(name = "科") private String family; /** 属 */ @FieldChinese("属") + @Excel(name = "属") private String genus; /** 种 */ @FieldChinese("种") + @Excel(name = "种") private String species; /** 分类:1=淡水 2=海水 */ @FieldChinese("分类") + @Excel(name = "分类") private Integer type; @TableField(exist = false) + @Excel(name = "分类名称") private String typeName; /** 成鱼大小:单位:cm */ @FieldChinese("成鱼大小") + @Excel(name = "成鱼大小") private String fsz; /** 是否珍稀鱼类:0=否 1=是 */ @FieldChinese("是否珍稀鱼类") + @Excel(name = "是否珍稀鱼类") private Integer rare; @TableField(exist = false) + @Excel(name = "是否珍稀鱼类名称") private String rareName; /** 物种来源:1=本土物种 2=外来物种 */ @FieldChinese("物种来源") + @Excel(name = "物种来源") private Integer specOrigin; @TableField(exist = false) + @Excel(name = "物种来源名称") private String specOriginName; /** 保护类型 */ @FieldChinese("保护类型") + @Excel(name = "保护类型") private Integer ptype; @TableField(exist = false) + @Excel(name = "保护类型名称") private String ptypeName; /** 所属流域 */ @FieldChinese("所属流域") + @Excel(name = "所属流域") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvcdName; /** 洄游习性 */ @FieldChinese("洄游习性") + @Excel(name = "洄游习性") private String habitMigrat; /** 摄食习性 */ @FieldChinese("摄食习性") + @Excel(name = "摄食习性") private String feedingHabit; /** 产卵特性 */ @FieldChinese("产卵特性") + @Excel(name = "产卵特性") private String spawnCharact; /** 主要食物 */ @FieldChinese("主要食物") + @Excel(name = "主要食物") private String food; /** 觅食时段 */ @FieldChinese("觅食时段") + @Excel(name = "觅食时段") private String timeFeed; /** 产地及产期 */ @FieldChinese("产地及产期") + @Excel(name = "产地及产期") private String orignDate; /** 适宜温度:单位:℃ */ @FieldChinese("适宜温度") + @Excel(name = "适宜温度") private String pretemp; /** 适宜流速:单位:m/s */ @FieldChinese("适宜流速") + @Excel(name = "适宜流速") private String flowRate; /** 适宜水深:单位(m) */ @FieldChinese("适宜水深") + @Excel(name = "适宜水深") private String depth; /** 适宜底质 */ @FieldChinese("适宜底质") + @Excel(name = "适宜底质") private String botmMater; /** 水质要求 */ @FieldChinese("水质要求") + @Excel(name = "水质要求") private String wqtq; /** 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境 */ @FieldChinese("主要生活环境") + @Excel(name = "主要生活环境") private Integer habitat; @TableField(exist = false) + @Excel(name = "主要生活环境名称") private String habitatName; /** 种群现状 1=优势种 2=常见种 3=少见种 4=记录种 */ @FieldChinese("种群现状") + @Excel(name = "种群现状") private Integer situation; @TableField(exist = false) + @Excel(name = "种群现状名称") private String situationName; /** 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况 */ @FieldChinese("资源类型") + @Excel(name = "资源类型") private Integer resourceType; @TableField(exist = false) + @Excel(name = "资源类型名称") private String resourceTypeName; /** 形态描述 */ @FieldChinese("形态描述") + @Excel(name = "形态描述") private String shapedesc; /** 保护级别 */ @FieldChinese("保护级别") + @Excel(name = "保护级别") private String protectlvl; /** 栖息习性 */ @FieldChinese("栖息习性") + @Excel(name = "栖息习性") private String habitation; /** 附件 */ @FieldChinese("附件") + @Excel(name = "附件") private String fid; /** 描述 */ @FieldChinese("描述") + @Excel(name = "描述") private String description; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer enable; /** 系统内置项:0=否 1=是 */ @FieldChinese("系统内置项") + @Excel(name = "系统内置项") private Integer internal; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 创建人 */ @@ -235,13 +284,16 @@ public class SdFishDictoryB implements Serializable { /** 产卵月份:多个月份以逗号分隔 */ @FieldChinese("产卵月份") + @Excel(name = "产卵月份") private String spawnMonth; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java index 0acf1183..8f0edb3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -26,335 +27,418 @@ public class SdFpssBH implements Serializable { /** 过鱼设施编码 */ @TableId(type = IdType.INPUT) @FieldChinese("过鱼设施编码") + @Excel(name = "过鱼设施编码") private String stcd; /** 过鱼设施名称 */ @FieldChinese("过鱼设施名称") + @Excel(name = "过鱼设施名称") private String stnm; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 过鱼设施类型 */ @FieldChinese("过鱼设施类型") + @Excel(name = "过鱼设施类型") private String sttp; @TableField(exist = false) + @Excel(name = "过鱼设施类型名称") private String sttpName; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度,单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度,单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程,单位:m */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资,单位:亿元 */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 鱼道型式 */ @FieldChinese("鱼道型式") + @Excel(name = "鱼道型式") private String ydxs; /** 鱼道总长度,单位:m */ @FieldChinese("鱼道总长度") + @Excel(name = "鱼道总长度") private BigDecimal ydzcd; /** 鱼道进口运行设计水位,单位:m */ @FieldChinese("鱼道进口运行设计水位") + @Excel(name = "鱼道进口运行设计水位") private BigDecimal ydjkz; /** 鱼道进口数量,单位:个 */ @FieldChinese("鱼道进口数量") + @Excel(name = "鱼道进口数量") private Integer ydjkcnt; /** 鱼道或仿自然通道-进口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-进口高程") + @Excel(name = "鱼道或仿自然通道-进口高程") private BigDecimal jkhg; /** 鱼道进口诱鱼型式 */ @FieldChinese("鱼道进口诱鱼型式") + @Excel(name = "鱼道进口诱鱼型式") private String ydyyxs; /** 鱼道出口运行设计水位,单位:m */ @FieldChinese("鱼道出口运行设计水位") + @Excel(name = "鱼道出口运行设计水位") private BigDecimal ydckz; /** 鱼道出口数量,单位:个 */ @FieldChinese("鱼道出口数量") + @Excel(name = "鱼道出口数量") private Integer ydckcnt; /** 鱼道或仿自然通道-出口高程,单位:m */ @FieldChinese("鱼道或仿自然通道-出口高程") + @Excel(name = "鱼道或仿自然通道-出口高程") private BigDecimal ckhg; /** 鱼道池室设计流速,单位:m/s */ @FieldChinese("鱼道池室设计流速") + @Excel(name = "鱼道池室设计流速") private BigDecimal ydcsv; /** 鱼道每级池室长,单位:m */ @FieldChinese("鱼道每级池室长") + @Excel(name = "鱼道每级池室长") private Integer ydcscd; /** 鱼道每级池室宽,单位:m */ @FieldChinese("鱼道每级池室宽") + @Excel(name = "鱼道每级池室宽") private Integer ydcskd; /** 鱼道池室坡度 */ @FieldChinese("鱼道池室坡度") + @Excel(name = "鱼道池室坡度") private String ydcspd; /** 鱼道池室数量,单位:个 */ @FieldChinese("鱼道池室数量") + @Excel(name = "鱼道池室数量") private Integer ydcscnt; /** 鱼道休息池个数 */ @FieldChinese("鱼道休息池个数") + @Excel(name = "鱼道休息池个数") private Integer ydxxccnt; /** 鱼道或仿自然通道-流速,单位:m/s */ @FieldChinese("鱼道或仿自然通道-流速") + @Excel(name = "鱼道或仿自然通道-流速") private String flow; /** 仿自然通道断面形状 */ @FieldChinese("仿自然通道断面形状") + @Excel(name = "仿自然通道断面形状") private String fzrdmxz; /** 仿自然通道长度*宽度 */ @FieldChinese("仿自然通道长度*宽度") + @Excel(name = "仿自然通道长度*宽度") private String fzrtdsz; /** 仿自然通道运行水深,单位:m */ @FieldChinese("仿自然通道运行水深") + @Excel(name = "仿自然通道运行水深") private BigDecimal fzryxwdp; /** 仿自然通道坡降 */ @FieldChinese("仿自然通道坡降") + @Excel(name = "仿自然通道坡降") private BigDecimal fzrpj; /** 集运鱼系统或升鱼机-上游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-上游码头位置") + @Excel(name = "集运鱼系统或升鱼机-上游码头位置") private String symtlc; /** 集运鱼系统或升鱼机-上游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-上游码头型式") + @Excel(name = "集运鱼系统或升鱼机-上游码头型式") private String symtxs; /** 集运鱼系统或升鱼机-下游码头位置 */ @FieldChinese("集运鱼系统或升鱼机-下游码头位置") + @Excel(name = "集运鱼系统或升鱼机-下游码头位置") private String xymtlc; /** 集运鱼系统或升鱼机-下游码头型式 */ @FieldChinese("集运鱼系统或升鱼机-下游码头型式") + @Excel(name = "集运鱼系统或升鱼机-下游码头型式") private String xymtxs; /** 集运鱼系统或升鱼机-集诱鱼方式 */ @FieldChinese("集运鱼系统或升鱼机-集诱鱼方式") + @Excel(name = "集运鱼系统或升鱼机-集诱鱼方式") private String jyfs; /** 集运鱼系统或升鱼机-运鱼设施方式 */ @FieldChinese("集运鱼系统或升鱼机-运鱼设施方式") + @Excel(name = "集运鱼系统或升鱼机-运鱼设施方式") private String yyfs; /** 升鱼机集鱼槽数量,单位:个 */ @FieldChinese("升鱼机集鱼槽数量") + @Excel(name = "升鱼机集鱼槽数量") private Integer syjcnt; /** 升鱼机集鱼槽进口高程,单位:m */ @FieldChinese("升鱼机集鱼槽进口高程") + @Excel(name = "升鱼机集鱼槽进口高程") private BigDecimal syjhg; /** 升鱼机集鱼槽流量,单位:m3/s */ @FieldChinese("升鱼机集鱼槽流量") + @Excel(name = "升鱼机集鱼槽流量") private String syjq; /** 升鱼机断面尺寸(长*宽*高),单位:m */ @FieldChinese("升鱼机断面尺寸") + @Excel(name = "升鱼机断面尺寸") private String syjsz; /** 升鱼机集鱼槽水深,单位:m */ @FieldChinese("升鱼机集鱼槽水深") + @Excel(name = "升鱼机集鱼槽水深") private String syjwdp; /** 设计过鱼规模,单位:尾 */ @FieldChinese("设计过鱼规模") + @Excel(name = "设计过鱼规模") private String sjgycnt; /** 主要过鱼对象 */ @FieldChinese("主要过鱼对象") + @Excel(name = "主要过鱼对象") private String zygydx; /** 主要过鱼对象描述 */ @FieldChinese("主要过鱼对象描述") + @Excel(name = "主要过鱼对象描述") private String zygydxms; /** 兼顾过鱼对象 */ @FieldChinese("兼顾过鱼对象") + @Excel(name = "兼顾过鱼对象") private String jggydx; /** 兼顾过鱼对象描述 */ @FieldChinese("兼顾过鱼对象描述") + @Excel(name = "兼顾过鱼对象描述") private String jggydxms; /** 过鱼时间 */ @FieldChinese("过鱼时间") + @Excel(name = "过鱼时间") private String gytm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String stCode; /** 运行时间 */ @FieldChinese("运行时间") + @Excel(name = "运行时间") private String yxtm; /** 主要过鱼月份(多个月份用,隔开) */ @FieldChinese("主要过鱼月份") + @Excel(name = "主要过鱼月份") private String fpssmn; /** 数据监测频次,单位:min */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private Integer dtfrqcy; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 设施是否实现鱼类上行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类上行") + @Excel(name = "设施是否实现鱼类上行") private Integer isUp; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类上行名称") private String isUpName; /** 设施是否实现鱼类下行 0=否 1=是 */ @FieldChinese("设施是否实现鱼类下行") + @Excel(name = "设施是否实现鱼类下行") private Integer isDown; @TableField(exist = false) + @Excel(name = "设施是否实现鱼类下行名称") private String isDownName; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -387,4 +471,4 @@ public class SdFpssBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java index 3a204669..39b5e0f0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOpinfoBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import com.yfd.platform.annotation.UserIdField; import com.yfd.platform.annotation.UserNameField; @@ -19,272 +20,339 @@ public class SdOpinfoBH implements Serializable { /** 倾斜摄影站点编码 */ @TableId(type = IdType.INPUT) @FieldChinese("倾斜摄影站点编码") + @Excel(name = "倾斜摄影站点编码") private String stcd; /** 站点名称 */ @FieldChinese("站点名称") + @Excel(name = "站点名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度。单位:(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度。单位:(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程。单位:(°) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 位置 */ @FieldChinese("位置") + @Excel(name = "位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; @TableField(exist = false) + @Excel(name = "所属水电基地流域名称") private String hbrvcdName; /** 所属流域代码 */ @FieldChinese("所属流域代码") + @Excel(name = "所属流域代码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO */ @FieldChinese("LOGO") + @Excel(name = "LOGO") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 在线地址 */ @FieldChinese("在线地址") + @Excel(name = "在线地址") private String url; /** 自定义高程(前端) */ @FieldChinese("自定义高程") + @Excel(name = "自定义高程") private BigDecimal height; /** 边界数据 */ @FieldChinese("边界数据") + @Excel(name = "边界数据") private String boundary; /** 中心点经度 */ @FieldChinese("中心点经度") + @Excel(name = "中心点经度") private BigDecimal centerLgtd; /** 中心点纬度 */ @FieldChinese("中心点纬度") + @Excel(name = "中心点纬度") private BigDecimal centerLttd; /** 中心点高程 */ @FieldChinese("中心点高程") + @Excel(name = "中心点高程") private BigDecimal centerElev; /** 说明 */ @FieldChinese("说明") + @Excel(name = "说明") private String description; /** 中心点1经度 */ @FieldChinese("中心点1经度") + @Excel(name = "中心点1经度") private BigDecimal center1Lgtd; /** 中心点1纬度 */ @FieldChinese("中心点1纬度") + @Excel(name = "中心点1纬度") private BigDecimal center1Lttd; /** 中心点1高程 */ @FieldChinese("中心点1高程") + @Excel(name = "中心点1高程") private BigDecimal center1Elev; /** 裁剪平面 */ @FieldChinese("裁剪平面") + @Excel(name = "裁剪平面") private String clippingPlanes; /** 相机位置坐标系类型 */ @FieldChinese("相机位置坐标系类型") + @Excel(name = "相机位置坐标系类型") private String destinationType; /** 相机位置经度X */ @FieldChinese("相机位置经度X") + @Excel(name = "相机位置经度X") private BigDecimal destinationLgtd; /** 相机位置纬度Y */ @FieldChinese("相机位置纬度Y") + @Excel(name = "相机位置纬度Y") private BigDecimal destinationLttd; /** 相机位置高度Z */ @FieldChinese("相机位置高度Z") + @Excel(name = "相机位置高度Z") private BigDecimal destinationElev; /** 摄像头滚转角X */ @FieldChinese("摄像头滚转角X") + @Excel(name = "摄像头滚转角X") private BigDecimal orientationRoll; /** 摄像头偏航角Z(左右旋转) */ @FieldChinese("摄像头偏航角Z") + @Excel(name = "摄像头偏航角Z") private BigDecimal orientationHeading; /** 摄像头俯仰角Y(上下旋转) */ @FieldChinese("摄像头俯仰角Y") + @Excel(name = "摄像头俯仰角Y") private BigDecimal orientationPitch; /** 前端校正站点高程 */ @FieldChinese("前端校正站点高程") + @Excel(name = "前端校正站点高程") private BigDecimal reviseSiteElev; /** 前端校正站点高程系数 */ @FieldChinese("前端校正站点高程系数") + @Excel(name = "前端校正站点高程系数") private BigDecimal reviseSiteElevFactor; /** 相机位置经度X世界坐标系 */ @FieldChinese("相机位置经度X世界坐标系") + @Excel(name = "相机位置经度X世界坐标系") private BigDecimal destinationLgtdWcs; /** 相机位置纬度Y世界坐标系 */ @FieldChinese("相机位置纬度Y世界坐标系") + @Excel(name = "相机位置纬度Y世界坐标系") private BigDecimal destinationLttdWcs; /** 相机位置高度Z世界坐标系 */ @FieldChinese("相机位置高度Z世界坐标系") + @Excel(name = "相机位置高度Z世界坐标系") private BigDecimal destinationElevWcs; /** 相机位置经度X WGS-84坐标系 */ @FieldChinese("相机位置经度X WGS-84坐标系") + @Excel(name = "相机位置经度X WGS-84坐标系") private BigDecimal destinationLgtdWgs84; /** 相机位置纬度Y WGS-84坐标系 */ @FieldChinese("相机位置纬度Y WGS-84坐标系") + @Excel(name = "相机位置纬度Y WGS-84坐标系") private BigDecimal destinationLttdWgs84; /** 相机位置高度Z WGS-84坐标系 */ @FieldChinese("相机位置高度Z WGS-84坐标系") + @Excel(name = "相机位置高度Z WGS-84坐标系") private BigDecimal destinationElevWgs84; /** 倾斜摄影电站坐标json串 */ @FieldChinese("倾斜摄影电站坐标json串") + @Excel(name = "倾斜摄影电站坐标json串") private String location; /** 倾斜摄影模型精度 */ @FieldChinese("倾斜摄影模型精度") + @Excel(name = "倾斜摄影模型精度") private String accuracy; /** 别名 */ @FieldChinese("别名") + @Excel(name = "别名") private String stnmAlias; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建时间 */ @@ -338,4 +406,4 @@ public class SdOpinfoBH implements Serializable { @TableField(exist = false) @UserNameField private String recordUserName; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java index 686ef28e..1dde7d89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,167 +21,208 @@ public class SdOtteBH implements Serializable { /** 其他陆生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他陆生生态保护工程编码") + @Excel(name = "其他陆生生态保护工程编码") private String stcd; /** 其他陆生生态保护工程名称 */ @FieldChinese("其他陆生生态保护工程名称") + @Excel(name = "其他陆生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java index 8b4fbf03..54ba578d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,171 +21,213 @@ public class SdOtweBH implements Serializable { /** 其他水生生态保护工程编码 */ @TableId(type = IdType.INPUT) @FieldChinese("其他水生生态保护工程编码") + @Excel(name = "其他水生生态保护工程编码") private String stcd; /** 其他水生生态保护工程名称 */ @FieldChinese("其他水生生态保护工程名称") + @Excel(name = "其他水生生态保护工程名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 基本特性参数(文字描述) */ @FieldChinese("基本特性参数") + @Excel(name = "基本特性参数") private String jbtxcs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java index b39c1b4f..91a65a0e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,159 +21,199 @@ public class SdSonarBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 监控类型 */ @FieldChinese("监控类型") + @Excel(name = "监控类型") private String mntp; /** 监控类别 */ @FieldChinese("监控类别") + @Excel(name = "监控类别") private String sttp; @TableField(exist = false) + @Excel(name = "监控类别名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 监测方式 */ @FieldChinese("监测方式") + @Excel(name = "监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区编码 */ @FieldChinese("所属行政区编码") + @Excel(name = "所属行政区编码") private String addvcd; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 服务对象 */ @FieldChinese("服务对象") + @Excel(name = "服务对象") private String fwdx; /** 观察方式 */ @FieldChinese("观察方式") + @Excel(name = "观察方式") private String gcfs; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -208,5 +249,6 @@ public class SdSonarBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java index e24b2e80..32330368 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdTeBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,160 +21,199 @@ public class SdTeBH implements Serializable { /** 陆生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("陆生生态调查断面编码") + @Excel(name = "陆生生态调查断面编码") private String stcd; /** 陆生生态调查断面名称 */ @FieldChinese("陆生生态调查断面名称") + @Excel(name = "陆生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name = "投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java index 7ec6f02b..aa372fca 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -20,181 +21,225 @@ public class SdVaBH implements Serializable { /** 动物救助站编码 */ @TableId(type = IdType.INPUT) @FieldChinese("动物救助站编码") + @Excel(name = "动物救助站编码") private String stcd; /** 动物救助站名称 */ @FieldChinese("动物救助站名称") + @Excel(name = "动物救助站名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name = "所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; @TableField(exist = false) + @Excel(name = "是否启用名称") private String usflName; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name = "排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 服务电站编码列表 */ @FieldChinese("服务电站编码列表") + @Excel(name = "服务电站编码列表") private String rstcdmap; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name = "计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name = "计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name = "LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 面积(单位:km²) */ @FieldChinese("面积") + @Excel(name = "面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name = "地点") private String place; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name = "保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name = "保护原因") private String bhyy; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name = "保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name = "保护对象列表") private String bhdxlb; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -227,4 +272,4 @@ public class SdVaBH implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("删除时间") private Date deleteTime; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java index cd28644a..11827d12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,285 +24,356 @@ public class SdVdinfoB implements Serializable { /** 视频站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("视频站站码") + @Excel(name = "视频站站码") private String stcd; /** 视频站名称 */ @FieldChinese("视频站名称") + @Excel(name = "视频站名称") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 视频站监控类型 */ @FieldChinese("视频站监控类型") + @Excel(name = "视频站监控类型") private String mntp; /** 视频站子站类 */ @FieldChinese("视频站子站类") + @Excel(name = "视频站子站类") private String sttp; @TableField(exist = false) + @Excel(name = "视频站子站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔 */ @FieldChinese("高程/海拔") + @Excel(name = "高程/海拔") private BigDecimal elev; /** 地址 */ @FieldChinese("地址") + @Excel(name = "地址") private String stlc; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String description; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属测站编码 */ @FieldChinese("所属测站编码") + @Excel(name = "所属测站编码") private String cstcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政编码 */ @FieldChinese("所属行政编码") + @Excel(name = "所属行政编码") private String addvcd; @TableField(exist = false) + @Excel(name = "所属行政编码名称") private String addvcdName; /** 所属公司编码 */ @FieldChinese("所属公司编码") + @Excel(name = "所属公司编码") private String hycd; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name = "撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name = "数据接入来源") private String dtinSrc; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name = "数据接入开始时间") private Date dtinTm; /** 设备关键信息 */ @FieldChinese("设备关键信息") + @Excel(name = "设备关键信息") private String deviceInfo; /** 视频站接入方式 */ @FieldChinese("视频站接入方式") + @Excel(name = "视频站接入方式") private String accessWay; /** 视频站设备序列号 */ @FieldChinese("视频站设备序列号") + @Excel(name = "视频站设备序列号") private String deviceSerial; /** 视频站通道号 */ @FieldChinese("视频站通道号") + @Excel(name = "视频站通道号") private String channelNo; /** 视频站通道名 */ @FieldChinese("视频站通道名") + @Excel(name = "视频站通道名") private String channelName; /** 国标设备的通道编号 */ @FieldChinese("国标设备的通道编号") + @Excel(name = "国标设备的通道编号") private String gbchannel; /** 视频站流播放协议 */ @FieldChinese("视频站流播放协议") + @Excel(name = "视频站流播放协议") private String protocol; /** 视频站码流类型 */ @FieldChinese("视频站码流类型") + @Excel(name = "视频站码流类型") private String quality; /** 视频站传输协议 */ @FieldChinese("视频站传输协议") + @Excel(name = "视频站传输协议") private String transmode; /** 视频站是否支持远程控制 */ @FieldChinese("视频站是否支持远程控制") + @Excel(name = "视频站是否支持远程控制") private Integer isVdControl; /** 获取视频站支持远程控制范围 */ @FieldChinese("获取视频站支持远程控制范围") + @Excel(name = "获取视频站支持远程控制范围") private String controlMode; /** 视频站直播地址 */ @FieldChinese("视频站直播地址") + @Excel(name = "视频站直播地址") private String url; /** 视频站直播内网地址 */ @FieldChinese("视频站直播内网地址") + @Excel(name = "视频站直播内网地址") private String intranetUrl; /** 视频站用户名 */ @FieldChinese("视频站用户名") + @Excel(name = "视频站用户名") private String vduser; /** 视频站密码 */ @FieldChinese("视频站密码") + @Excel(name = "视频站密码") private String vdpwd; /** 视频站定时截取存储方式 */ @FieldChinese("视频站定时截取存储方式") + @Excel(name = "视频站定时截取存储方式") private String storageWay; /** 视频站定时截取频率cron表达式 */ @FieldChinese("视频站定时截取频率") + @Excel(name = "视频站定时截取频率") private String frequency; /** 视频站定时截取时长 */ @FieldChinese("视频站定时截取时长") + @Excel(name = "视频站定时截取时长") private String cutTime; /** 视频站定时截取压缩每秒多少帧 */ @FieldChinese("视频站定时截取压缩每秒多少帧") + @Excel(name = "视频站定时截取压缩每秒多少帧") private String frameRate; /** ts文件的时长 */ @FieldChinese("ts文件的时长") + @Excel(name = "ts文件的时长") private String tsDuration; /** ocr方式 */ @FieldChinese("ocr方式") + @Excel(name = "ocr方式") private String ocrWay; /** 是否是生态流量泄放复核 */ @FieldChinese("是否是生态流量泄放复核") + @Excel(name = "是否是生态流量泄放复核") private String eqreviewm; /** 视频站设备机位变更日期 */ @FieldChinese("视频站设备机位变更日期") + @Excel(name = "视频站设备机位变更日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jwupdate; /** 视频站AI识别是否启用 */ @FieldChinese("视频站AI识别是否启用") + @Excel(name = "视频站AI识别是否启用") private Integer aiEnabled; /** 视频站AI识别频率cron表达式 */ @FieldChinese("视频站AI识别频率") + @Excel(name = "视频站AI识别频率") private String aiFrequency; /** 视频站AI识别外部站码 */ @FieldChinese("视频站AI识别外部站码") + @Excel(name = "视频站AI识别外部站码") private String aiExtCode; /** 视频站AI识别外部站名 */ @FieldChinese("视频站AI识别外部站名") + @Excel(name = "视频站AI识别外部站名") private String aiExtName; /** 平台提供的直接列表 */ @FieldChinese("平台提供的直接列表") + @Excel(name = "平台提供的直接列表") private String liveAddress; /** 视频录像数据保留天数 */ @FieldChinese("视频录像数据保留天数") + @Excel(name = "视频录像数据保留天数") private Integer vdhisday; /** 视频截取失败多少秒重试 */ @FieldChinese("视频截取失败多少秒重试") + @Excel(name = "视频截取失败多少秒重试") private String delayTime; /** 视频截取失败最大重试次数 */ @FieldChinese("视频截取失败最大重试次数") + @Excel(name = "视频截取失败最大重试次数") private Integer delayNum; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name = "依托项目") private String project; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; -} +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java index 83cb23a7..6de28f4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdVpBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,181 +24,225 @@ public class SdVpBH implements Serializable { /** 珍稀植物园编码 */ @TableId(type = IdType.INPUT) @FieldChinese("珍稀植物园编码") + @Excel(name = "珍稀植物园编码") private String stcd; /** 珍稀植物园名称 */ @FieldChinese("珍稀植物园名称") + @Excel(name = "珍稀植物园名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 所属建设阶段 */ @FieldChinese("所属建设阶段") + @Excel(name="所属建设阶段") private Integer blprd; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name="高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name="站址/位置") private String stlc; /** 是否启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name="数据接入时间") private Date dtinTm; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name="规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划开工日期") + @Excel(name="计划开工日期") private Date pststdt; /** 计划完工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") + @Excel(name="计划完工日期") private Date pesstdt; /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name="开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name="退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** LOGO图片 */ @FieldChinese("LOGO图片") + @Excel(name="LOGO图片") private String logo; /** 介绍弹窗图片 */ + @Excel(name="介绍弹窗图片") @FieldChinese("介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name="投资") private BigDecimal inv; /** 总工期(单位:天) */ @FieldChinese("总工期") + @Excel(name="总工期") private Integer aptl; /** 面积(单位:km²) */ + @Excel(name="面积") @FieldChinese("面积") private BigDecimal area; /** 地点 */ @FieldChinese("地点") + @Excel(name="地点") private String place; /** 保护对象文字描述 */ @FieldChinese("保护对象文字描述") + @Excel(name="保护对象文字描述") private String bhdx; /** 保护对象列表 */ @FieldChinese("保护对象列表") + @Excel(name="保护对象列表") private String bhdxlb; /** 保护方式 */ @FieldChinese("保护方式") + @Excel(name="保护方式") private String bhfs; /** 保护原因 */ @FieldChinese("保护原因") + @Excel(name="保护原因") private String bhyy; /** 是否业主营地公用 */ + @Excel(name="是否业主营地公用") @FieldChinese("是否业主营地公用") private Integer iscaec; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name="备注") private String remark; /** 数据来源 */ + @Excel(name="数据来源") @FieldChinese("数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name="数据来源时间") @FieldChinese("数据来源时间") private Date vlsrTm; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java index 5a1e814e..43317e89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWeBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,46 +24,57 @@ public class SdWeBH implements Serializable { /** 水生生态调查断面编码 */ @TableId(type = IdType.INPUT) @FieldChinese("水生生态调查断面编码") + @Excel(name = "水生生态调查断面编码") private String stcd; /** 水生生态调查断面名称 */ @FieldChinese("水生生态调查断面名称") + @Excel(name = "水生生态调查断面名称") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name = "站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 经度(单位:°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(单位:°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程(单位:m) */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址/位置 */ @FieldChinese("站址/位置") + @Excel(name = "站址/位置") private String stlc; /** 是否启用 */ + @Excel(name = "是否启用") @FieldChinese("是否启用") private Integer usfl; /** 数据是否接入 */ @FieldChinese("数据是否接入") + @Excel(name = "数据是否接入") private Integer dtin; @TableField(exist = false) @@ -71,52 +83,65 @@ public class SdWeBH implements Serializable { /** 数据接入时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入时间") + @Excel(name = "数据接入时间") private Date dtinTm; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name = "所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name = "所属水电基地流域编码") private String hbrvcd; /** 所属流域编码 */ @FieldChinese("所属流域编码") + @Excel(name = "所属流域编码") private String rvcd; @TableField(exist = false) + @Excel(name = "所属流域名称") private String rvnm; /** 所属行政区划编码 */ @FieldChinese("所属行政区划编码") + @Excel(name = "所属行政区划编码") private String addvcd; /** 规划设计日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("规划设计日期") + @Excel(name = "规划设计日期") private Date stdsdt; /** 计划开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "计划开工日期") @FieldChinese("计划开工日期") private Date pststdt; /** 计划完工日期 */ + @Excel(name = "计划完工日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("计划完工日期") private Date pesstdt; @@ -124,59 +149,73 @@ public class SdWeBH implements Serializable { /** 开工日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("开工日期") + @Excel(name = "开工日期") private Date swdt; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "退役/拆除日期") @FieldChinese("退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 投资(单位:亿元) */ @FieldChinese("投资") + @Excel(name = "投资") private BigDecimal inv; /** 投资是否计入主体工程 */ + @Excel(name = "投资是否计入主体工程") @FieldChinese("投资是否计入主体工程") private Integer invinmn; /** 数据监测频次(单位:min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java index 732fde4b..3f539836 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,163 +24,206 @@ public class SdWqBH implements Serializable { /** 站码 */ @TableId(type = IdType.INPUT) @FieldChinese("站码") + @Excel(name = "站码") private String stcd; /** 站名 */ @FieldChinese("站名") + @Excel(name = "站名") private String stnm; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name = "数据时间") private Date tm; /** 站类 */ + @Excel(name = "站类") @FieldChinese("站类") private String sttp; @TableField(exist = false) + @Excel(name = "站类名称") private String sttpName; /** 经度(°) */ @FieldChinese("经度") + @Excel(name = "经度") private BigDecimal lgtd; /** 纬度(°) */ @FieldChinese("纬度") + @Excel(name = "纬度") private BigDecimal lttd; /** 高程/海拔(m) */ + @Excel(name = "高程/海拔") @FieldChinese("高程/海拔") private BigDecimal elev; + /** 站址 */ @FieldChinese("站址") + @Excel(name = "站址") private String stlc; /** 水质目标 */ @FieldChinese("水质目标") + @Excel(name = "水质目标") private String wwqtg; @TableField(exist = false) + @Excel(name = "水质目标名称") private String wwqtgName; /** 水质建设类型 */ + @Excel(name = "水质建设类型") @FieldChinese("水质建设类型") private String wqtype; + /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name = "建成日期") private Date jcdt; /** 退役/拆除日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("退役/拆除日期") + @Excel(name = "退役/拆除日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name = "建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name = "建设状态分类名称") private String bldsttCodeName; /** 简介 */ @FieldChinese("简介") + @Excel(name = "简介") private String introduce; /** LOGO图片 */ + @Excel(name = "LOGO图片") @FieldChinese("LOGO图片") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name = "介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name = "是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ + @Excel(name = "数据是否接入") @FieldChinese("数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name = "数据是否接入名称") private String dtinName; /** 数据接入来源 */ + @Excel(name = "数据接入来源") @FieldChinese("数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name = "数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name = "数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Excel(name = "数据接入开始时间") @FieldChinese("数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ + @Excel(name = "监测方式名称") @FieldChinese("监测方式") private Integer mway; @TableField(exist = false) + @Excel(name = "监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name = "监测指标") private String stindx; /** 排序 */ + @Excel(name = "排序") @FieldChinese("排序") private Integer orderIndex; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name = "所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name = "所属电站名称") private String ennm; /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name = "所属水电基地编码") private String baseId; + @Excel(name = "所属水电基地名称") @TableField(exist = false) private String baseName; /** 所属水电基地流域编码 */ + @Excel(name = "所属水电基地流域编码") @FieldChinese("所属水电基地流域编码") private String hbrvcd; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name = "所属栖息地编码") private String fhstcd; /** 是否关联断面 */ @FieldChinese("是否关联断面") + @Excel(name = "是否关联断面") private Integer ispro; /** 数据监测频次(min) */ @FieldChinese("数据监测频次") + @Excel(name = "数据监测频次") private String dtfrqcy; /** 备注 */ @FieldChinese("备注") + @Excel(name = "备注") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name = "数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name = "数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -215,5 +259,6 @@ public class SdWqBH implements Serializable { /** 告警状态 */ @FieldChinese("告警状态") + @Excel(name = "告警状态") private String warnState; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java index 7f18dd9a..a61a5e1b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdWtBH.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.yfd.platform.annotation.Excel; import com.yfd.platform.annotation.FieldChinese; import lombok.Data; @@ -23,185 +24,231 @@ public class SdWtBH implements Serializable { /** 水温站站码 */ @TableId(type = IdType.INPUT) @FieldChinese("水温站站码") + @Excel(name = "水温站站码") private String stcd; /** 数据时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据时间") + @Excel(name="数据时间") private Date tm; /** 水温站站名 */ @FieldChinese("水温站站名") + @Excel(name="水温站站名") private String stnm; /** 站类 */ @FieldChinese("站类") + @Excel(name="站类") private String sttp; @TableField(exist = false) + @Excel(name="站类名称") private String sttpName; /** 经度 */ @FieldChinese("经度") + @Excel(name="经度") private BigDecimal lgtd; /** 纬度 */ @FieldChinese("纬度") + @Excel(name="纬度") private BigDecimal lttd; /** 高程 */ @FieldChinese("高程") + @Excel(name = "高程") private BigDecimal elev; /** 站址 */ @FieldChinese("站址") + @Excel(name="站址") private String stlc; /** 测站来源 */ @FieldChinese("测站来源") + @Excel(name="测站来源") private String stsr; /** 水温监测断面设备类型:1=浮动式 2=固定式 */ @FieldChinese("水温监测断面设备类型") + @Excel(name="水温监测断面设备类型") private Integer wtDeviceType; /** 水温监测断面类型 */ @FieldChinese("水温监测断面类型") + @Excel(name="水温监测断面类型") private String wtType; /** 电站水温结构类型 */ @FieldChinese("电站水温结构类型") + @Excel(name="电站水温结构类型") private String wts; /** 固定垂向水温类型:1=相对位置 2=高程 */ @FieldChinese("固定垂向水温类型") + @Excel(name="固定垂向水温类型") private Integer wtHgtType; /** 固定垂向水温第1个探头高程 */ @FieldChinese("固定垂向水温第1个探头高程") + @Excel(name="固定垂向水温第1个探头高程") private BigDecimal wtFirstHgt; /** 垂向水温探头分布 */ @FieldChinese("垂向水温探头分布") + @Excel(name="垂向水温探头分布") private String wtDist; /** 建成日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("建成日期") + @Excel(name="建成日期") private Date jcdt; /** 撤站日期 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("撤站日期") + @Excel(name="撤站日期") private Date wddt; /** 建设状态分类 */ @FieldChinese("建设状态分类") + @Excel(name="建设状态分类") private Integer bldsttCode; @TableField(exist = false) + @Excel(name="建设状态分类名称") private String bldsttCodeName; /** 总投资 */ @FieldChinese("总投资") + @Excel(name="总投资") private BigDecimal inv; /** 投资是否计入主体工程 */ @FieldChinese("投资是否计入主体工程") + @Excel(name="投资是否计入主体工程") private Integer invinmn; /** 简介 */ @FieldChinese("简介") + @Excel(name="简介") private String introduce; /** 测站logo */ @FieldChinese("测站logo") + @Excel(name="测站logo") private String logo; /** 介绍弹窗图片 */ @FieldChinese("介绍弹窗图片") + @Excel(name="介绍弹窗图片") private String inffile; /** 是否启用:0=禁用 1=启用 */ @FieldChinese("是否启用") + @Excel(name="是否启用") private Integer usfl; /** 数据是否接入:0=未接入 1=已接入 */ @FieldChinese("数据是否接入") + @Excel(name="数据是否接入") private Integer dtin; @TableField(exist = false) + @Excel(name="数据是否接入名称") private String dtinName; /** 数据接入来源 */ @FieldChinese("数据接入来源") + @Excel(name="数据接入来源") private String dtinSrc; /** 数据接入类型:0=自建 1=国家建 2=人工建 */ @FieldChinese("数据接入类型") + @Excel(name="数据接入类型") private Integer dtinType; @TableField(exist = false) + @Excel(name="数据接入类型名称") private String dtinTypeName; /** 数据接入开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据接入开始时间") + @Excel(name="数据接入开始时间") private Date dtinTm; /** 监测方式:1=人工 2=自动 */ @FieldChinese("监测方式") + @Excel(name="监测方式") private Integer mway; @TableField(exist = false) + @Excel(name="监测方式名称") private String mwayName; /** 监测指标 */ @FieldChinese("监测指标") + @Excel(name="监测指标") private String stindx; /** 排序 */ @FieldChinese("排序") + @Excel(name="排序") private Integer orderIndex; /** 所属断面编码 */ @FieldChinese("所属断面编码") + @Excel(name="所属断面编码") private String dmstcd; /** 所属电站编码 */ @FieldChinese("所属电站编码") + @Excel(name="所属电站编码") private String rstcd; @TableField(exist = false) + @Excel(name="所属电站名称") private String ennm; /** 所属栖息地编码 */ @FieldChinese("所属栖息地编码") + @Excel(name="所属栖息地编码") private String fhstcd; /** 是否属于测站:0=否 1=是 */ @FieldChinese("是否属于测站") + @Excel(name="是否属于测站") private Integer ispro; /** 依托项目 */ @FieldChinese("依托项目") + @Excel(name="依托项目") private String project; /** 数据监测频次 */ @FieldChinese("数据监测频次") + @Excel(name="数据监测频次") private String dtfrqcy; /** 备注说明 */ @FieldChinese("备注说明") + @Excel(name="备注说明") private String remark; /** 数据来源 */ @FieldChinese("数据来源") + @Excel(name="数据来源") private String vlsr; /** 数据来源时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @FieldChinese("数据来源时间") + @Excel(name="数据来源时间") private Date vlsrTm; /** 创建人 */ @@ -237,20 +284,25 @@ public class SdWtBH implements Serializable { /** 所属水电基地编码 */ @FieldChinese("所属水电基地编码") + @Excel(name="所属水电基地编码") private String baseId; @TableField(exist = false) + @Excel(name="所属水电基地名称") private String baseName; /** 所属水电基地流域编码 */ @FieldChinese("所属水电基地流域编码") + @Excel(name="所属水电基地流域编码") private String hbrvcd; /** 告警状态 */ + @Excel(name="告警状态") @FieldChinese("告警状态") private String warnState; /** 是否纳入推送:0=否 1=是 */ @FieldChinese("是否纳入推送") + @Excel(name="是否纳入推送") private Integer isPush; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java index b4a0f370..1f3ee348 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStBaseInfoVo.java @@ -48,4 +48,10 @@ public class EngStBaseInfoVo { @Schema(description = "所属流域名称") private String rvcdName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "监测方式名称") + private String mwayName; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java index a409c84a..3e9c7928 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngStInfoResultVo.java @@ -19,7 +19,7 @@ public class EngStInfoResultVo { private List stcdValVoList = new ArrayList<>(); @Schema(description = "关联列表") - private List relList = new ArrayList<>(); + private List relList = new ArrayList<>(); @Schema(description = "站点基础信息") private EngStBaseInfoVo stBaseInfo; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java index e92d5a90..33b6bdbd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngVmsstbprptVo.java @@ -6,7 +6,9 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; @Data @Schema(description = "电站统计查询") @@ -17,6 +19,8 @@ public class EngVmsstbprptVo implements Serializable { private String id; private String sttp; private String sttpCode; + private Integer mway; + private String mwayName; private String sttpMap; private String logo; private String sttpName; @@ -246,4 +250,8 @@ public class EngVmsstbprptVo implements Serializable { private String bhhl; /** 保护核心长度 */ private BigDecimal qxdbhhxcd; + + @Schema(description = "关联列表") + private List relList = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java new file mode 100644 index 00000000..dbc3a573 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdAnimalDictoryBMapper.java @@ -0,0 +1,9 @@ +package com.yfd.platform.qgc_base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SdAnimalDictoryBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java new file mode 100644 index 00000000..5dd11231 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdAnimalDictoryBService.java @@ -0,0 +1,38 @@ +package com.yfd.platform.qgc_base.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; + +import java.util.List; +import java.util.Map; + +public interface ISdAnimalDictoryBService extends IService { + + Page queryPageList(DataSourceRequest request); + + Page selectPage(String name, String code, Integer category, Integer type, Page page); + + boolean add(SdAnimalDictoryB entity, String source); + + boolean update(SdAnimalDictoryB entity, String source); + + boolean update(Map patchMap, String source) throws Exception; + + boolean delete(List ids, String source); + + SdAnimalDictoryB getById(String id); + + /** + * 检查名称是否已存在(不过滤IS_DELETED,因为唯一约束不区分软删除) + */ + boolean existsByName(String name); + + /** + * 检查名称是否已被其他记录占用(排除指定ID) + */ + boolean existsByNameExcludeId(String name, String excludeId); + + List findSimilarAnimals(String name, Integer limit); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index d0247d7b..985cbee0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -84,6 +84,8 @@ public interface ISdEngInfoBHService extends IService { EngVmsstbprptVo getStInfoByStcd(String stcd); + EngStInfoResultVo getStInfoResultByStcd(String stcd); + EngStInfoResultVo getStcdInfo(String stcd); DataSourceResult getEiaapprovalKendoList(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java index d09ce970..4d014feb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdWtBHService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdWtBH; +import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @@ -14,4 +15,12 @@ public interface ISdWtBHService extends IService { boolean update(SdWtBH entity, String source); boolean update(Map engInfoPatch, String source) throws Exception; boolean delete(List stcds, String source); + /** + * 从 Excel 文件批量导入水温站数据(逐条走 add(),含站码唯一校验与操作日志) + * + * @param file 上传的 Excel 文件 + * @param source 数据来源 + * @return 导入结果汇总:total/success/fail/errors + */ + Map importData(MultipartFile file, String source) throws Exception; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java new file mode 100644 index 00000000..95abd9ad --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAnimalDictoryBServiceImpl.java @@ -0,0 +1,524 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdAnimalDictoryB; +import com.yfd.platform.qgc_base.mapper.SdAnimalDictoryBMapper; +import com.yfd.platform.qgc_base.service.ISdAnimalDictoryBService; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.Locale; +import java.util.stream.Collectors; + +/** + * 动物字典 Service 实现类 + */ +@Service +public class SdAnimalDictoryBServiceImpl extends ServiceImpl implements ISdAnimalDictoryBService { + + private static final String TABLE_NAME = "SD_ANIMALDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + @Resource + private PatchUpdateHelper patchUpdateHelper; + + /** SdAnimalDictoryB 中 @TableField(exist = false) 的字段名 + serialVersionUID */ + private static final Set TRANSIENT_FIELDS = Set.of( + "categoryName", "typeName", "rareName", "specOriginName", + "ptypeName", "situationName", "habitatName", "feedingHabitName", + "activityTimeName", "serialVersionUID" + ); + + /** + * 代码转名称元数据配置列表 + */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("category").modifyProperty("categoryName").dictType("STATIC").dictSource("ANIMAL_CATEGORY").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("HABITAT_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + // 以下三者与鱼类同名的 DICTCODE(SITUATION/HABITAT/PTYPE) 语义不同,故拆分为动物专属字典,避免污染鱼类枚举 + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("ANIMAL_PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("ANIMAL_SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("ANIMAL_HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("feedingHabit").modifyProperty("feedingHabitName").dictType("STATIC").dictSource("FEEDING_HABIT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("activityTime").modifyProperty("activityTimeName").dictType("STATIC").dictSource("ACTIVITY_TIME").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page page = DataSourceRequestUtil.executeQuery(request, SdAnimalDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdAnimalDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdAnimalDictoryB entity, String source) { + SdAnimalDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + dictCodeToNameConverter.convertCodeToName(before, CODE_TO_NAME_META_LIST); + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, source, CODE_TO_NAME_META_LIST); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(Map patchMap, String source) throws Exception { + return patchUpdateHelper.execute( + this, patchMap, source, TABLE_NAME, SdAnimalDictoryB.class, + TRANSIENT_FIELDS, CODE_TO_NAME_META_LIST, "id"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdAnimalDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id); + wrapper.set(SdAnimalDictoryB::getIsDeleted, 1); + wrapper.set(SdAnimalDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdAnimalDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + dictCodeToNameConverter.convertCodeToName(entity, CODE_TO_NAME_META_LIST); + msOperationLogService.recordDeleteDetailLog(entity.getName(), TABLE_NAME, entity, source, CODE_TO_NAME_META_LIST); + count++; + } + } + return count > 0; + } + + @Override + public boolean existsByName(String name) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + return count(wrapper) > 0; + } + + @Override + public boolean existsByNameExcludeId(String name, String excludeId) { + if (!StringUtils.hasText(name)) { + return false; + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getName, name); + if (StringUtils.hasText(excludeId)) { + wrapper.ne(SdAnimalDictoryB::getId, excludeId); + } + return count(wrapper) > 0; + } + + @Override + public SdAnimalDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getId, id) + .eq(SdAnimalDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + public Page selectPage(String name, String code, Integer category, Integer type, Page page) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + + if (StringUtils.hasText(name)) { + wrapper.like(SdAnimalDictoryB::getName, name); + } + if (StringUtils.hasText(code)) { + wrapper.eq(SdAnimalDictoryB::getCode, code); + } + if (category != null) { + wrapper.eq(SdAnimalDictoryB::getCategory, category); + } + if (type != null) { + wrapper.eq(SdAnimalDictoryB::getType, type); + } + + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(page, wrapper); + } + + @Override + public List findSimilarAnimals(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + int resultLimit = (limit != null && limit > 0) ? limit : 10; + String rawSearchName = name.trim(); + String searchName = normalizeText(rawSearchName); + + List candidates = querySimilarCandidates(rawSearchName, searchName, resultLimit); + if (candidates.isEmpty()) { + return Collections.emptyList(); + } + + Map searchScoreMap = new HashMap<>(); + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) { + continue; + } + int score = calculateSearchScore(searchName, animal); + if (score > 0) { + searchScoreMap.put(animal.getId(), score); + } + } + + if (searchScoreMap.isEmpty()) { + return Collections.emptyList(); + } + + SdAnimalDictoryB reference = candidates.stream() + .filter(a -> a != null && searchScoreMap.containsKey(a.getId())) + .max((a1, a2) -> { + int scoreCompare = Integer.compare(searchScoreMap.get(a1.getId()), searchScoreMap.get(a2.getId())); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(a1.getOrderIndex()), nullSafe(a2.getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(a2.getName()).compareTo(safeText(a1.getName())); + }) + .orElse(null); + + if (reference == null) { + return Collections.emptyList(); + } + + return candidates.stream() + .filter(a -> a != null && StringUtils.hasText(a.getId())) + .map(a -> new AbstractMap.SimpleEntry<>(a, buildFinalScore(reference, a, searchScoreMap.getOrDefault(a.getId(), 0)))) + .filter(e -> e.getValue() > 0) + .sorted((e1, e2) -> { + int scoreCompare = Integer.compare(e2.getValue(), e1.getValue()); + if (scoreCompare != 0) return scoreCompare; + int orderCompare = Integer.compare(nullSafe(e2.getKey().getOrderIndex()), nullSafe(e1.getKey().getOrderIndex())); + if (orderCompare != 0) return orderCompare; + return safeText(e1.getKey().getName()).compareTo(safeText(e2.getKey().getName())); + }) + .limit(resultLimit) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private List querySimilarCandidates(String rawSearchName, String normalizedSearchName, int resultLimit) { + int candidateLimit = Math.min(Math.max(resultLimit * 30, 120), 500); + LinkedHashMap candidateMap = new LinkedHashMap<>(); + + mergeCandidates(candidateMap, queryExactCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryContainsCandidates(rawSearchName, normalizedSearchName, candidateLimit)); + } + if (candidateMap.size() < candidateLimit) { + mergeCandidates(candidateMap, queryTokenCandidates(normalizedSearchName, candidateLimit)); + } + + return new ArrayList<>(candidateMap.values()); + } + + private void mergeCandidates(Map candidateMap, List candidates) { + if (candidates == null || candidates.isEmpty()) return; + for (SdAnimalDictoryB animal : candidates) { + if (animal == null || !StringUtils.hasText(animal.getId())) continue; + candidateMap.putIfAbsent(animal.getId(), animal); + } + } + + private List queryExactCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .eq(SdAnimalDictoryB::getName, rawSearchName) + .or().eq(SdAnimalDictoryB::getAlias, rawSearchName) + .or().eq(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().eq(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().eq(SdAnimalDictoryB::getGenus, rawSearchName) + .or().eq(SdAnimalDictoryB::getFamily, rawSearchName) + .or().eq(SdAnimalDictoryB::getOrders, rawSearchName) + .or().apply("LOWER(NAME) = {0}", normalizedSearchName) + .or().apply("LOWER(ALIAS) = {0}", normalizedSearchName) + .or().apply("LOWER(NAME_EN) = {0}", normalizedSearchName) + .or().apply("LOWER(SPECIES) = {0}", normalizedSearchName) + .or().apply("LOWER(GENUS) = {0}", normalizedSearchName) + .or().apply("LOWER(FAMILY) = {0}", normalizedSearchName) + .or().apply("LOWER(ORDERS) = {0}", normalizedSearchName)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryContainsCandidates(String rawSearchName, String normalizedSearchName, int limit) { + if (!StringUtils.hasText(rawSearchName)) { + return Collections.emptyList(); + } + String likeValue = "%" + rawSearchName + "%"; + String normalizedLikeValue = "%" + normalizedSearchName + "%"; + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> w + .like(SdAnimalDictoryB::getName, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().like(SdAnimalDictoryB::getNameEn, rawSearchName) + .or().like(SdAnimalDictoryB::getSpecies, rawSearchName) + .or().like(SdAnimalDictoryB::getGenus, rawSearchName) + .or().like(SdAnimalDictoryB::getFamily, rawSearchName) + .or().like(SdAnimalDictoryB::getOrders, rawSearchName) + .or().like(SdAnimalDictoryB::getIntroduce, rawSearchName) + .or().like(SdAnimalDictoryB::getAlias, rawSearchName) + .or().apply("LOWER(NAME) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(GENUS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", normalizedLikeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", normalizedLikeValue)); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private List queryTokenCandidates(String normalizedSearchName, int limit) { + Set tokens = splitTokens(normalizedSearchName).stream() + .filter(StringUtils::hasText) + .filter(token -> token.length() >= 2) + .limit(5) + .collect(Collectors.toCollection(LinkedHashSet::new)); + if (tokens.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = buildCandidateSelectWrapper(); + wrapper.and(w -> { + boolean first = true; + for (String token : tokens) { + String likeValue = "%" + token + "%"; + if (!first) { + w.or(); + } + w.apply("LOWER(NAME) LIKE {0}", likeValue) + .or().apply("LOWER(ALIAS) LIKE {0}", likeValue) + .or().apply("LOWER(NAME_EN) LIKE {0}", likeValue) + .or().apply("LOWER(SPECIES) LIKE {0}", likeValue) + .or().apply("LOWER(GENUS) LIKE {0}", likeValue) + .or().apply("LOWER(FAMILY) LIKE {0}", likeValue) + .or().apply("LOWER(ORDERS) LIKE {0}", likeValue) + .or().apply("LOWER(INTRODUCE) LIKE {0}", likeValue); + first = false; + } + }); + wrapper.orderByDesc(SdAnimalDictoryB::getOrderIndex); + return page(new Page<>(1, limit), wrapper).getRecords(); + } + + private LambdaQueryWrapper buildCandidateSelectWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.select( + SdAnimalDictoryB::getId, + SdAnimalDictoryB::getCode, + SdAnimalDictoryB::getName, + SdAnimalDictoryB::getNameEn, + SdAnimalDictoryB::getAlias, + SdAnimalDictoryB::getIntroduce, + SdAnimalDictoryB::getOrders, + SdAnimalDictoryB::getFamily, + SdAnimalDictoryB::getGenus, + SdAnimalDictoryB::getSpecies, + SdAnimalDictoryB::getCategory, + SdAnimalDictoryB::getType, + SdAnimalDictoryB::getHabitat, + SdAnimalDictoryB::getFeedingHabit, + SdAnimalDictoryB::getActivityTime, + SdAnimalDictoryB::getPtype, + SdAnimalDictoryB::getSituation, + SdAnimalDictoryB::getRare, + SdAnimalDictoryB::getOrderIndex, + SdAnimalDictoryB::getIsDeleted + ); + wrapper.eq(SdAnimalDictoryB::getIsDeleted, 0); + return wrapper; + } + + private int calculateSimilarity(SdAnimalDictoryB ref, SdAnimalDictoryB target) { + if (ref == null || target == null) { + return 0; + } + if (StringUtils.hasText(ref.getId()) && ref.getId().equals(target.getId())) { + return 5000; + } + int score = 0; + score += calculateFieldSimilarity(ref.getName(), target.getName(), 45); + score += calculateFieldSimilarity(ref.getNameEn(), target.getNameEn(), 22); + score += calculateFieldSimilarity(ref.getAlias(), target.getAlias(), 26); + score += calculateFieldSimilarity(ref.getSpecies(), target.getSpecies(), 30); + score += calculateFieldSimilarity(ref.getGenus(), target.getGenus(), 24); + score += calculateFieldSimilarity(ref.getFamily(), target.getFamily(), 18); + score += calculateFieldSimilarity(ref.getOrders(), target.getOrders(), 14); + score += calculateFieldSimilarity(ref.getIntroduce(), target.getIntroduce(), 8); + + if (bothEqual(ref.getCategory(), target.getCategory())) score += 5; + if (bothEqual(ref.getType(), target.getType())) score += 5; + if (bothEqual(ref.getHabitat(), target.getHabitat())) score += 5; + if (sameText(ref.getFeedingHabit(), target.getFeedingHabit())) score += 3; + if (sameText(ref.getActivityTime(), target.getActivityTime())) score += 3; + if (bothEqual(ref.getPtype(), target.getPtype())) score += 2; + if (bothEqual(ref.getSituation(), target.getSituation())) score += 2; + if (bothEqual(ref.getRare(), target.getRare())) score += 2; + + return score; + } + + private int calculateSearchScore(String searchName, SdAnimalDictoryB animal) { + int score = 0; + score += calculateFieldSearchScore(searchName, animal.getName(), 220, 140, 90, 40); + score += calculateFieldSearchScore(searchName, animal.getAlias(), 180, 120, 80, 30); + score += calculateFieldSearchScore(searchName, animal.getNameEn(), 160, 100, 70, 25); + score += calculateFieldSearchScore(searchName, animal.getSpecies(), 140, 90, 60, 25); + score += calculateFieldSearchScore(searchName, animal.getGenus(), 120, 80, 55, 20); + score += calculateFieldSearchScore(searchName, animal.getFamily(), 100, 70, 45, 18); + score += calculateFieldSearchScore(searchName, animal.getOrders(), 90, 60, 40, 15); + score += calculateFieldSearchScore(searchName, animal.getIntroduce(), 45, 30, 0, 12); + return score; + } + + private int buildFinalScore(SdAnimalDictoryB reference, SdAnimalDictoryB current, int searchScore) { + int totalScore = searchScore; + if (reference != null) { + totalScore += calculateSimilarity(reference, current); + } + return totalScore; + } + + private int calculateFieldSearchScore(String searchText, String candidate, int exactScore, int containsScore, + int reverseContainsScore, int overlapMaxScore) { + String normalizedSearch = normalizeText(searchText); + String normalizedCandidate = normalizeText(candidate); + if (!StringUtils.hasText(normalizedSearch) || !StringUtils.hasText(normalizedCandidate)) { + return 0; + } + if (normalizedCandidate.equals(normalizedSearch)) { + return exactScore; + } + if (normalizedCandidate.contains(normalizedSearch)) { + return containsScore; + } + if (reverseContainsScore > 0 && normalizedSearch.contains(normalizedCandidate) && normalizedCandidate.length() >= 2) { + return reverseContainsScore; + } + return calculateTextOverlapScore(normalizedSearch, normalizedCandidate, overlapMaxScore); + } + + private int calculateFieldSimilarity(String left, String right, int exactScore) { + String normalizedLeft = normalizeText(left); + String normalizedRight = normalizeText(right); + if (!StringUtils.hasText(normalizedLeft) || !StringUtils.hasText(normalizedRight)) { + return 0; + } + if (normalizedLeft.equals(normalizedRight)) { + return exactScore; + } + if (normalizedLeft.contains(normalizedRight) || normalizedRight.contains(normalizedLeft)) { + return Math.max(1, exactScore / 2); + } + return calculateTextOverlapScore(normalizedLeft, normalizedRight, Math.max(1, exactScore / 3)); + } + + private int calculateTextOverlapScore(String left, String right, int maxScore) { + if (!StringUtils.hasText(left) || !StringUtils.hasText(right) || maxScore <= 0) { + return 0; + } + Set leftTokens = splitTokens(left); + Set rightTokens = splitTokens(right); + if (leftTokens.isEmpty() || rightTokens.isEmpty()) { + return 0; + } + long commonCount = leftTokens.stream().filter(rightTokens::contains).count(); + if (commonCount <= 0) { + return 0; + } + int base = Math.min(leftTokens.size(), rightTokens.size()); + if (base <= 0) { + return 0; + } + return (int) Math.min(maxScore, Math.round((double) commonCount * maxScore / base)); + } + + private Set splitTokens(String text) { + String normalized = normalizeText(text); + if (!StringUtils.hasText(normalized)) { + return Collections.emptySet(); + } + Set tokens = new LinkedHashSet<>(); + String[] parts = normalized.split("[\\s,,;;、/\\\\()()]+"); + for (String part : parts) { + if (StringUtils.hasText(part)) { + tokens.add(part); + } + } + if (tokens.isEmpty()) { + for (int i = 0; i < normalized.length(); i++) { + char ch = normalized.charAt(i); + if (!Character.isWhitespace(ch)) { + tokens.add(String.valueOf(ch)); + } + } + } + return tokens; + } + + private boolean bothEqual(Integer a, Integer b) { + return a != null && a.equals(b) && !ObjectUtil.isEmpty(a); + } + + private boolean sameText(String a, String b) { + return StringUtils.hasText(a) && StringUtils.hasText(b) && a.equals(b); + } + + private int nullSafe(Integer v) { + return v == null ? 0 : v; + } + + private String normalizeText(String text) { + return StringUtils.hasText(text) ? text.trim().toLowerCase(Locale.ROOT) : ""; + } + + private String safeText(String text) { + return text == null ? "" : text; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index b0a27793..7936bd4d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -1023,9 +1023,45 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd,MWAY mway, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; +// +// EngStInfoResultVo vo = new EngStInfoResultVo(); +// +// // 主站点基础信息 +// vo.setStBaseInfo(oneBySqlWithResultType); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); +// if (relList != null) { +// vo.setRelList(relList); +// } + +// EngStBaseInfoVo oneBySqlWithResultType = microservicDynamicSQLMapper.getOneBySqlWithResultType( +// "SELECT " + selectCols + +// "FROM V_MS_STBPRP_T " + +// "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", +// paramMap, +// EngStBaseInfoVo.class); + // 非 ENG:直接从 V_MS_STBPRP_T 视图返回 String viewSql = "SELECT *,SWDT STSTDT FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0"; - return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + EngVmsstbprptVo engVmsstbprptVo= microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); + dictCodeToNameConverter.convertCodeToName(engVmsstbprptVo,CODE_TO_NAME_META_LIST); + engVmsstbprptVo.setRelList(relList); + return engVmsstbprptVo; } // ENG 走原有逻辑 @@ -1037,6 +1073,43 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl paramMap = new HashMap<>(); + paramMap.put("stcd", stcd); + + String selectCols = "STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " + + "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " + + "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " + + "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName "; + + EngStInfoResultVo vo = new EngStInfoResultVo(); + + // 主站点基础信息 + vo.setStBaseInfo(microservicDynamicSQLMapper.getOneBySqlWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0", + paramMap, + EngStBaseInfoVo.class)); + + // 关联站点列表(站类全路径包含当前站点的其他站点) + List relList = microservicDynamicSQLMapper.getAllListWithResultType( + "SELECT " + selectCols + + "FROM V_MS_STBPRP_T " + + "WHERE NVL(IS_DELETED, 0) = 0 " + + "AND ST_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')", + paramMap, + EngStBaseInfoVo.class); + if (relList != null) { + vo.setRelList(relList); + } + return vo; + } + private String buildVmsstbprptViewSqlNew() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java index 9669eba8..70602d4b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java @@ -75,7 +75,10 @@ public class SdHydrobaseServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes(); if (authorizedStations != null && !authorizedStations.isEmpty()) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c29ff7e6..5a5d8673 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -15,6 +15,7 @@ import com.yfd.platform.utils.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -130,4 +131,34 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme } return count > 0; } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map importData(MultipartFile file, String source) throws Exception { + List list = new ExcelUtil<>(SdWtBH.class).importExcel(file); + Map result = new HashMap<>(); + result.put("total", list.size()); + int batchSize = 500; + // 过滤无站码的行(stcd 为主键,不能为空) + List validList = new ArrayList<>(); + List errors = new ArrayList<>(); + for (SdWtBH entity : list) { + if (StrUtil.isBlank(entity.getStcd())) { + errors.add("存在缺少站码的行,已跳过"); + continue; + } + validList.add(entity); + } + int success = 0; + for (int i = 0; i < validList.size(); i += batchSize) { + List sub = validList.subList(i, Math.min(i + batchSize, validList.size())); + if (this.saveBatch(sub, batchSize)) { + success += sub.size(); + } + } + result.put("success", success); + result.put("fail", list.size() - success); + result.put("errors", errors); + return result; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java index e988df2e..d2ed7e07 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqIntervalVo.java @@ -111,6 +111,9 @@ public class EngEqIntervalVo { @Schema(description = "补水总量") private BigDecimal fillWater; + @Schema(description = "生态类型") + private String eqtp; + @Schema(description = "基地排序") private Integer baseStepSort; diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java index 7ea2d5cf..8ea96035 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java @@ -3061,6 +3061,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { "eng.RGCP AS rgcp, " + "eng.ENNM AS stnm, " + "eng.ENNM AS ennm, " + + "'QEC' AS eqtp, " + "'ENG' AS sttp, " + "'ENG' AS sttpCode, " + "eng.BASE_ID AS baseId, " + @@ -3268,6 +3269,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { columns.put("hbrvcdName", "t.hbrvcdName AS hbrvcdName"); columns.put("addvcdName", "t.addvcdName AS addvcdName"); columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("eqtp", "t.eqtp AS eqtp"); columns.put("lttd", "t.lttd AS lttd"); columns.put("dtmel", "t.dtmel AS dtmel"); columns.put("dtin", "t.dtin AS dtin"); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java index 68b3afa7..7fed0415 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java @@ -249,6 +249,12 @@ public class FbStationController { return ResponseResult.success(); } + @PostMapping("/planFinish/GetKendoListCust") + @Operation(summary = "增殖计划完成情况(数量+种类)") + public ResponseResult getPlanFinishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fbStationService.getPlanFinishKendoListCust(dataSourceRequest)); + } + @PostMapping("/fishType/GetKendoListCust") @Operation(summary = "增殖站鱼种完成情况统计") public ResponseResult getFishTypeKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java new file mode 100644 index 00000000..8ca46371 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FbPlanFinishVo.java @@ -0,0 +1,35 @@ +package com.yfd.platform.qgc_env.fb.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 增殖计划完成情况(数量 + 种类) + * + * @author + */ +@Data +public class FbPlanFinishVo { + + /** 增殖站站码 */ + private String stcd; + + /** 数量-计划完成总数 */ + private BigDecimal planQty; + + /** 数量-已完成总数 */ + private BigDecimal finishedQty; + + /** 数量-未完成总数 */ + private BigDecimal unfinishedQty; + + /** 种类-计划完成种类总数 */ + private Integer planFtp; + + /** 种类-已完成种类数量 */ + private Integer finishedFtp; + + /** 种类-未完成种类数量 */ + private Integer unfinishedFtp; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java index 8896c6ed..d2a10a2c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java @@ -53,6 +53,14 @@ public interface FbStationService { DataSourceResult getFishTypeKendoListCust(DataSourceRequest dataSourceRequest); + /** + * 增殖计划完成情况(数量 + 种类),按增殖站统计: + * 数量-计划完成总数/已完成总数/未完成总数,种类-计划完成种类总数/已完成种类数量/未完成种类数量。 + * + * @param dataSourceRequest 支持 stcd/rstcd/startTime/endTime 过滤与分页排序 + */ + DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest); + DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest); DataSourceResult getMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 5309b35d..7d98dbce 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java @@ -53,6 +53,9 @@ public class FbStationServiceImpl implements FbStationService { private static final Map FISH_RUN_FIELD_MEANING_MAP = new HashMap<>(); static { + FISH_RUN_FIELD_MEANING_MAP.put("ID", "主键ID"); + FISH_RUN_FIELD_MEANING_MAP.put("RPIMN_ID", "放流实施ID"); + FISH_RUN_FIELD_MEANING_MAP.put("STCD", "电站编码"); FISH_RUN_FIELD_MEANING_MAP.put("FTP", "鱼种类"); FISH_RUN_FIELD_MEANING_MAP.put("FSZ", "平均长度"); FISH_RUN_FIELD_MEANING_MAP.put("FWET", "平均体重"); @@ -611,6 +614,38 @@ public class FbStationServiceImpl implements FbStationService { return result; } + @Override + public DataSourceResult getPlanFinishKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd"); + String rstcdFilter = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd"); + String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime"); + String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime"); + + Map paramMap = new HashMap<>(); + String sql = buildPlanFinishSql( + stcd, + parseFishTypeFilterValues(rstcdFilter), + parseFishTypeDate(startTime), + parseFishTypeDate(endTime), + paramMap + ) + buildPlanFinishOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + + Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql, + paramMap, + FbPlanFinishVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getFishTypeStcdList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -1387,6 +1422,98 @@ public class FbStationServiceImpl implements FbStationService { return sql.toString(); } + /** + * 增殖计划完成情况(数量 + 种类): + * 数量:计划完成总数 / 已完成总数(实际放流) / 未完成总数 + * 种类:计划完成种类总数(COUNT(DISTINCT FTP)) / 已完成种类数量(计划种类在实际放流中出现的数量) / 未完成种类数量 + */ + private String buildPlanFinishSql(String stcd, + List rstcdList, + Date startTime, + Date endTime, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT jh.RSTCD AS stcd, ") + .append("NVL(jh.PLAN_FCNT, 0) AS planQty, ") + .append("NVL(imn.FIN_FCNT, 0) AS finishedQty, ") + .append("CASE WHEN NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FCNT, 0) - NVL(imn.FIN_FCNT, 0) END AS unfinishedQty, ") + .append("NVL(jh.PLAN_FTP, 0) AS planFtp, ") + .append("NVL(ftp.FIN_FTP, 0) AS finishedFtp, ") + .append("CASE WHEN NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) < 0 THEN 0 ") + .append("ELSE NVL(jh.PLAN_FTP, 0) - NVL(ftp.FIN_FTP, 0) END AS unfinishedFtp ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, SUM(jhrs.FCNT) AS PLAN_FCNT, COUNT(DISTINCT jhrs.FTP) AS PLAN_FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD ") + .append(") jh ") + .append("LEFT JOIN ( ") + .append("SELECT imnr.RSTCD, SUM(imnrs.FCNT) AS FIN_FCNT ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD ") + .append(") imn ON jh.RSTCD = imn.RSTCD ") + .append("LEFT JOIN ( ") + .append("SELECT temp.RSTCD AS stcd, COUNT(1) AS FIN_FTP ") + .append("FROM ( ") + .append("SELECT a.RSTCD, a.FTP ") + .append("FROM ( ") + .append("SELECT jhr.RSTCD, jhrs.FTP ") + .append("FROM SD_ENGFRPLAN_B jhr ") + .append("JOIN SD_ENGFRPLANDET_B jhrs ON jhr.ID = jhrs.RPJH_ID ") + .append("WHERE NVL(jhr.IS_DELETED, 0) = 0 AND NVL(jhrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "jhr", stcd, rstcdList, startTime, endTime, true, paramMap); + sql.append("GROUP BY jhr.RSTCD, jhrs.FTP ") + .append(") a ") + .append("INNER JOIN ( ") + .append("SELECT imnr.RSTCD, imnrs.FTP ") + .append("FROM SD_ENGFR_R imnr ") + .append("JOIN SD_RPIMNFISH_R imnrs ON imnr.ID = imnrs.RPIMN_ID ") + .append("WHERE NVL(imnr.IS_DELETED, 0) = 0 AND NVL(imnrs.IS_DELETED, 0) = 0 "); + appendFishTypeFilterSql(sql, "imnr", stcd, rstcdList, startTime, endTime, false, paramMap); + sql.append("GROUP BY imnr.RSTCD, imnrs.FTP ") + .append(") b ON a.RSTCD = b.RSTCD AND a.FTP = b.FTP ") + .append(") temp GROUP BY temp.RSTCD ") + .append(") ftp ON jh.RSTCD = ftp.stcd"); + return sql.toString(); + } + + private String buildPlanFinishOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return " ORDER BY stcd ASC"; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = switch (sort.getField()) { + case "stcd" -> "stcd"; + case "planQty" -> "planQty"; + case "finishedQty" -> "finishedQty"; + case "unfinishedQty" -> "unfinishedQty"; + case "planFtp" -> "planFtp"; + case "finishedFtp" -> "finishedFtp"; + case "unfinishedFtp" -> "unfinishedFtp"; + default -> null; + }; + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction); + } + if (orderByParts.isEmpty()) { + return " ORDER BY stcd ASC"; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + private String buildFishCountOrderBySql(List sorts) { if (CollUtil.isEmpty(sorts)) { return " ORDER BY stcd ASC"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index dcdc553d..7f0d68ad 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -278,14 +278,24 @@ public class FpRunServiceImpl implements FpRunService { stationParamMap ); String rstcd = stationContext == null ? null : Convert.toStr(stationContext.get("rstcd"), null); -// String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); + String hbrvcd = stationContext == null ? null : Convert.toStr(stationContext.get("hbrvcd"), null); String rvcd = stationContext == null ? null : Convert.toStr(stationContext.get("rvcd"), null); + // 按旧平台逻辑:根据 MWAY(1=人工SD_FPSS_R,2=自动SD_FPSSRL_R)选择过鱼数据表 + Integer mway = stationContext == null ? null : Convert.toInt(stationContext.get("mway"), null); + String tableName; + if (mway != null && mway == 1) { + tableName = "SD_FPSS_R"; + } else if (mway != null && mway == 2) { + tableName = "SD_FPSSRL_R"; + } else { + throw new BizException("未知的过鱼设施监测方式(1=人工,2=自动)."); + } String wtrvStcd = null; String wqStcd = null; - if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(rvcd)) { + if (StrUtil.isNotBlank(rstcd) && StrUtil.isNotBlank(hbrvcd)) { Map alongParamMap = new HashMap<>(); alongParamMap.put("rstcd", rstcd); - alongParamMap.put("rvcd", rvcd); + alongParamMap.put("rvcd", hbrvcd); List> alongRows = microservicDynamicSQLMapper.pageAllList( null, buildQgcFpRunAnalysisAlongSql(), @@ -308,20 +318,24 @@ public class FpRunServiceImpl implements FpRunService { paramMap.put("startTime", StrUtil.trim(tmArr[0])); paramMap.put("endTime", StrUtil.trim(tmArr[1])); paramMap.put("rstcd", rstcd); - paramMap.put("hbrvcd", rvcd); + paramMap.put("hbrvcd", hbrvcd); paramMap.put("wtrvStcd", wtrvStcd); paramMap.put("wqStcd", wqStcd); - String sql = buildQgcFpRunAnalysisDataSql(dataSourceRequest == null ? null : dataSourceRequest.getSort()); + String sql = buildQgcFpRunAnalysisDataSql( + dataSourceRequest == null ? null : dataSourceRequest.getSort(), tableName); Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions); List rows = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql, paramMap, FpRunAnalysisVo.class ); - long total = page != null ? page.getTotal() : rows.size(); + String ftpName =null; + if(rows!=null&&!rows.isEmpty()){ + ftpName = rows.stream().filter(r->StrUtil.isNotBlank(r.getFtp())).findFirst().get().getFtp(); + } FpRunAnalysisTableVo tableVo = new FpRunAnalysisTableVo() - .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftp))) + .setColumns(buildQgcFpRunAnalysisColumns(StrUtil.trim(ftpName))) .setDataSource(rows) .setTotal(total); result.setData(Collections.singletonList(tableVo)); @@ -2532,10 +2546,10 @@ public class FpRunServiceImpl implements FpRunService { } private String buildQgcFpRunAnalysisStationSql() { - return "SELECT fp.RSTCD AS \"rstcd\",eng.RVCD AS \"rvcd\", eng.HBRVCD AS \"hbrvcd\" " + - "FROM SD_FPSS_B_H fp " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "WHERE fp.STCD = #{map.stcd} " + + return "SELECT RSTCD AS \"rstcd\", HBRVCD AS \"hbrvcd\", RVCD AS \"rvcd\", MWAY AS \"mway\" " + + "FROM V_MS_STBPRP_T " + + "WHERE STCD = #{map.stcd} " + + "AND NVL(IS_DELETED, 0) = 0 " + "AND ROWNUM = 1"; } @@ -2552,7 +2566,7 @@ public class FpRunServiceImpl implements FpRunService { "ORDER BY NVL(t2.SORT, 999999), t2.STCD"; } - private String buildQgcFpRunAnalysisDataSql(List sortList) { + private String buildQgcFpRunAnalysisDataSql(List sortList, String tableName) { return "SELECT t.DT AS dt, " + " t.FTP AS ftp, " + " t.FCNT AS fcnt, " + @@ -2576,15 +2590,15 @@ public class FpRunServiceImpl implements FpRunService { " t4.TN AS TN, " + " t5.DZ AS DZ, " + " t5.RZ AS RZ, " + - " t5.QI AS QI, " + - " t5.QO AS QO " + + " t6.QI AS QI, " + + " t6.QO AS QO " + " FROM ( " + " SELECT TO_CHAR(TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + LEVEL - 1, 'YYYY-MM-DD') AS DT " + " FROM DUAL " + " CONNECT BY LEVEL <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') - TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') + 1 " + " ) t1 " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisFishSql() + + buildQgcFpRunAnalysisFishSql(tableName) + " ) t2 ON t1.DT = t2.DT " + " LEFT JOIN ( " + buildQgcFpRunAnalysisWtSql() + @@ -2593,19 +2607,22 @@ public class FpRunServiceImpl implements FpRunService { buildQgcFpRunAnalysisWqSql() + " ) t4 ON t1.DT = t4.DT " + " LEFT JOIN ( " + - buildQgcFpRunAnalysisEngSql() + + buildQgcFpRunAnalysisDzRzSql() + " ) t5 ON t1.DT = t5.DT " + + " LEFT JOIN ( " + + buildQgcFpRunAnalysisQiQoSql() + + " ) t6 ON t1.DT = t6.DT " + ") t " + "WHERE (t.FTP IS NOT NULL OR t.FCNT IS NOT NULL OR t.WT IS NOT NULL OR t.CODCR IS NOT NULL OR t.NH3N IS NOT NULL OR t.TP IS NOT NULL OR t.TN IS NOT NULL OR t.DZ IS NOT NULL OR t.RZ IS NOT NULL OR t.QI IS NOT NULL OR t.QO IS NOT NULL) " + buildQgcFpRunAnalysisOrderBySql(sortList); } - private String buildQgcFpRunAnalysisFishSql() { - return "SELECT t.DT AS DT, t.FTP AS FTP, t.FCNT AS FCNT FROM ( " + - buildQgcFpRunAnalysisManualFishSql() + - " UNION ALL " + - buildQgcFpRunAnalysisAutoFishSql() + - " ) t"; + private String buildQgcFpRunAnalysisFishSql(String tableName) { + //按旧平台逻辑:根据 MWAY 选定的表决定人工/自动过鱼查询 + if ("SD_FPSSRL_R".equals(tableName)) { + return buildQgcFpRunAnalysisAutoFishSql(); + } + return buildQgcFpRunAnalysisManualFishSql(); } private String buildQgcFpRunAnalysisManualFishSql() { @@ -2613,42 +2630,34 @@ public class FpRunServiceImpl implements FpRunService { " src.FTP AS FTP, " + " SUM(src.FCNT) AS FCNT " + "FROM ( " + - " SELECT t.STRDT AS STRDT, " + - " t.FCNT AS FCNT, " + - " COALESCE(fishRv.NAME, relRv.FISH_NAME, fishZy.NAME, relZy.FISH_NAME, fishDirect.NAME, t.FTP) AS FTP " + - " FROM SD_FPSS_R t " + - " INNER JOIN SD_FPSS_B_H fp ON fp.STCD = t.STCD " + - " LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relRv ON relRv.FISH_ID = t.FTP " + - " AND relRv.RVCD = eng.HBRVCD " + - " AND NVL(relRv.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishRv ON fishRv.ID = relRv.ZY_FISH_ID " + - " AND NVL(fishRv.IS_DELETED, 0) = 0 " + - " AND NVL(fishRv.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_RLTN_B relZy ON relZy.FISH_ID = t.FTP " + - " AND relZy.RVCD = 'ZY' " + - " AND NVL(relZy.IS_DELETED, 0) = 0 " + - " LEFT JOIN SD_FISHDICTORY_B fishZy ON fishZy.ID = relZy.ZY_FISH_ID " + - " AND NVL(fishZy.IS_DELETED, 0) = 0 " + - " AND NVL(fishZy.ENABLE, 1) = 1 " + - " LEFT JOIN SD_FISHDICTORY_B fishDirect ON fishDirect.ID = t.FTP " + - " AND NVL(fishDirect.IS_DELETED, 0) = 0 " + - " AND NVL(fishDirect.ENABLE, 1) = 1 " + - " WHERE t.STCD = #{map.stcd} " + - " AND t.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND t.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + + " SELECT a.STRDT AS STRDT, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSS_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.ZY_FISH_ID = #{map.ftp} " + + " AND a.STRDT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.STRDT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + ") src " + - "WHERE src.FTP = #{map.ftp} " + "GROUP BY TO_CHAR(src.STRDT, 'YYYY-MM-DD'), src.FTP"; } - // The automatic branch is reserved intentionally until the new equivalent table is provided. + // 自动过鱼(SD_FPSSRL_R):新表无 TASK_STATUS 列,按旧逻辑聚合 TM/FTP/FCNT private String buildQgcFpRunAnalysisAutoFishSql() { - return "SELECT CAST(NULL AS VARCHAR2(10)) AS DT, " + - " CAST(NULL AS VARCHAR2(255)) AS FTP, " + - " CAST(NULL AS NUMBER(18, 2)) AS FCNT " + - "FROM DUAL WHERE 1 = 0"; + return "SELECT TO_CHAR(src.TM, 'YYYY-MM-DD') AS DT, " + + " src.FTP AS FTP, " + + " SUM(src.FCNT) AS FCNT " + + "FROM ( " + + " SELECT a.TM AS TM, a.FCNT AS FCNT, b.NAME AS FTP " + + " FROM SD_FPSSRL_R a " + + " LEFT JOIN V_SD_FISHDICTORY_B b ON a.FTP = b.FISH_ID AND (b.RVCD = #{map.hbrvcd} OR b.RVCD = 'ZY') " + + " WHERE a.STCD = #{map.stcd} " + + " AND b.NAME = N'#{map.ftp}' " + + " AND a.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND a.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(a.IS_DELETED, 0) = 0 " + + ") src " + + "GROUP BY TO_CHAR(src.TM, 'YYYY-MM-DD'), src.FTP"; } private String buildQgcFpRunAnalysisWtSql() { @@ -2676,18 +2685,29 @@ public class FpRunServiceImpl implements FpRunService { "GROUP BY TO_CHAR(t.DT, 'YYYY-MM-DD')"; } - private String buildQgcFpRunAnalysisEngSql() { - return "SELECT TO_CHAR(TRUNC(t.TM), 'YYYY-MM-DD') AS DT, " + - " ROUND(AVG(t.DZ), 2) AS DZ, " + - " ROUND(AVG(t.RZ), 2) AS RZ, " + - " ROUND(AVG(t.QI), 2) AS QI, " + - " ROUND(AVG(t.QO), 2) AS QO " + - "FROM SD_HYDROPW_R t " + + // 坝上/坝下水位(DZ/RZ):旧逻辑来自按天表 SD_HYDROPWDAY_S + private String buildQgcFpRunAnalysisDzRzSql() { + return "SELECT TO_CHAR(t.DT, 'YYYY-MM-DD') AS DT, " + + " t.DZ AS DZ, " + + " t.RZ AS RZ " + + "FROM SD_HYDROPWDAY_S t " + "WHERE t.STCD = #{map.rstcd} " + + " AND t.DT >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND t.DT <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + + " AND NVL(t.IS_DELETED, 0) = 0"; + } + + // 入库/出库流量(QI/QO):旧逻辑来自 MS_ENG_T(TYPE='DAY') + private String buildQgcFpRunAnalysisQiQoSql() { + return "SELECT TO_CHAR(t.TM, 'YYYY-MM-DD') AS DT, " + + " t.QI AS QI, " + + " t.QO AS QO " + + "FROM MS_ENG_T t " + + "WHERE t.STCD = #{map.rstcd} " + + " AND t.TYPE = 'DAY' " + " AND t.TM >= TO_DATE(#{map.startTime}, 'YYYY-MM-DD HH24:MI:SS') " + " AND t.TM <= TO_DATE(#{map.endTime}, 'YYYY-MM-DD HH24:MI:SS') " + - " AND NVL(t.IS_DELETED, 0) = 0 " + - "GROUP BY TRUNC(t.TM)"; + " AND NVL(t.IS_DELETED, 0) = 0"; } private String buildQgcFpRunAnalysisOrderBySql(List sortList) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java new file mode 100644 index 00000000..3623fbd7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/controller/ImeController.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.ime.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ime") +@Tag(name = "智能装备模块") +@Validated +public class ImeController { + + @Resource + private ImeService imeService; + + @PostMapping("/vmsstbprpt/GetKendoList") + @Operation(summary = "智能装备站点基础统计查询") + public ResponseResult getVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/imePoint/GetKendoList") + @Operation(summary = "智能装备锚点查询") + public ResponseResult getImePointList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getVmsstbprptList(dataSourceRequest)); + } + + @PostMapping("/base/device/stat") + @Operation(summary = "各基地设备数量统计(堆叠条形图)") + public ResponseResult getBaseDeviceStat(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(imeService.getBaseDeviceStat(dataSourceRequest)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java new file mode 100644 index 00000000..ba89c34a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatResultVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Schema(description = "智能装备-各基地设备数量统计(堆叠条形图)返回") +public class ImeBaseDeviceStatResultVo { + + @Schema(description = "按基地统计的堆叠数据(横轴为基地, 内层 sttpCountMap 为堆叠系列)") + private List data = new ArrayList<>(); + + @Schema(description = "堆叠系列顺序(去重后的 sttpCode 集合)") + private List sttpCodes = new ArrayList<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java new file mode 100644 index 00000000..ec44081e --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeBaseDeviceStatVo.java @@ -0,0 +1,21 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +@Data +@Schema(description = "智能装备-各基地设备数量(堆叠条形图单基地)") +public class ImeBaseDeviceStatVo { + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "各站类(设备)数量,key=sttpCode,value=数量") + private Map sttpCountMap = new LinkedHashMap<>(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java new file mode 100644 index 00000000..58e4a006 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/entity/vo/ImeVmsstbprptVo.java @@ -0,0 +1,62 @@ +package com.yfd.platform.qgc_env.ime.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "智能装备站点基础统计查询") +public class ImeVmsstbprptVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "站类编码") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "站址/位置") + private String stlc; + + @Schema(description = "地形裁剪范围") + private String box; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java new file mode 100644 index 00000000..8af7a1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/ImeService.java @@ -0,0 +1,16 @@ +package com.yfd.platform.qgc_env.ime.service; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; + +public interface ImeService { + + DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest); + + /** + * 按基地统计设备(sttpCode)数量,用于堆叠条形图展示 + */ + ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java new file mode 100644 index 00000000..4b0b44f9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java @@ -0,0 +1,672 @@ +package com.yfd.platform.qgc_env.ime.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.GroupHelper; +import com.yfd.platform.common.GroupingInfo; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatResultVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeBaseDeviceStatVo; +import com.yfd.platform.qgc_env.ime.entity.vo.ImeVmsstbprptVo; +import com.yfd.platform.qgc_env.ime.service.ImeService; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +@Service +public class ImeServiceImpl implements ImeService { + + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + + @Override + public DataSourceResult getVmsstbprptList(DataSourceRequest dataSourceRequest) { + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup(); + Map paramMap = new HashMap<>(); + + String filterSql = buildImeVmsstbprptFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + + if (groups != null && groups.length > 0) { + return buildGroupedVmsstbprptResult(dataSourceRequest, groups, filterSql, paramMap); + } + return buildDetailVmsstbprptResult(dataSourceRequest, loadOptions, filterSql, paramMap); + } + + @Override + public ImeBaseDeviceStatResultVo getBaseDeviceStat(DataSourceRequest dataSourceRequest) { + Map paramMap = new HashMap<>(); + // 解析前端传递的 sttpCode 集合(STTP 为原始站类,STTP_CODE 依赖字典,故用 STTP 统计) + List sttpCodes = resolveImeSttpCodes( + dataSourceRequest == null ? null : dataSourceRequest.getFilter()); + + StringBuilder sql = new StringBuilder(); + // 以基地表为主表左连接设备统计,保证没有设备的基地也返回,数量为 0;sttpCode 类型在子查询内过滤 + sql.append("SELECT h.BASEID AS baseId, h.BASENAME AS baseName, ") + .append("s.sttpCode AS sttpCode, NVL(s.cnt, 0) AS cnt ") + .append("FROM SD_HYDROBASE h ") + .append("LEFT JOIN ( ") + .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") + .append(" FROM V_MS_STBPRP_T t ") + .append(" WHERE 1 = 1 ") + .append(" AND t.BASE_ID IS NOT NULL"); + if (CollUtil.isNotEmpty(sttpCodes)) { + List placeholders = new ArrayList<>(); + for (int i = 0; i < sttpCodes.size(); i++) { + String key = "imeBaseStatSttp_" + i; + paramMap.put(key, sttpCodes.get(i)); + placeholders.add("#{map." + key + "}"); + } + sql.append(" AND t.STTP IN (").append(String.join(", ", placeholders)).append(") "); + } + sql.append(" GROUP BY t.BASE_ID, t.STTP ") + .append(") s ON s.baseId = h.BASEID ") + .append("WHERE 1 = 1 ") + .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ") + .append("AND NVL(h.ENABLED, 1) = 1 "); + // baseId / baseName 等其它前端过滤(除 sttpCode 外) + String filterSql = buildImeBaseStatFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0} + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY h.BASEID"); + + List> rows = microservicDynamicSQLMapper.getAllList(sql.toString(), paramMap); + + LinkedHashMap groupMap = new LinkedHashMap<>(); + for (Map row : rows) { + String baseId = strVal(rowValue(row, "baseId")); + if (StrUtil.isBlank(baseId)) { + continue; + } + String baseName = strVal(rowValue(row, "baseName")); + String sttpCode = strVal(rowValue(row, "sttpCode")); + long cnt = longVal(rowValue(row, "cnt")); + ImeBaseDeviceStatVo vo = groupMap.computeIfAbsent(baseId, k -> { + ImeBaseDeviceStatVo v = new ImeBaseDeviceStatVo(); + v.setBaseId(baseId); + v.setBaseName(baseName); + // 预填前端传入的 sttpCode,缺失类型的数量为 0 + if (CollUtil.isNotEmpty(sttpCodes)) { + for (String code : sttpCodes) { + v.getSttpCountMap().merge(code, 0L, Long::sum); + } + } + return v; + }); + if (vo.getBaseName() == null) { + vo.setBaseName(baseName); + } + if (StrUtil.isNotBlank(sttpCode)) { + vo.getSttpCountMap().merge(sttpCode, cnt, Long::sum); + } + } + + ImeBaseDeviceStatResultVo result = new ImeBaseDeviceStatResultVo(); + result.setData(new ArrayList<>(groupMap.values())); + // 堆叠系列顺序:优先保留前端传入的 sttpCode,再补充实际存在的类型 + LinkedHashSet series = new LinkedHashSet<>(); + if (CollUtil.isNotEmpty(sttpCodes)) { + series.addAll(sttpCodes); + } + for (ImeBaseDeviceStatVo vo : result.getData()) { + series.addAll(vo.getSttpCountMap().keySet()); + } + result.setSttpCodes(new ArrayList<>(series)); + return result; + } + + /** + * 从过滤条件中提取前端传递的 sttpCode 集合(用于 IN 过滤) + */ + private List resolveImeSttpCodes(DataSourceRequest.FilterDescriptor filter) { + List codes = new ArrayList<>(); + collectImeSttpCodes(filter, codes); + LinkedHashSet distinct = new LinkedHashSet<>(); + for (String code : codes) { + if (StrUtil.isNotBlank(code)) { + distinct.add(code.trim()); + } + } + return new ArrayList<>(distinct); + } + + private void collectImeSttpCodes(DataSourceRequest.FilterDescriptor filter, List out) { + if (filter == null) { + return; + } + if (StrUtil.isNotBlank(filter.getField())) { + if ("sttpCode".equals(filter.getField()) || "sttp".equalsIgnoreCase(filter.getField())) { + for (Object value : normalizeImeVmsstbprptValues(filter.getValue())) { + if (value != null) { + out.add(String.valueOf(value)); + } + } + } + return; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + collectImeSttpCodes(child, out); + } + } + } + + /** + * 构建按基地统计设备数量的动态过滤条件(baseId/baseName 等,sttpCode 已由 resolveImeSttpCodes 提取) + */ + private String buildImeBaseStatFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeBaseStatLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeBaseStatFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeBaseStatLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeBaseStatColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeBaseStatP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeBaseStatP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeBaseStatColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "sttpCode", "sttp" -> null; // 已由 resolveImeSttpCodes 提取并在子查询 IN 中过滤,此处跳过 + case "baseId" -> "h.BASEID"; + case "baseName" -> "h.BASENAME"; + default -> null; + }; + } + + private Object rowValue(Map row, String key) { + Object value = row.get(key); + if (value == null && StrUtil.isNotBlank(key)) { + value = row.get(key.toUpperCase()); + } + return value; + } + + private String strVal(Object value) { + return value == null ? "" : String.valueOf(value); + } + + private long longVal(Object value) { + if (value == null) { + return 0L; + } + try { + return Long.parseLong(String.valueOf(value).trim()); + } catch (NumberFormatException e) { + return 0L; + } + } + + private DataSourceResult buildDetailVmsstbprptResult(DataSourceRequest dataSourceRequest, + DataSourceLoadOptionsBase loadOptions, + String filterSql, + Map paramMap) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(buildImeVmsstbprptSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append(buildImeVmsstbprptOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + + Page> page = loadOptions == null ? null + : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, + sql.toString(), + paramMap, + ImeVmsstbprptVo.class + ); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + private DataSourceResult buildGroupedVmsstbprptResult(DataSourceRequest dataSourceRequest, + GroupingInfo[] groups, + String filterSql, + Map paramMap) { + List groupDescriptors = dataSourceRequest == null ? null : dataSourceRequest.getGroup(); + List selectItems = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + selectItems.add(column + " AS " + descriptor.getField()); + selectItems.add("COUNT(1) AS count_" + descriptor.getField()); + } + } + if (selectItems.isEmpty()) { + selectItems.add("t.sttpCode AS sttpCode"); + selectItems.add("COUNT(1) AS count_sttpCode"); + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append(String.join(", ", selectItems)) + .append(" FROM (") + .append(buildImeVmsstbprptViewSql()) + .append(") t ") + .append("WHERE 1 = 1 "); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + List groupByColumns = new ArrayList<>(); + if (CollUtil.isNotEmpty(groupDescriptors)) { + for (DataSourceRequest.GroupDescriptor descriptor : groupDescriptors) { + if (descriptor == null || StrUtil.isBlank(descriptor.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(descriptor.getField()); + if (StrUtil.isNotBlank(column)) { + groupByColumns.add(column); + } + } + } + if (!groupByColumns.isEmpty()) { + sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)); + } else { + sql.append(" GROUP BY t.sttpCode "); + } + sql.append(buildImeVmsstbprptGroupOrderBySql(groupDescriptors)); + + List> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap); + DataSourceResult result = new DataSourceResult<>(); + if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) { + result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } else { + result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groups))); + result.setTotal((long) rows.size()); + } + result.setAggregates(new HashMap<>()); + return result; + } + + private String buildImeVmsstbprptGroupOrderBySql(List groups) { + if (CollUtil.isEmpty(groups)) { + return " ORDER BY t.sttpCode ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.GroupDescriptor group : groups) { + if (group == null || StrUtil.isBlank(group.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(group.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(group.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.sttpCode ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + private String buildImeVmsstbprptViewSql() { + return "SELECT " + + "src.STCD AS id, " + + "src.STTP_CODE AS sttpCode, " + + "src.STTP AS sttp, " + + "CONCAT('ZHZB_', src.STTP_CODE) AS anchoPointState, " + + "src.STLC AS stlc, " + + "src.STCD AS stcd, " + + "src.STNM AS stnm, " + + "src.BOX AS box, " + + "src.RSTCD AS rstcd, " + + "src.ENNM AS ennm, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ORDER_INDEX AS orderIndex, " + + "src.LGTD AS lgtd, " + + "src.LTTD AS lttd " + + "FROM V_MS_STBPRP_T src " + + "WHERE 1=1 " + + "AND NVL(src.IS_DELETED, 0) = 0"; + } + + private String buildImeVmsstbprptSelectSql(List selectFields) { + Map columns = imeVmsstbprptFieldColumns(); + List selected = new ArrayList<>(); + if (CollUtil.isEmpty(selectFields)) { + selected.add("t.*"); + } else { + for (String field : selectFields) { + String column = columns.get(field); + if (StrUtil.isNotBlank(column)) { + selected.add(column); + } + } + } + if (selected.isEmpty()) { + selected.add("t.sttpCode AS sttpCode"); + selected.add("t.stnm AS stnm"); + selected.add("t.stcd AS stcd"); + } + return String.join(", ", selected); + } + + private Map imeVmsstbprptFieldColumns() { + Map columns = new LinkedHashMap<>(); + columns.put("id", "t.id AS id"); + columns.put("sttpCode", "t.sttpCode AS sttpCode"); + columns.put("sttp", "t.sttp AS sttp"); + columns.put("stcd", "t.stcd AS stcd"); + columns.put("stnm", "t.stnm AS stnm"); + columns.put("rstcd", "t.rstcd AS rstcd"); + columns.put("ennm", "t.ennm AS ennm"); + columns.put("baseId", "t.baseId AS baseId"); + columns.put("hbrvcd", "t.hbrvcd AS hbrvcd"); + columns.put("rvcd", "t.rvcd AS rvcd"); + columns.put("orderIndex", "t.orderIndex AS orderIndex"); + columns.put("lgtd", "t.lgtd AS lgtd"); + columns.put("lttd", "t.lttd AS lttd"); + return columns; + } + + private String buildImeVmsstbprptFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildImeVmsstbprptLeafCondition(filter, paramMap, indexHolder); + } + if (CollUtil.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildImeVmsstbprptFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildImeVmsstbprptLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapImeVmsstbprptColumn(filter.getField()); + if (StrUtil.isBlank(column)) { + return ""; + } + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("isempty".equals(operator)) { + return "(" + column + " IS NULL OR " + column + " = '')"; + } + if ("isnotempty".equals(operator)) { + return "(" + column + " IS NOT NULL AND " + column + " <> '')"; + } + if ("in".equals(operator) || "ni".equals(operator)) { + List values = normalizeImeVmsstbprptValues(filter.getValue()); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object value : values) { + if (value == null || StrUtil.isBlank(String.valueOf(value).trim())) { + continue; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + paramMap.put(key, String.valueOf(value).trim()); + placeholders.add("#{map." + key + "}"); + } + if (placeholders.isEmpty()) { + return ""; + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + Object rawValue = filter.getValue(); + if (rawValue == null || StrUtil.isBlank(String.valueOf(rawValue).trim())) { + return ""; + } + String key = "imeVmsstbprptP" + indexHolder[0]++; + String text = String.valueOf(rawValue).trim(); + return switch (operator) { + case "eq" -> { + paramMap.put(key, text); + yield column + " = #{map." + key + "}"; + } + case "neq" -> { + paramMap.put(key, text); + yield column + " <> #{map." + key + "}"; + } + case "gt" -> { + paramMap.put(key, text); + yield column + " > #{map." + key + "}"; + } + case "gte" -> { + paramMap.put(key, text); + yield column + " >= #{map." + key + "}"; + } + case "lt" -> { + paramMap.put(key, text); + yield column + " < #{map." + key + "}"; + } + case "lte" -> { + paramMap.put(key, text); + yield column + " <= #{map." + key + "}"; + } + case "contains" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " LIKE #{map." + key + "}"; + } + case "doesnotcontain" -> { + paramMap.put(key, "%" + text + "%"); + yield column + " NOT LIKE #{map." + key + "}"; + } + default -> ""; + }; + } + + private String mapImeVmsstbprptColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "id" -> "t.id"; + case "sttpCode" -> "t.sttpCode"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "rstcd" -> "t.rstcd"; + case "ennm" -> "t.ennm"; + case "baseId" -> "t.baseId"; + case "hbrvcd" -> "t.hbrvcd"; + case "fhstcd" -> "t.fhstcd"; + case "rvcd" -> "t.rvcd"; + case "orderIndex" -> "t.orderIndex"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } + + private String buildImeVmsstbprptOrderBySql(List sorts) { + if (CollUtil.isEmpty(sorts)) { + return ""; + } + List orderByParts = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapImeVmsstbprptColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderByParts.add(column + " " + direction + " NULLS LAST"); + } + if (orderByParts.isEmpty()) { + return ""; + } + return " ORDER BY " + String.join(", ", orderByParts); + } + + private List normalizeImeVmsstbprptValues(Object value) { + List values = new ArrayList<>(); + appendImeVmsstbprptValues(values, value); + return values; + } + + private void appendImeVmsstbprptValues(List values, Object value) { + if (value == null) { + return; + } + if (value instanceof Iterable> iterable) { + for (Object item : iterable) { + appendImeVmsstbprptValues(values, item); + } + return; + } + if (value.getClass().isArray()) { + Object[] array = (Object[]) value; + for (Object item : array) { + appendImeVmsstbprptValues(values, item); + } + return; + } + values.add(value); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index a49616a6..65399238 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -625,19 +625,19 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.STNM AS stnm, " + "src.MNTP AS mntp, " + "src.STTP AS sttpCode, " + - "sttp.STTP_NAME AS sttpName, " + - "sttp.FULL_PATH AS sttpFullPath, " + + "src.STTP_NAME AS sttpName, " + + "src.STTP_FULL_PATH AS sttpFullPath, " + "src.RSTCD AS rstcd, " + - "eng.ENNM AS ennm, " + + "src.ENNM AS ennm, " + "src.FHSTCD AS fhstcd, " + - "fh.STNM AS fhstnm, " + - "src.CSTCD AS stCode, " + - "cst.STNM AS stName, " + - "NVL(eng.BASE_ID, src.BASE_ID) AS baseId, " + - "hb.BASENAME AS baseName, " + - "NVL(eng.HBRVCD, src.HBRVCD) AS hbrvcd, " + - "NVL(eng.RVCD, src.RVCD) AS rvcd, " + - "NVL(eng.ADDVCD, src.ADDVCD) AS addvcd, " + + "src.FHSTNM AS fhstnm, " + + "src.STCODE AS stCode, " + + "src.STNAME AS stName, " + + "src.BASE_ID AS baseId, " + + "src.BASE_NAME AS baseName, " + + "src.HBRVCD AS hbrvcd, " + + "src.RVCD AS rvcd, " + + "src.ADDVCD AS addvcd, " + "src.STLC AS stlc, " + "src.LGTD AS lgtd, " + "src.LTTD AS lttd, " + @@ -656,20 +656,12 @@ public class VdMonitorServiceImpl implements VdMonitorService { "src.VLSR AS vlsr, " + "src.VLSR_TM AS vlsrTm, " + "src.URL AS url, " + - "CASE WHEN src.URL IS NULL THEN NULL WHEN INSTR(src.URL, 'm3u8') > 0 THEN 1 ELSE 0 END AS playWay, " + - "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " + - "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " + - "NVL(src.ORDER_INDEX, 999999) AS siteStepSort, " + + "src.PLAYWAY AS playWay, " + + "NVL(src.BASESTEPSORT, 999999) AS baseStepSort, " + + "NVL(src.RSTCDSTEPSORT, 999999) AS rstcdStepSort, " + + "NVL(src.SITESTEPSORT, 999999) AS siteStepSort, " + "src.SOURCE_TABLE AS sourceTable " + - "FROM (" + - buildVdDeviceBaseSql() + - ") src " + - "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = src.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eng.BASE_ID, src.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " + - "LEFT JOIN SD_FHBT_B_H fh ON fh.STCD = src.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0 " + - "LEFT JOIN (" + buildStationBaseSql() + ") cst ON cst.STCD = src.CSTCD " + - "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = src.STTP " + - " AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 "; + "FROM V_MS_STBPRP_T src "; } private String buildVdTreeCoreSql() { @@ -716,26 +708,32 @@ public class VdMonitorServiceImpl implements VdMonitorService { "WHERE base.STTP LIKE 'VD_%' "; } + + private String buildVdDeviceBaseSql() { - return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + - " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + - " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + - " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + - " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + - " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + - " 'SD_VDINFO_B' AS SOURCE_TABLE " + - "FROM SD_VDINFO_B vd WHERE 1=1 " + -// " AND vd.STTP = 'VD_FP' "+ - "UNION ALL " + - "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + - " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + - " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + - " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + - " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + - " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + - " 'SD_SONAR_B_H' AS SOURCE_TABLE " + - "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; + return "SELECT * FROM V_MS_STBPRP_T"; } +// +// private String buildVdDeviceBaseSql() { +// return "SELECT vd.STCD, vd.STNM, vd.MNTP, vd.STTP, vd.LGTD, vd.LTTD, vd.ELEV, vd.STLC, " + +// " vd.JCDT, vd.WDDT, vd.BLDSTT_CODE, vd.USFL, vd.DTIN, vd.STINDX, vd.RSTCD, vd.BASE_ID, " + +// " vd.HBRVCD, vd.RVCD, vd.ADDVCD, vd.CSTCD, vd.FHSTCD, CAST(NULL AS VARCHAR2(3000)) AS INTRODUCE, " + +// " CAST(NULL AS VARCHAR2(255)) AS LOGO, CAST(NULL AS VARCHAR2(1000)) AS INFFILE, " + +// " vd.DTFRQCY, vd.REMARK, vd.VLSR, vd.VLSR_TM, vd.URL AS URL, vd.DEVICE_SERIAL, vd.ACCESS_WAY, " + +// " vd.PROTOCOL, vd.QUALITY, vd.CONTROL_MODE, CAST(NULL AS NUMBER(8,0)) AS ORDER_INDEX, " + +// " 'SD_VDINFO_B' AS SOURCE_TABLE " + +// "FROM SD_VDINFO_B vd WHERE 1=1 " + +//// " AND vd.STTP = 'VD_FP' "+ +// "UNION ALL " + +// "SELECT sonar.STCD, sonar.STNM, sonar.MNTP, sonar.STTP, sonar.LGTD, sonar.LTTD, sonar.ELEV, sonar.STLC, " + +// " sonar.JCDT, sonar.WDDT, sonar.BLDSTT_CODE, sonar.USFL, sonar.DTIN, sonar.STINDX, sonar.RSTCD, sonar.BASE_ID, " + +// " sonar.HBRVCD, sonar.RVCD, sonar.ADDVCD, CAST(NULL AS VARCHAR2(36)) AS CSTCD, CAST(NULL AS VARCHAR2(36)) AS FHSTCD, " + +// " sonar.INTRODUCE, sonar.LOGO, sonar.INFFILE, sonar.DTFRQCY, sonar.REMARK, sonar.VLSR, sonar.VLSR_TM, CAST(NULL AS VARCHAR2(512)) AS URL, " + +// " CAST(NULL AS VARCHAR2(255)) AS DEVICE_SERIAL, CAST(NULL AS VARCHAR2(10)) AS ACCESS_WAY, " + +// " CAST(NULL AS VARCHAR2(50)) AS PROTOCOL, CAST(NULL AS VARCHAR2(50)) AS QUALITY, CAST(NULL AS VARCHAR2(2048)) AS CONTROL_MODE, sonar.ORDER_INDEX, " + +// " 'SD_SONAR_B_H' AS SOURCE_TABLE " + +// "FROM SD_SONAR_B_H sonar WHERE NVL(sonar.IS_DELETED, 0) = 0 AND sonar.STTP IN ('VD_WVD', 'VD_SN') "; +// } private String buildVdPointCoreSql() { return "SELECT " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java index ebb0f33c..e3fbe51a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java @@ -2,15 +2,15 @@ package com.yfd.platform.qgc_env.warn.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/warn") @@ -80,4 +80,11 @@ public class WarnDataController { public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest)); } + + @PostMapping("/receiveAiData") + @Operation(summary = "接收AI数据") + public ResponseResult receiveAiData(@RequestBody List aoList) { + warnDataService.receiveAiData(aoList); + return ResponseResult.success(); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java new file mode 100644 index 00000000..83a9091a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiDataAo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +/** + * AI识别数据(AI设备上抛识别的 aidata 载荷) + */ +@Data +@Schema(description = "AI识别数据") +public class AiDataAo { + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Schema(description = "识别时间") + private Date time; + + @Schema(description = "漂浮物面积(平方米)") + private BigDecimal area; + + @Schema(description = "视频流量") + private BigDecimal flow; + + @Schema(description = "水位") + private BigDecimal water_level; + + @Schema(description = "断面流速分布") + private Map flow_info; + + /** + * 公共识别数据字段:各类型通用取数,写入 SD_AICOM_R.AI_VAL + */ + @Schema(description = "公共识别数据(各类型通用,写入AI_VAL)") + private String value; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java new file mode 100644 index 00000000..320f5717 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/AiFlowAo.java @@ -0,0 +1,17 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "AI视频流量数据") +public class AiFlowAo { + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "面积") + private BigDecimal area; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java new file mode 100644 index 00000000..a968764f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/ao/ReceiveAiDataAo.java @@ -0,0 +1,39 @@ +package com.yfd.platform.qgc_env.warn.entity.ao; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 接收AI数据入参 + */ +@Data +@Schema(description = "接收AI数据入参") +public class ReceiveAiDataAo { + + @Schema(description = "设备编号") + private String dvcd; + + @Schema(description = "事件类型:0000=心跳 5001=漂浮物 5011=漂浮物清理 5021=视频流量 AI_RIV=河道识别 AI_FISHING=捕鱼识别") + private String type; + + @Schema(description = "AI识别数据") + private AiDataAo aidata; + + @Schema(description = "文件id,多个逗号分隔") + private String files; + + @Schema(description = "AI识别发生时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date aitime; + + @Schema(description = "状态") + private Boolean status; + + @Schema(description = "消息") + private String message; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java index 66f942ff..bf673ced 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.warn.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo; @@ -35,4 +36,11 @@ public interface WarnDataService { DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest); + + /** + * 接收AI设备上抛的识别数据,合并写入 SD_AICOM_R / SD_AIHEARTBEAT_R + * + * @param aoList AI数据列表 + */ + void receiveAiData(List aoList); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java index cd11a195..583515f6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java @@ -11,6 +11,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.warn.entity.ao.ReceiveAiDataAo; import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo; import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo; @@ -22,9 +24,12 @@ import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo; import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo; import com.yfd.platform.qgc_env.warn.service.WarnDataService; import com.yfd.platform.utils.QgcQueryWrapperUtil; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; import org.springframework.cache.annotation.Cacheable; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; @@ -43,6 +48,9 @@ public class WarnDataServiceImpl implements WarnDataService { @Resource private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Resource + private JdbcTemplate jdbcTemplate; + @Override public DataSourceResult getEngWarnCount(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); @@ -2586,4 +2594,123 @@ public class WarnDataServiceImpl implements WarnDataService { default -> null; }; } + + // ==================== 接收AI数据(SD_AICOM_R / SD_AIHEARTBEAT_R) ==================== + + @Override + @Transactional(rollbackFor = Exception.class) + public void receiveAiData(List aoList) { + if (CollUtil.isEmpty(aoList)) { + throw new BizException("数据不能为空"); + } + List aicomRows = new ArrayList<>(); + List heartbeatRows = new ArrayList<>(); + for (ReceiveAiDataAo ao : aoList) { + if (ao == null) { + continue; + } + if (StrUtil.isBlank(ao.getDvcd())) { + throw new BizException("站码不能为空"); + } + if (StrUtil.isBlank(ao.getType())) { + throw new BizException("AI数据类型不能为空"); + } + if (ao.getAitime() == null) { + throw new BizException("AI数据发生时间不能为空"); + } + String stcd = ao.getDvcd().trim(); + String tm = DateUtil.formatDateTime(ao.getAitime()); +// String remarkJson = JSONUtil.toJsonStr(ao.getAidata()); + switch (ao.getType()) { + case "0000": + // ai心跳数据 + heartbeatRows.add(new Object[]{stcd, tm, ao.getFiles()}); + break; + case "5001": + // 漂浮物识别 + if (ao.getAidata() == null || ao.getAidata().getArea() == null) { + throw new BizException("漂浮物面积不能为空"); + } + aicomRows.add(new Object[]{ + stcd, tm, "AI_5001", + ao.getAidata().getArea().toPlainString(), + ao.getFiles() + }); + break; + case "5011": + // 漂浮物清理 + aicomRows.add(new Object[]{stcd, tm, "AI_5011", null, ao.getFiles()}); + break; + case "5021": + // 视频流量 + aicomRows.add(new Object[]{ + stcd, tm, "AI_5014", + ao.getAidata() != null && ao.getAidata().getFlow() != null + ? ao.getAidata().getFlow().toPlainString() : null, + ao.getFiles() + }); + break; + case "AI_RIV": + case "AI_FISHING": + // 新增类型:AI_VAL 取自 aidata 公共识别字段 value + aicomRows.add(new Object[]{ + stcd, tm, ao.getType(), + ao.getAidata() != null ? ao.getAidata().getValue() : null, + ao.getFiles() + }); + break; + default: + throw new BizException("未知的AI数据类型"); + } + } + if (!aicomRows.isEmpty()) { + mergeAiCom(aicomRows); + } + if (!heartbeatRows.isEmpty()) { + mergeAiHeartbeat(heartbeatRows); + } + } + + private void mergeAiCom(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AICOM_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ") + .append("? AS TYPE, ? AS AI_VAL, ? AS FID AS REMARK FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM AND target.TYPE = source.TYPE) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, TYPE, AI_VAL, FID, REMARK, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.TYPE, source.AI_VAL, source.FID, source.REMARK, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET ") + .append("target.AI_VAL = source.AI_VAL, ") + .append("target.FID = source.FID, ") + .append("target.REMARK = source.REMARK, ") + .append("target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } + + private void mergeAiHeartbeat(List rows) { + StringBuilder sql = new StringBuilder("MERGE INTO SD_AIHEARTBEAT_R target USING ("); + for (int i = 0; i < rows.size(); i++) { + if (i > 0) { + sql.append(" UNION ALL "); + } + sql.append("SELECT ? AS STCD, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AS TM, ? AS FID FROM DUAL"); + } + sql.append(") source ON (target.STCD = source.STCD AND target.TM = source.TM) ") + .append("WHEN NOT MATCHED THEN INSERT (STCD, TM, FID, RECORD_TIME, IS_DELETED) ") + .append("VALUES (source.STCD, source.TM, source.FID, SYSDATE, 0) ") + .append("WHEN MATCHED THEN UPDATE SET target.FID = source.FID, target.MODIFY_TIME = SYSDATE"); + List params = new ArrayList<>(); + for (Object[] row : rows) { + params.addAll(Arrays.asList(row)); + } + jdbcTemplate.update(sql.toString(), params.toArray()); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java index 713303a5..1ff89e86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java @@ -1089,6 +1089,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("T.CYANO AS cyano, ") .append("T.WQGRD AS wqgrd, ") .append("T.WWQTG AS wwqtg, ") + .append("CASE T.WWQTG " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WWQTG_NAME,") + .append("CASE T.WQGRD " + + " WHEN '1' THEN 'Ⅰ' " + + " WHEN '2' THEN 'Ⅱ' " + + " WHEN '3' THEN 'Ⅲ' " + + " WHEN '4' THEN 'Ⅳ' " + + " WHEN '5' THEN 'Ⅴ' " + + " WHEN '6' THEN 'V' " + + " ELSE '未知' " + + "END AS WQGRD_NAME,") .append("T.SFDB AS sfdb, ") .append("T.WQ_SFDBHN_YS AS wqSfdbhnYs, ") .append("T.BASE_ID AS baseId, ") @@ -1917,7 +1935,8 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { case "stcd" -> "T.STCD"; case "tm" -> "T.TM"; case "wqgrd" -> "T.WQGRD"; - case "wqgrdName" -> "T.WQGRD_NAME"; + case "wqgrdName" -> "WQGRD_NAME"; + case "wwqtgName" -> "WWQTG_NAME"; case "ph" -> "T.PH"; case "dox" -> "T.DOX"; case "codmn" -> "T.CODMN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java index 65bf1e58..b44b740a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java @@ -200,6 +200,12 @@ public class SdWTMonitorController { return ResponseResult.successData(sdWtMonitorService.getVmsstbprptList(dataSourceRequest)); } + @PostMapping("/base/vmsstbprpt/GetKendoList") + @Operation(summary = "根据条件查询基础站点列表(关联水温电站关系表)") + public ResponseResult getBaseVmsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getBaseVmsstbprptList(dataSourceRequest)); + } + @PostMapping("/msstbprpt/GetKendoList") @Operation(summary = "根据条件查询水温基础站点列表") public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java new file mode 100644 index 00000000..d2c2bb79 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtEngRelBaseInfoVo.java @@ -0,0 +1,140 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 电站出入库水温站码基础信息(电站 SD_ENGINFO_B_H 为主表,关联水温站与水温电站关系表) + * + * @author + */ +@Data +@Schema(description = "电站出入库水温站码基础信息") +public class WtEngRelBaseInfoVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "电站编码") + private String stcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站名称") + private String stnm; + + @Schema(description = "站类编码") + private String sttpCode; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "所属基地名称") + private String baseName; + + @Schema(description = "所属基地河段编码") + private String hbrvcd; + + @Schema(description = "所属基地河段名称") + private String hbrvcdName; + + @Schema(description = "所属流域代码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属行政区编码") + private String addvcd; + + @Schema(description = "所属行政区名称") + private String addvnm; + + @Schema(description = "所属公司编码") + private String hycd; + + @Schema(description = "所属公司名称") + private String hynm; + + @Schema(description = "所属集团编码") + private String topHycd; + + @Schema(description = "所属集团名称") + private String topHynm; + + @Schema(description = "位置经度") + private BigDecimal lgtd; + + @Schema(description = "位置纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal elev; + + @Schema(description = "站址") + private String stlc; + + @Schema(description = "是否启用") + private Integer usfl; + + @Schema(description = "水能利用数据是否接入") + private Integer dtin; + + @Schema(description = "数据接入时间") + private Date dtinTm; + + @Schema(description = "建设状态分类") + private Integer bldsttCcode; + + @Schema(description = "建设状态分类") + private Integer bldsttCode; + + @Schema(description = "建设状态名称") + private String bldsttCcodeName; + + @Schema(description = "规划设计日期") + private Date stdsdt; + + @Schema(description = "计划开工日期") + private Date pststdt; + + @Schema(description = "计划完工日期") + private Date pesstdt; + + @Schema(description = "开工日期") + private Date swdt; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "退役/拆除日期") + private Date wddt; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "电站简介") + private String introduce; + + @Schema(description = "电站LOGO") + private String logo; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "入库水温站码") + private String engIwtCode; + + @Schema(description = "入库水温名称") + private String engIwtName; + + @Schema(description = "下泄水温站码") + private String engDwtCode; + + @Schema(description = "下泄水温名称") + private String engDwtName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java index badd4c3f..b8d3f128 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java @@ -14,6 +14,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; +import com.yfd.platform.qgc_env.wt.entity.vo.WtEngRelBaseInfoVo; import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; @@ -73,4 +74,9 @@ public interface SdWtMonitorService { * 获取监测点水温变化数据(当前时段 + 去年同期对比) */ DataSourceResult getWtRV(DataSourceRequest dataSourceRequest); + + /** + * 根据条件查询基础站点列表(关联水温电站关系表) + */ + DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index 687b983b..35c9fe6e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -922,6 +922,42 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return result; } + @Override + public DataSourceResult getBaseVmsstbprptList(DataSourceRequest dataSourceRequest) { + // 电站表 SD_ENGINFO_B_H 作为主表,其它表均为 LEFT JOIN: + // SD_ENGINFO_B_H eng + // LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD + // LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD + // 同一电站(rstcd 相同)的多条水温站记录会展开成多行,故按 eng.STCD 分组, + // 把该电站的 engIwtCode/engDwtCode 用 MAX 聚合合并为一行(该电站的出入库水温站码); + // 本接口不关联温度实时表、不查询温度数据。filter.stcd 语义为电站编码。 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + + String selectSql = buildVmsstbprptRelSelectSql(dataSourceRequest.getSelect()); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ").append(selectSql).append(" ") + .append(buildVmsstbprptRelFromSql()); + + Map paramMap = new HashMap<>(); + appendVmsstbprptRelFilters(sql, paramMap, dataSourceRequest.getFilter()); + + String orderSql = buildVmsstbprptOrderBySql(dataSourceRequest.getSort()); + if (StrUtil.isBlank(orderSql)) { + orderSql = " ORDER BY MAX(eng.ORDER_INDEX) NULLS LAST, MAX(eng.STCD) NULLS LAST "; + } + sql.append("GROUP BY eng.STCD ").append(orderSql); + + Page> page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtEngRelBaseInfoVo.class); + + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + @Override public DataSourceResult getWtrvAmendDayList(DataSourceRequest dataSourceRequest) { List selectFields = dataSourceRequest == null ? null : dataSourceRequest.getSelect(); @@ -2523,6 +2559,152 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } } + private String buildVmsstbprptRelSelectSql(List selectFields) { + Map columnMap = buildVmsstbprptRelColumnMap(); + + List actualColumns = new ArrayList<>(); + if (selectFields != null && !selectFields.isEmpty()) { + for (String field : selectFields) { + String column = columnMap.get(field); + if (StrUtil.isNotBlank(column)) { + actualColumns.add(column); + } + } + } + if (actualColumns.isEmpty()) { + actualColumns.addAll(columnMap.values()); + } + // 外层已按 eng.STCD 分组,每个 select 项统一包成 MAX(...) AS 别名 + return actualColumns.stream().map(this::aggregateVmsstbprptColumn).collect(Collectors.joining(", ")); + } + + private String aggregateVmsstbprptColumn(String expressionWithAlias) { + int idx = expressionWithAlias.lastIndexOf(" AS "); + if (idx <= 0) { + return expressionWithAlias; + } + return "MAX(" + expressionWithAlias.substring(0, idx) + ") AS " + expressionWithAlias.substring(idx + 4); + } + + private String buildVmsstbprptRelFromSql() { + return "FROM SD_ENGINFO_B_H eng " + + "LEFT JOIN SD_WT_B_H wt ON wt.RSTCD = eng.STCD AND NVL(wt.IS_DELETED, 0) = 0 " + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0 " + + "WHERE NVL(eng.IS_DELETED, 0) = 0 "; + } + + private Map buildVmsstbprptRelColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // SD_ENGINFO_B_H 电站基础字段(电站为主表) + columnMap.put("stcd", "eng.STCD AS stcd"); + columnMap.put("ennm", "eng.ENNM AS ennm"); + columnMap.put("stnm", "eng.ENNM AS stnm"); + columnMap.put("sttpCode", "'ENG' AS sttpCode"); + columnMap.put("baseId", "eng.BASE_ID AS baseId"); + columnMap.put("baseName", "eng.BASE_NAME AS baseName"); + columnMap.put("hbrvcd", "eng.HBRVCD AS hbrvcd"); + columnMap.put("hbrvcdName", "eng.HBRVCD_NAME AS hbrvcdName"); + columnMap.put("rvcd", "eng.RVCD AS rvcd"); + columnMap.put("rvcdName", "eng.RVCD_NAME AS rvcdName"); + columnMap.put("addvcd", "eng.ADDVCD AS addvcd"); + columnMap.put("addvnm", "eng.ADDVCD_NAME AS addvnm"); + columnMap.put("hycd", "eng.HYCD AS hycd"); + columnMap.put("hynm", "eng.HYNM AS hynm"); + columnMap.put("topHycd", "eng.TOP_HYCD AS topHycd"); + columnMap.put("topHynm", "eng.TOP_HYNM AS topHynm"); + columnMap.put("lgtd", "eng.LGTD AS lgtd"); + columnMap.put("lttd", "eng.LTTD AS lttd"); + columnMap.put("elev", "eng.ELEV AS elev"); + columnMap.put("stlc", "eng.STLC AS stlc"); + columnMap.put("usfl", "eng.USFL AS usfl"); + columnMap.put("dtin", "eng.DTIN AS dtin"); + columnMap.put("dtinTm", "eng.DTIN_TM AS dtinTm"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE AS bldsttCcode"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE AS bldsttCode"); + columnMap.put("bldsttCcodeName", + "CASE WHEN eng.BLDSTT_CODE = 0 THEN '未建/规划' " + + "WHEN eng.BLDSTT_CODE = 1 THEN '在建' " + + "WHEN eng.BLDSTT_CODE = 2 THEN '已建' " + + "ELSE '未知' END AS bldsttCcodeName"); + columnMap.put("stdsdt", "eng.STDSDT AS stdsdt"); + columnMap.put("pststdt", "eng.PSTSTDT AS pststdt"); + columnMap.put("pesstdt", "eng.PESSTDT AS pesstdt"); + columnMap.put("swdt", "eng.SWDT AS swdt"); + columnMap.put("jcdt", "eng.JCDT AS jcdt"); + columnMap.put("wddt", "eng.WDDT AS wddt"); + columnMap.put("orderIndex", "eng.ORDER_INDEX AS orderIndex"); + columnMap.put("introduce", "eng.INTRODUCE AS introduce"); + columnMap.put("logo", "eng.LOGO AS logo"); + columnMap.put("inffile", "eng.INFFILE AS inffile"); + // SD_WTENGRLTN_B 出入库水温站码/名称:同 rstcd 多行按电站合并 + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE AS engIwtCode"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME AS engIwtName"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE AS engDwtCode"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME AS engDwtName"); + return columnMap; + } + + private void appendVmsstbprptRelFilters(StringBuilder sql, + Map paramMap, + DataSourceRequest.FilterDescriptor filter) { + Map filterColumnMap = buildVmsstbprptRelFilterColumnMap(); + List filters = new ArrayList<>(); + collectFilters(filter, filters); + for (DataSourceRequest.FilterDescriptor descriptor : filters) { + String field = descriptor.getField(); + String operator = descriptor.getOperator(); + Object value = descriptor.getValue(); + if (StrUtil.isBlank(field) || StrUtil.isBlank(operator)) { + continue; + } + String column = filterColumnMap.get(field); + if (StrUtil.isBlank(column)) { + continue; + } + String paramKey = "vmsstbprptRel_" + field + "_" + paramMap.size(); + appendWtMsstbprptLeaf(sql, paramMap, paramKey, column, operator, value); + } + } + + private Map buildVmsstbprptRelFilterColumnMap() { + Map columnMap = new LinkedHashMap<>(); + // 电站(SD_ENGINFO_B_H)为主表,主表自身字段的过滤条件直接作用到 eng 上 + columnMap.put("stcd", "eng.STCD"); + columnMap.put("rstcd", "eng.STCD"); + columnMap.put("stnm", "eng.ENNM"); + columnMap.put("ennm", "eng.ENNM"); + columnMap.put("baseId", "eng.BASE_ID"); + columnMap.put("baseName", "eng.BASE_NAME"); + columnMap.put("hbrvcd", "eng.HBRVCD"); + columnMap.put("usfl", "eng.USFL"); + columnMap.put("dtin", "eng.DTIN"); + columnMap.put("bldsttCode", "eng.BLDSTT_CODE"); + columnMap.put("bldsttCcode", "eng.BLDSTT_CODE"); + // 关联的水温站/关系表字段仍可按需过滤子表行 + columnMap.put("sttp", "wt.STTP"); + columnMap.put("sttpCode", "wt.STTP"); + columnMap.put("fhstcd", "wt.FHSTCD"); + columnMap.put("dmstcd", "wt.DMSTCD"); + columnMap.put("dtinType", "wt.DTIN_TYPE"); + columnMap.put("mway", "wt.MWAY"); + columnMap.put("wtDeviceType", "wt.WT_DEVICE_TYPE"); + columnMap.put("engIwtCode", "rel.ENG_IWT_CODE"); + columnMap.put("engIwtName", "rel.ENG_IWT_NAME"); + columnMap.put("engMwtCode", "rel.ENG_MWT_CODE"); + columnMap.put("engMwtName", "rel.ENG_MWT_NAME"); + columnMap.put("engRwtCode", "rel.ENG_RWT_CODE"); + columnMap.put("engRwtName", "rel.ENG_RWT_NAME"); + columnMap.put("engDwtCode", "rel.ENG_DWT_CODE"); + columnMap.put("engDwtName", "rel.ENG_DWT_NAME"); + columnMap.put("engLctn1Code", "rel.ENG_LCTN1_CODE"); + columnMap.put("engLctn1Name", "rel.ENG_LCTN1_NAME"); + columnMap.put("engLctn2Code", "rel.ENG_LCTN2_CODE"); + columnMap.put("engLctn2Name", "rel.ENG_LCTN2_NAME"); + columnMap.put("engLctn3Code", "rel.ENG_LCTN3_CODE"); + columnMap.put("engLctn3Name", "rel.ENG_LCTN3_NAME"); + return columnMap; + } + private void appendWtMsstbprptLeaf(StringBuilder sql, Map paramMap, String paramKey, diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java index fd5847af..223fdefd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/controller/WeFishController.java @@ -150,6 +150,36 @@ public class WeFishController { return ResponseResult.successData(weFishService.getQgcWeFishPoint(dataSourceRequest)); } + @PostMapping("/we/animalPoint/qgc/GetKendoListCust") + @Operation(summary = "野生动物分布锚点") + public ResponseResult getQgcWeAnimalPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalPoint(dataSourceRequest)); + } + + @PostMapping("/we/animalList/qgc/GetKendoListCust") + @Operation(summary = "野生动物监测-一级页面动物列表") + public ResponseResult getQgcWeAnimalList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnimalList(dataSourceRequest)); + } + + @PostMapping("/anml/dict/GetKendoListCust") + @Operation(summary = "动物识别监测-按动物ID查询动物字典信息(SD_ANIMALDICTORY_B)") + public ResponseResult getQgcWeAnmlDictByAnimalId(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlDictByAnimalId(dataSourceRequest)); + } + + @PostMapping("/anml/run/GetKendoListCust") + @Operation(summary = "动物识别监测-根据STCD+ANIMAL_ID+年份查询监测数据(SD_ANML_R)") + public ResponseResult getQgcWeAnmlRunList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeAnmlRunList(dataSourceRequest)); + } + + @PostMapping("/fp/ai/GetKendoListCust") + @Operation(summary = "全过程过鱼自动(AI设备)与人工监测数据查询(V_MS_STBPRP_T+SD_FPSSRL_AI_R)") + public ResponseResult getQgcFpAiQueryKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(weFishService.getQgcWeFpAiQueryKendoList(dataSourceRequest)); + } + @PostMapping("/we/point/qgc/GetKendoListCust") @Operation(summary = "环保部-水生生态调查-地图锚点") public ResponseResult getQgcWePoint(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java new file mode 100644 index 00000000..e04a4ce6 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalListQgcVo.java @@ -0,0 +1,59 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@Schema(description = "野生动物监测-一级页面动物列表") +public class WeAnimalListQgcVo { + + @Schema(description = "动物编码") + private String id; + + @Schema(description = "动物名称") + private String name; + + @Schema(description = "动物字典编码") + private String code; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "河流编码") + private String rvcd; + + @Schema(description = "河流名称") + private String rvcdName; + + @Schema(description = "流域编码") + private String hbrvcd; + + @Schema(description = "流域名称") + private String hbrvcdName; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "监测站点编码") + private String stcd; + + @Schema(description = "监测站点名称") + private String stnm; + + @Schema(description = "时间") + private String tm; + + @Schema(description = "年份") + private Integer yr; + + @Schema(description = "检测次数") + private Long acnt; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java new file mode 100644 index 00000000..b693135f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnimalPointQgcVo.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 野生动物监测-动物分布锚点 + */ +@Data +@Schema(description = "动物分布锚点") +public class WeAnimalPointQgcVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程(单位:m)") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地流域编码") + private String hbrvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "检测动物名称列表(按逗号分隔)") + private String animals; + + @Schema(description = "最新监测时间") + private String tm; + + @Schema(description = "地图避让") + private Integer distance; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java new file mode 100644 index 00000000..3f3e348b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlDictVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物字典信息(SD_ANIMALDICTORY_B)") +public class WeAnmlDictVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "编码") + private String code; + + @Schema(description = "名称") + private String name; + + @Schema(description = "英文名称") + private String nameEn; + + @Schema(description = "俗名") + private String alias; + + @Schema(description = "动物类群:1=哺乳 2=鸟类 3=两栖 4=爬行 5=节肢 6=其他") + private Integer category; + + @Schema(description = "生境类型:1=陆生 2=水生 3=两栖") + private Integer type; + + @Schema(description = "是否珍稀:0=否 1=是") + private Integer rare; + + @Schema(description = "物种来源:1=本土 2=外来") + private Integer specOrigin; + + @Schema(description = "保护级别") + private Integer ptype; + + @Schema(description = "保护/灭绝等级:1=极危 2=濒危 3=易危 4=近危 5=低危") + private Integer situation; + + @Schema(description = "主要生活环境") + private String habitat; + + @Schema(description = "门") + private String filum; + + @Schema(description = "纲") + private String classis; + + @Schema(description = "目") + private String orders; + + @Schema(description = "科") + private String family; + + @Schema(description = "属") + private String genus; + + @Schema(description = "种") + private String species; + + @Schema(description = "体型大小") + private String fsz; + + @Schema(description = "食性:1=肉食 2=草食 3=杂食") + private String feedingHabit; + + @Schema(description = "活动时律:1=昼行 2=夜行 3=晨昏") + private String activityTime; + + @Schema(description = "分布区域") + private String distribution; + + @Schema(description = "形态特征/识别特征") + private String symbol; + + @Schema(description = "栖息习性") + private String habitation; + + @Schema(description = "LOGO") + private String logo; + + @Schema(description = "介绍") + private String introduce; + + @Schema(description = "介绍弹窗图片") + private String inffile; + + @Schema(description = "附件") + private String fid; + + @Schema(description = "描述") + private String description; + + @Schema(description = "排序") + private Integer orderIndex; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java new file mode 100644 index 00000000..f82b777d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeAnmlRunVo.java @@ -0,0 +1,56 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "动物鸟类智能识别监测数据(SD_ANML_R)") +public class WeAnmlRunVo { + + @Schema(description = "主键") + private String id; + + @Schema(description = "监测站/设备编码: 关联SD_AIMONITOR_B_H.STCD") + private String stcd; + + @Schema(description = "监测站/设备名称: 关联SD_AIMONITOR_B_H.STNM") + private String stnm; + + @Schema(description = "动物ID: 关联SD_ANIMALDICTORY_B.ID") + private String animalId; + + @Schema(description = "动物名称") + private String animalName; + + @Schema(description = "动物编码") + private String animalCode; + + @Schema(description = "记录入库时间") + private Date tm; + + @Schema(description = "拍摄时间") + private Date shootTime; + + @Schema(description = "识别时间") + private Date recognizeTime; + + @Schema(description = "识别行为描述") + private String behavior; + + @Schema(description = "视频显示名称") + private String flnm; + + @Schema(description = "图片路径或者图片ID") + private String imgPath; + + @Schema(description = "视频路径或者视频ID") + private String flpth; + + @Schema(description = "附件ID") + private String fid; + + @Schema(description = "备注") + private String description; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java new file mode 100644 index 00000000..f8b14186 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeFpAiQueryVo.java @@ -0,0 +1,86 @@ +package com.yfd.platform.qgc_env.wte.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "全过程过鱼AI自动/人工监测合并查询数据(V_MS_STBPRP_T版)") +public class WeFpAiQueryVo { + + @Schema(description = "数据ID") + private String id; + @Schema(description = "过鱼年份") + private String yr; + @Schema(description = "过鱼设施编码") + private String stcd; + @Schema(description = "设施名称") + private String stnm; + @Schema(description = "基地编码") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "电站编码") + private String rstcd; + @Schema(description = "电站名称") + private String ennm; + @Schema(description = "基地流域编码") + private String hbrvcd; + @Schema(description = "基地排序") + private Integer baseStepSort; + @Schema(description = "流域排序") + private Integer rvcdStepSort; + @Schema(description = "站点排序") + private Integer siteStepSort; + @Schema(description = "电站排序") + private Integer rstcdStepSort; + @Schema(description = "时间") + private Date tm; + @Schema(description = "鱼类名称") + private String ftp; + @Schema(description = "鱼类编码") + private String fishId; + @Schema(description = "大小") + private String fsz; + @Schema(description = "长度") + private String length; + @Schema(description = "宽度") + private String width; + @Schema(description = "鱼速") + private String fishspeed; + @Schema(description = "游向") + private String direction; + @Schema(description = "游向中文") + private String directionName; + @Schema(description = "水温") + private String temperature; + private String waterlevel; + private String fishposition; + private String dox; + private String q; + private String tu; + @Schema(description = "流速") + private String speed; + @Schema(description = "通道") + private String channelno; + @Schema(description = "数量") + private String fcnt; + @Schema(description = "图片") + private String firstimgurl; + @Schema(description = "视频") + private String videourl; + @Schema(description = "监测方式") + private Integer mway; + @Schema(description = "人工开始时间") + private Date strdt; + @Schema(description = "人工结束时间") + private Date enddt; + @Schema(description = "站点分类编码") + private String stCode; + @Schema(description = "是否鱼苗") + private Integer isfs; + @Schema(description = "站点分类名称") + private String stName; + private String remark; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java index ac598f1f..a891b078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/entity/vo/WeVmsstbprptVo.java @@ -12,6 +12,9 @@ public class WeVmsstbprptVo { @Schema(description = "主键") private String id; + @Schema(description = "站类编码") + private String sttp; + @Schema(description = "站类编码") private String sttpCode; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java index eccab325..5acf4f7c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wte/service/WeFishService.java @@ -55,8 +55,27 @@ public interface WeFishService { DataSourceResult getQgcWePoint(DataSourceRequest dataSourceRequest); + DataSourceResult
+ * 动物字典信息表(陆生动物、鸟类等,用于动物监测数据中动物物种的标识) + *