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 11b80203..fc91476f 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -241,6 +241,14 @@ public class SwaggerConfig { .build(); } + @Bean + public GroupedOpenApi groupSysOqmgApi() { + return GroupedOpenApi.builder() + .group("5.2 倾斜摄影管理") + .packagesToScan("com.yfd.platform.qgc_sys.obliqueImage.controller") + .build(); + } + @Bean public GroupedOpenApi groupLygkApi() { return GroupedOpenApi.builder() diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java index 1770f06e..a34a36ae 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdEngInfoBH.java @@ -1,6 +1,7 @@ package com.yfd.platform.qgc_base.domain; import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -28,6 +29,7 @@ public class SdEngInfoBH implements Serializable { /** * 数据时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date tm; /** @@ -77,6 +79,7 @@ public class SdEngInfoBH implements Serializable { * 数据接入时间 */ @TableField("DTIN_TM") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date dtinTm; /** @@ -182,29 +185,34 @@ public class SdEngInfoBH implements Serializable { * 规划设计日期 */ @TableField("STDSDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date stdsdt; /** * 计划开工日期 */ @TableField("PSTSTDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pststdt; /** * 计划完工日期 */ @TableField("PESSTDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pesstdt; /** * 开工日期 */ @TableField("SWDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date swdt; /** * 建成日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("JCDT") private Date jcdt; @@ -212,12 +220,14 @@ public class SdEngInfoBH implements Serializable { * 退役/拆除日期 */ @TableField("WDDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date wddt; /** * 截流日期 */ @TableField("JLDT") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jldt; /** @@ -404,6 +414,7 @@ public class SdEngInfoBH implements Serializable { /** * 编制时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date edttm; /** @@ -856,16 +867,19 @@ public class SdEngInfoBH implements Serializable { /** * 蓄水验收日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date sswdt; /** * 一期下闸蓄水日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date piodt; /** * 二期下闸蓄水日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date aiodt; /** @@ -936,16 +950,19 @@ public class SdEngInfoBH implements Serializable { /** * 水土保持竣工验收时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date styphpsp; /** * 现行环境保护竣工验收时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date xsjdhbys; /** * 申报水土保持方案日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date sbfascrq; /** @@ -957,21 +974,25 @@ public class SdEngInfoBH implements Serializable { /** * 环境影响后评价时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date hpsprq; /** * 竣工环境保护验收时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jghbysrq; /** * 截流阶段环境保护验收时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jljdsbys; /** * 竣工水土保持方案验收时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date jgjdsbys; /** @@ -1218,6 +1239,7 @@ public class SdEngInfoBH implements Serializable { /** * 植被覆盖调查时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date vlsrTm; /** @@ -1228,6 +1250,7 @@ public class SdEngInfoBH implements Serializable { /** * 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date recordTime; /** @@ -1238,6 +1261,7 @@ public class SdEngInfoBH implements Serializable { /** * 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date modifyTime; /** @@ -1253,6 +1277,7 @@ public class SdEngInfoBH implements Serializable { /** * 删除时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date deleteTime; /** diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java index 133c13e1..6ea3a3e6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/controller/MsAlongBController.java @@ -10,6 +10,7 @@ import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.service.ISdHbrvDicService; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.qgc_lygk.along.domain.MsAlongB; +import com.yfd.platform.qgc_lygk.along.domain.PowerDto; import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService; import com.yfd.platform.qgc_sys.mapcfg.service.IMapmoduleBService; import com.yfd.platform.utils.DataSourceRequestUtil; @@ -90,4 +91,12 @@ public class MsAlongBController { public ResponseResult getWbsbList(@RequestParam String stcd) { return ResponseResult.successData(msAlongBService.getWbsbList(stcd)); } + + + @PostMapping("/noAuth/GetKendoPage") + @Operation(summary = "查询水电基地流域字典分页列表") + public ResponseResult getKendoPage(@RequestBody DataSourceRequest dataSourceRequest) { + DataSourceResult result = msAlongBService.getKendoPage(dataSourceRequest); + return ResponseResult.successData(result); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongB.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongB.java index b185e06a..8922b884 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongB.java @@ -84,4 +84,12 @@ public class MsAlongB implements Serializable { /** 排序 */ @TableField("ORDER_INDEX") private Integer orderIndex; + + /** 水电基地编码 */ + @TableField("BASEID") + private String baseId; + + /** 水电基地名称 */ + @TableField("BASENAME") + private String baseName; } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetB.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetB.java index adf07f7d..c18d2659 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetB.java @@ -82,4 +82,10 @@ public class MsAlongDetB implements Serializable { /** 删除时间 */ @TableField("DELETE_TIME") private Date deleteTime; + + + /** 出库入库标识 */ + @TableField("IO_DIRECTION") + private String ioDirection; + } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetTreeDto.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetTreeDto.java index faacbd8a..f6e3c37b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetTreeDto.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/MsAlongDetTreeDto.java @@ -14,5 +14,6 @@ public class MsAlongDetTreeDto { private String stnm; // 仅用于显示,不存表 private String rstcd; // 仅用于显示,不存表 private String parentId; // 前端用,不存表 + private String ioDirection; // 前端用,不存表 private List children; // 子节点 } diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/PowerDto.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/PowerDto.java index 5653482e..168e4fc7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/PowerDto.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/domain/PowerDto.java @@ -1,26 +1,191 @@ package com.yfd.platform.qgc_lygk.along.domain; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; import java.util.List; @Data +@TableName("V_MS_STBPRP_T") public class PowerDto { - // 水电水利工程编码 - private String stcd; - // 水电水利工程名称 - private String stnm; + // ==================== 基础编码与名称 ==================== + @TableField("STCD") + private String stcd; // 水电水利工程编码 - // 水电水利工程名称 - private String sttp; + @TableField("STNM") + private String stnm; // 水电水利工程名称(中文) - // 主表实体 - private String sttpCode; + @TableField("ENNM") + private String ennm; // 水电水利工程名称(英文/简称) - // 主表实体 - private String sttpName; + // ==================== 测站类型(STTP) ==================== + @TableField("STTP") + private String sttp; // 测站类型代码(如 WE、EQ_5) - // 主表实体 - private String rstcd; + @TableField("STTP_CODE") + private String sttpCode; // 测站类型编码(与 STTP 相同) + @TableField("STTP_NAME") + private String sttpName; // 测站类型名称(如 水生生态调查断面、基荷发电) + + @TableField("STTP_FULL_PATH") + private String sttpFullPath; // 测站类型完整路径(如 ENV,ENVM,WE,) + + @TableField("STTP_TREE_LEVEL") + private Integer sttpTreeLevel; // 测站类型树层级(如 3) + + // ==================== 关联上级 ==================== + @TableField("RSTCD") + private String rstcd; // 关联上级测站编码 + + // ==================== 流域信息(BASE) ==================== + @TableField("BASE_ID") + private String baseId; // 流域ID(如 02) + + @TableField("BASE_NAME") + private String baseName; // 流域名称(如 雅砻江干流) + + // ==================== 流域水系(HBRVCD) ==================== + @TableField("HBRVCD") + private String hbrvcd; // 流域水系编码 + + @TableField("HBRVCD_NAME") + private String hbrvcdName; // 流域水系名称 + + // ==================== 河流/流域(RVCD) ==================== + @TableField("RVCD") + private String rvcd; // 河流/流域编码(如 SJLY176) + + @TableField("RVCD_NAME") + private String rvcdName; // 河流/流域名称(如 雅砻江干流) + + // ==================== 行政区划(ADDVCD) ==================== + @TableField("ADDVCD") + private String addvcd; // 行政区划编码 + + @TableField("ADDVNM") + private String addvnm; // 行政区划名称 + + // ==================== 河流水系(HYCD) ==================== + @TableField("HYCD") + private String hycd; // 河流水系编码 + + @TableField("HYNM") + private String hynm; // 河流水系名称 + + @TableField("TOP_HYCD") + private String topHycd; // 顶级河流水系编码 + + @TableField("TOP_HYNM") + private String topHynm; // 顶级河流水系名称 + + // ==================== 地理坐标 ==================== + @TableField("LGTD") + private BigDecimal lgtd; // 经度(如 100.780252) + + @TableField("LTTD") + private BigDecimal lttd; // 纬度(如 30.26872) + + // ==================== 站点属性 ==================== + @TableField("STLC") + private String stlc; // 站点位置描述 + + @TableField("USFL") + private Integer usfl; // 是否启用(1启用 0禁用) + + @TableField("DTIN") + private String dtin; // 数据类型代码 + + @TableField("DTIN_TM") + private Date dtinTm; // 数据类型更新时间 + + @TableField("BLDSTT_CODE") + private String bldsttCode; // 建设状态代码 + + // ==================== 描述与附件 ==================== + @TableField("INTRODUCE") + private String introduce; // 介绍/描述 + + @TableField("LOGO") + private String logo; // LOGO 图片 + + @TableField("INFFILE") + private String inffile; // 附件文件 + + // ==================== 投资与建设 ==================== + @TableField("INV") + private String inv; // 投资方/投资信息 + + @TableField("INVINMN") + private String invinmn; // 投资单位/法人 + + @TableField("STDSDT") + private Date stdsdt; // 开工日期 + + @TableField("PSTSTDT") + private Date pststdt; // 计划竣工日期 + + @TableField("PESSTDT") + private Date pesstdt; // 实际竣工日期 + + // ==================== 水文参数 ==================== + @TableField("SWDT") + private String swdt; // 水文数据类型 + + @TableField("JCDT") + private String jcdt; // 监测数据类型 + + @TableField("WDDT") + private String wddt; // 温度数据类型 + + @TableField("ORDER_INDEX") + private Integer orderIndex; // 排序序号 + + @TableField("REMARK") + private String remark; // 备注 + + @TableField("VLSR") + private String vlsr; // 流速 + + @TableField("VLSR_TM") + private Date vlsrTm; // 流速时间 + + // ==================== 数据源与运行状态 ==================== + @TableField("DTIN_TYPE") + private String dtinType; // 数据类型分类 + + @TableField("MWAY") + private String mway; // 测量方式 + + @TableField("RUN_STATE") + private String runState; // 运行状态(如 1-运行中) + + // ==================== 审计字段(通用) ==================== + @TableField("RECORD_USER") + private String recordUser; // 创建人 + + @TableField("RECORD_TIME") + private Date recordTime; // 创建时间 + + @TableField("MODIFY_USER") + private String modifyUser; // 修改人 + + @TableField("MODIFY_TIME") + private Date modifyTime; // 修改时间 + + @TableField("IS_DELETED") + private Integer isDeleted; // 软删除(0未删 1已删) + + @TableField("DELETE_USER") + private String deleteUser; // 删除人 + + @TableField("DELETE_TIME") + private Date deleteTime; // 删除时间 + + // ==================== 数据来源 ==================== + @TableField("DATA_SOURCE") + private String dataSource; // 数据来源(如 SD_WE_B_H) } diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java index 731c1ea6..3847dfe2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/IMsAlongBService.java @@ -26,6 +26,8 @@ public interface IMsAlongBService extends IService { List getWbsbList(String stcd); + DataSourceResult getKendoPage(DataSourceRequest dataSourceRequest); + // /** // * 保存或更新沿程配置 // * diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java index 283d3dcc..a2cc47fc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongBServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_base.domain.SdRvcdDic; import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper; import com.yfd.platform.qgc_lygk.along.domain.MsAlongB; @@ -17,6 +18,9 @@ import com.yfd.platform.qgc_lygk.along.service.IMsAlongBService; import com.yfd.platform.utils.CodeToNameMetadataBo; import com.yfd.platform.utils.DataSourceRequestUtil; import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceRequest.FilterDescriptor; +import com.yfd.platform.common.DataSourceRequest.SortDescriptor; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -37,6 +41,9 @@ public class MsAlongBServiceImpl extends ServiceImpl i @Resource private SdRvcdDicMapper sdRvcdDicMapper; + @Resource + private MicroservicDynamicSQLMapper microservicDynamicSQLMapper; + @Override public DataSourceResult getKendoList(DataSourceRequest dataSourceRequest) { // 1. 构建查询条件 @@ -101,6 +108,136 @@ public class MsAlongBServiceImpl extends ServiceImpl i return powerDtos; } + @Override + public DataSourceResult getKendoPage(DataSourceRequest dataSourceRequest) { + // 1. 处理分页参数 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + + // 2. 构建基础 SQL + StringBuilder sql = new StringBuilder("SELECT * FROM V_MS_STBPRP_T WHERE 1=1"); + Map paramMap = new HashMap<>(); + + // 3. 解析过滤条件(利用你的 FilterDescriptor) + if (dataSourceRequest != null && dataSourceRequest.getFilter() != null) { + String filterSql = parseFilter(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + } + + // 4. 解析排序(利用你的 SortDescriptor) + if (dataSourceRequest != null && CollUtil.isNotEmpty(dataSourceRequest.getSort())) { + List orderList = new ArrayList<>(); + for (SortDescriptor sort : dataSourceRequest.getSort()) { + String field = sort.getField(); + if (StrUtil.isBlank(field) || !isSafeField(field)) continue; + String direction = "asc".equalsIgnoreCase(sort.getDir()) ? "ASC" : "DESC"; + orderList.add(field + " " + direction); + } + if (!orderList.isEmpty()) { + sql.append(" ORDER BY ").append(String.join(", ", orderList)); + } + } + + // 5. 执行分页查询 + Page page = loadOptions == null ? null : + QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, PowerDto.class + ); + + // 6. 封装返回结果 + DataSourceResult result = new DataSourceResult<>(); + result.setData(list); + result.setTotal(page != null ? page.getTotal() : list.size()); + result.setAggregates(new HashMap<>()); + return result; + } + + /** + * 递归解析 FilterDescriptor(完美适配你的内部类结构) + */ + /** + * 递归解析 FilterDescriptor + */ + /** + * 递归解析 FilterDescriptor(Oracle 兼容版) + */ + private String parseFilter(FilterDescriptor filter, Map paramMap, int[] paramIndex) { + if (filter == null) return ""; + + // 如果有嵌套条件(logic + filters) + List childFilters = filter.getFilters(); + if (CollUtil.isNotEmpty(childFilters)) { + List childConditions = new ArrayList<>(); + for (FilterDescriptor child : childFilters) { + String childSql = parseFilter(child, paramMap, paramIndex); + if (StrUtil.isNotBlank(childSql)) { + childConditions.add(childSql); + } + } + if (childConditions.isEmpty()) return ""; + + String logic = StrUtil.isNotBlank(filter.getLogic()) ? filter.getLogic() : "and"; + String connector = "and".equalsIgnoreCase(logic) ? " AND " : " OR "; + return "(" + String.join(connector, childConditions) + ")"; + } + + // 叶子节点:单个条件 + String field = filter.getField(); + Object value = filter.getValue(); + String operator = filter.getOperator(); + + if (StrUtil.isBlank(field) || value == null) return ""; + if (!isSafeField(field)) return ""; + + String paramKey = "p" + paramIndex[0]++; + paramMap.put(paramKey, value); + + // 根据操作符生成 SQL(Oracle 使用 || 拼接) + if ("eq".equalsIgnoreCase(operator)) { + return field + " = #{map." + paramKey + "}"; + } else if ("neq".equalsIgnoreCase(operator)) { + return field + " != #{map." + paramKey + "}"; + } else if ("contains".equalsIgnoreCase(operator)) { + // Oracle 用 || 替代 CONCAT + return field + " LIKE '%' || #{map." + paramKey + "} || '%'"; + } else if ("startswith".equalsIgnoreCase(operator)) { + return field + " LIKE #{map." + paramKey + "} || '%'"; + } else if ("endswith".equalsIgnoreCase(operator)) { + return field + " LIKE '%' || #{map." + paramKey + "}"; + } else if ("gt".equalsIgnoreCase(operator)) { + return field + " > #{map." + paramKey + "}"; + } else if ("gte".equalsIgnoreCase(operator)) { + return field + " >= #{map." + paramKey + "}"; + } else if ("lt".equalsIgnoreCase(operator)) { + return field + " < #{map." + paramKey + "}"; + } else if ("lte".equalsIgnoreCase(operator)) { + return field + " <= #{map." + paramKey + "}"; + } else if ("isnull".equalsIgnoreCase(operator)) { + paramMap.remove(paramKey); + return field + " IS NULL"; + } else if ("isnotnull".equalsIgnoreCase(operator)) { + paramMap.remove(paramKey); + return field + " IS NOT NULL"; + } + return ""; + } + + /** + * 安全字段白名单(根据你的视图字段调整) + */ + private boolean isSafeField(String field) { + if (StrUtil.isBlank(field)) return false; + // 支持视图中的常用字段 + Set validFields = new HashSet<>(Arrays.asList( + "STCD", "STNM", "ENNM", "BASE_ID", "BASE_NAME", "RVCD", "RVCD_NAME", + "ADDVCD", "ADDVNM", "HYCD", "HYNM", "STTP", "STTP_CODE", "STTP_NAME", + "LGTD", "LTTD", "ORDER_INDEX", "RUN_STATE" + )); + return validFields.contains(field.toUpperCase()); + } + // @Override // public boolean saveOrUpdate(MsAlongB msAlongB) { // super.saveOrUpdate(msAlongB); diff --git a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongDetBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongDetBServiceImpl.java index c4700493..a704d9a3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongDetBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_lygk/along/service/impl/MsAlongDetBServiceImpl.java @@ -149,6 +149,7 @@ public class MsAlongDetBServiceImpl extends ServiceImpl result = msObliqueImageBService.getKendoList(dataSourceRequest); + return ResponseResult.successData(result); + } + + + /** + * 新增或修改 + */ + @Operation(summary = "新增或修改") + @PostMapping("/addOrUpdate") + public ResponseResult addOrUpdate(@RequestBody MsObliqueImageB msObliqueImageB) { + msObliqueImageBService.addOrUpdate(msObliqueImageB); + return ResponseResult.success(); + } + + /** + * 删除 + */ + @Operation(summary = "删除") + @GetMapping("/delete") + public ResponseResult delete(@RequestParam("id") String id) { + if (StrUtil.isBlank(id)) { + throw new BizException("ID不能为空"); + } + msObliqueImageBService.delete(id); + return ResponseResult.success(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/domain/MsObliqueImageB.java b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/domain/MsObliqueImageB.java new file mode 100644 index 00000000..d3ea5efd --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/domain/MsObliqueImageB.java @@ -0,0 +1,151 @@ +package com.yfd.platform.qgc_sys.obliqueImage.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 io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 倾斜摄影管理实体类 + * + * @author migration + */ +@Data +@TableName("MS_OBL_PHOTO") +@Schema(description = "倾斜摄影管理实体类") +public class MsObliqueImageB implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 站码 */ + @TableField("STCD") + private String stcd; + + /** 站名 */ + @TableField("STNM") + private String stnm; + + /** 所属站类ID */ + @TableField("STTP") + private String sttp; + + /** 所属站类编码 */ + @TableField("STTP_CODE") + private String sttpCode; + + /** 所属站类名称 */ + @TableField("STTP_NAME") + private String sttpName; + + /** 所属站类全路径(非数据库字段) */ + @TableField(exist = false) + private String sttpFullPath; + + /** 所属站类层级(非数据库字段) */ + @TableField(exist = false) + private Integer sttpTreeLevel; + + /** 所属水电基地编码 */ + @TableField("BASE_ID") + private String baseId; + + /** 所属水电基地名称 */ + @TableField("BASE_NAME") + private String baseName; + + /** 所属流域编码 */ + @TableField("HBRVCD") + private String hbrvcd; + + /** 所属流域名称 */ + @TableField("HBRVCD_NAME") + private String hbrvcdName; + + /** 所属河段编码(非数据库字段,与HBRVCD同源) */ + @TableField(exist = false) + private String rvcd; + + /** 所属河段名称(非数据库字段,与HBRVCD_NAME同源) */ + @TableField(exist = false) + private String rvcdName; + + /** 在线地址 */ + @TableField("URL") + private String url; + + /** 所属电站编码 */ + @TableField("RSTCD") + private String rstcd; + + /** 所属电站名称 */ + @TableField("ENNM") + private String ennm; + + /** 电站经度(非数据库字段) */ + @TableField("LGTD") + private Double lgtd; + + /** 电站纬度(非数据库字段) */ + @TableField("LTTD") + private Double lttd; + + /** 电站坐标JSON串 */ + @TableField("LOCATION") + private String location; + + /** 模型精度 */ + @TableField("ACCURACY") + private Integer accuracy; + + /** 边界范围 */ + @TableField("BOUNDARY") + private String boundary; + + /** 自定义高程 */ + @TableField("HEIGHT") + private Integer height; + + /** 备注 */ + @TableField("COMMENTS") + private String comments; + + /** 创建人 */ + @TableField("RECORD_USER") + private String recordUser; + + /** 创建人名称(非数据库字段) */ + @TableField(exist = false) + private String recordUserName; + + /** 创建时间(非数据库字段) */ + @TableField(exist = false) + private Date recordTime; + + /** 更新人 */ + @TableField("MODIFY_USER") + private String modifyUser; + + /** 更新时间 */ + @TableField("MODIFY_TIME") + private Date modifyTime; + + /** 是否已删除:0=未删除 1=已删除 */ + @TableField("IS_DELETED") + private Integer isDeleted; + + /** 删除人 */ + @TableField("DELETE_USER") + private String deleteUser; + + /** 删除时间 */ + @TableField("DELETE_TIME") + private Date deleteTime; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/mapper/MsObliqueImageBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/mapper/MsObliqueImageBMapper.java new file mode 100644 index 00000000..7e527915 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/mapper/MsObliqueImageBMapper.java @@ -0,0 +1,24 @@ +package com.yfd.platform.qgc_sys.obliqueImage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_sys.obliqueImage.domain.MsObliqueImageB; +import org.apache.ibatis.annotations.Mapper; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 倾斜摄影管理 Mapper 接口 + * + * @author migration + */ +@Mapper +public interface MsObliqueImageBMapper extends BaseMapper { + + @Delete("DELETE FROM MS_OBL_PHOTO WHERE ID = #{id}") + void deleteById(@Param("id") String id); + + @Select("SELECT ID FROM SD_STTP_B WHERE STTP_CODE = 'OSGB'") + String getSttp(); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/IMsObliqueImageBService.java b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/IMsObliqueImageBService.java new file mode 100644 index 00000000..9f95d550 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/IMsObliqueImageBService.java @@ -0,0 +1,36 @@ +package com.yfd.platform.qgc_sys.obliqueImage.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_sys.obliqueImage.domain.MsObliqueImageB; + +/** + * 倾斜摄影管理 Service 接口 + * + * @author migration + */ +public interface IMsObliqueImageBService extends IService { + + /** + * 条件过滤数据列表(Kendo 数据源) + * + * @param dataSourceRequest 数据源请求 + * @return 数据源结果 + */ + DataSourceResult getKendoList(DataSourceRequest dataSourceRequest); + + /** + * 新增或修改 + * + * @param msObliqueImageB 倾斜摄影实体 + */ + void addOrUpdate(MsObliqueImageB msObliqueImageB); + + /** + * 删除 + * + * @param id 主键ID + */ + void delete(String id); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/impl/MsObliqueImageBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/impl/MsObliqueImageBServiceImpl.java new file mode 100644 index 00000000..a5686be2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/obliqueImage/service/impl/MsObliqueImageBServiceImpl.java @@ -0,0 +1,178 @@ +package com.yfd.platform.qgc_sys.obliqueImage.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceLoadOptionsBase; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_base.domain.SdEngInfoBH; +import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; +import com.yfd.platform.qgc_sys.obliqueImage.domain.MsObliqueImageB; +import com.yfd.platform.qgc_sys.obliqueImage.mapper.MsObliqueImageBMapper; +import com.yfd.platform.qgc_sys.obliqueImage.service.IMsObliqueImageBService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.QgcQueryWrapperUtil; +import com.yfd.platform.utils.QueryWrapperUtil; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import lombok.Data; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.List; + +/** + * 倾斜摄影管理 Service 实现类 + * + * @author migration + */ +@Service +public class MsObliqueImageBServiceImpl extends ServiceImpl implements IMsObliqueImageBService { + + @Resource + private MsObliqueImageBMapper msObliqueImageBMapper; + + @Resource + private ISdEngInfoBHService engInfoBHService; + + @Override + public DataSourceResult getKendoList(DataSourceRequest dataSourceRequest) { + // 1. 构建查询条件 + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + + QueryWrapper wrapper = DataSourceRequestUtil.buildQueryWrapper( + dataSourceRequest, MsObliqueImageB.class); + + // 固定条件:STTP_CODE = 'OSGB' AND IS_DELETED = 0 AND RSTCD IS NOT NULL + wrapper.eq("STTP_CODE", "OSGB"); + wrapper.eq("IS_DELETED", 0); + wrapper.isNotNull("RSTCD"); + + // 旧系统 rvcd 字段映射到 HBRVCD 列(前端传参保持 rvcd 不变) + if (loadOptions != null) { + String rvcd = QueryWrapperUtil.getFilterFieldValue(loadOptions, "rvcd"); + if (StrUtil.isNotBlank(rvcd)) { + wrapper.eq("HBRVCD", rvcd); + } + } + + // 默认按修改时间倒序 + wrapper.orderByDesc("MODIFY_TIME"); + + // 2. 分页参数处理 + Page page = loadOptions == null ? null + : (Page) QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + + // 3. 执行查询 + Page resultPage; + if (page != null) { + resultPage = this.page(page, wrapper); + } else { + List list = this.list(wrapper); + resultPage = new Page<>(); + resultPage.setRecords(list); + resultPage.setTotal(list.size()); + } + + // 4. 构建结果 + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setData(resultPage.getRecords()); + dataSourceResult.setTotal(resultPage.getTotal()); + return dataSourceResult; + } + + @Override + public void addOrUpdate(MsObliqueImageB msObliqueImageB) { + if (StrUtil.isNotBlank(msObliqueImageB.getRstcd())){ + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StrUtil.isNotBlank(msObliqueImageB.getRstcd()), SdEngInfoBH::getStcd, msObliqueImageB.getRstcd()) + .eq(SdEngInfoBH::getIsDeleted, 0) + .select(SdEngInfoBH::getLgtd, SdEngInfoBH::getLttd, SdEngInfoBH::getBaseId, SdEngInfoBH::getBaseName) + .orderByAsc(SdEngInfoBH::getBaseId, SdEngInfoBH::getOrderIndex); + SdEngInfoBH sdEngInfoBH = engInfoBHService.getOne(wrapper); + if (sdEngInfoBH.getLgtd() != null){ + msObliqueImageB.setLgtd(sdEngInfoBH.getLgtd()); + } + if (sdEngInfoBH.getLttd() != null){ + msObliqueImageB.setLttd(sdEngInfoBH.getLttd()); + } + if (StrUtil.isNotBlank(sdEngInfoBH.getBaseName())){ + msObliqueImageB.setBaseName(sdEngInfoBH.getBaseName()); + } + if (StrUtil.isNotBlank(sdEngInfoBH.getBaseId())){ + msObliqueImageB.setBaseId(sdEngInfoBH.getBaseId()); + } + + } + + if (StrUtil.isBlank(msObliqueImageB.getId())) { + addMsObliqueImageB(msObliqueImageB); + } else { + updateMsObliqueImageB(msObliqueImageB); + } + } + + @Override + public void delete(String id) { + msObliqueImageBMapper.deleteById(id); + } + + private void addMsObliqueImageB(MsObliqueImageB msObliqueImageB) { + // 查询新增的倾斜摄影是否已存在 + String rstcd = msObliqueImageB.getRstcd(); + if (StrUtil.isBlank(rstcd)) { + throw new BizException("电站不能为空"); + } + String id = "OSGB_" + rstcd; + MsObliqueImageB old = msObliqueImageBMapper.selectById(id); + if (old != null) { + throw new BizException("该电站已存在倾斜摄影"); + } + msObliqueImageB.setSttpCode("OSGB"); + msObliqueImageB.setSttpName("倾斜摄影"); + if (StrUtil.isBlank(msObliqueImageB.getRvcd())) { + msObliqueImageB.setRvcd(msObliqueImageB.getHbrvcd()); + } + if (StrUtil.isBlank(msObliqueImageB.getRvcdName())) { + msObliqueImageB.setRvcdName(msObliqueImageB.getHbrvcdName()); + } + msObliqueImageB.setStcd("OSGB_" + msObliqueImageB.getRstcd()); + msObliqueImageB.setId("OSGB_" + msObliqueImageB.getRstcd()); + msObliqueImageB.setSttpFullPath("OSGB,"); + msObliqueImageB.setSttpTreeLevel(1); + String sttp = msObliqueImageBMapper.getSttp(); + if (StrUtil.isBlank(sttp)) { + throw new BizException("倾斜摄影对应的sttp在SD_STTP_B中找不到"); + } + msObliqueImageB.setSttp(sttp); + // 设置通用字段 + String userId = currentUserIdOrSystem(); + msObliqueImageB.setRecordUser(userId); + Date now = new java.util.Date(); + msObliqueImageB.setModifyTime(now); + msObliqueImageB.setModifyUser(userId); + msObliqueImageB.setIsDeleted(0); + msObliqueImageBMapper.insert(msObliqueImageB); + } + + private void updateMsObliqueImageB(MsObliqueImageB msObliqueImageB) { + String userId = currentUserIdOrSystem(); + msObliqueImageB.setModifyUser(userId); + msObliqueImageB.setModifyTime(new java.util.Date()); + this.updateById(msObliqueImageB); + } + + private String currentUserIdOrSystem() { + try { + return SecurityUtils.getUserId(); + } catch (Exception ex) { + return "system"; + } + } +} \ No newline at end of file