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 c28488e1..13328298 100644
--- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java
+++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java
@@ -265,6 +265,24 @@ public class SwaggerConfig {
.build();
}
+ @Bean
+ public GroupedOpenApi groupWarnRuleApi() {
+ return GroupedOpenApi.builder()
+ .group("5.5 预警规则")
+ .packagesToScan("com.yfd.platform.qgc_sys.warnRule.controller")
+ .build();
+ }
+
+
+ @Bean
+ public GroupedOpenApi groupPsbmodulelbbApi() {
+ return GroupedOpenApi.builder()
+ .group("5.6 电站与布局组件配置管理")
+ .packagesToScan("com.yfd.platform.qgc_sys.psbmodulelbb.controller")
+ .build();
+ }
+
+
@Bean
public GroupedOpenApi groupLygkApi() {
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 0638da0f..69c6f0be 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
@@ -1,26 +1,36 @@
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.SdEngInfoBHOperateRequest;
import com.yfd.platform.qgc_base.domain.SdFishDictoryB;
import com.yfd.platform.qgc_base.service.ISdFishDictoryBService;
-import com.yfd.platform.utils.DataSourceRequestUtil;
+import com.yfd.platform.qgc_data.service.AttachmentUploadService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
/**
*
* 鱼类字典表 前端控制器
*
*/
+@Slf4j
@RestController
@RequestMapping("/env/fishDictory")
@Tag(name = "鱼类字典管理")
@@ -29,25 +39,23 @@ public class SdFishDictoryBController {
@Resource
private ISdFishDictoryBService sdFishDictoryBService;
+ @Resource
+ private ObjectMapper objectMapper;
+
+ @Resource
+ private AttachmentUploadService attachmentUploadService;
+
@PostMapping("/queryPageList")
@Operation(summary = "分页查询鱼类字典列表(支持动态过滤和排序)")
public ResponseResult queryPageList(@RequestBody DataSourceRequest request) {
- Page page = DataSourceRequestUtil.executeQuery(
- request,
- SdFishDictoryB.class,
- sdFishDictoryBService
- );
+ Page page = sdFishDictoryBService.queryPageList(request);
return ResponseResult.successData(page);
}
@PostMapping("/list")
@Operation(summary = "查询鱼类字典列表(支持动态过滤和排序,不分页)")
public ResponseResult list(@RequestBody DataSourceRequest request) {
- List list = DataSourceRequestUtil.executeList(
- request,
- SdFishDictoryB.class,
- sdFishDictoryBService
- );
+ List list = sdFishDictoryBService.list();
return ResponseResult.successData(list);
}
@@ -56,7 +64,8 @@ public class SdFishDictoryBController {
public ResponseResult listByName(@RequestParam(required = false) String name) {
return ResponseResult.successData(sdFishDictoryBService.list(
new LambdaQueryWrapper()
- .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name).select(SdFishDictoryB::getId, SdFishDictoryB::getName, SdFishDictoryB::getAlias)
+ .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name)
+ .select(SdFishDictoryB::getId, SdFishDictoryB::getName, SdFishDictoryB::getAlias)
));
}
@@ -69,24 +78,84 @@ public class SdFishDictoryBController {
@Log(module = "鱼类字典管理", value = "新增鱼类字典")
@PostMapping("/add")
@Operation(summary = "新增鱼类字典")
- public ResponseResult add(@RequestBody SdFishDictoryB fishDictoryB) {
- boolean result = sdFishDictoryBService.add(fishDictoryB);
- return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ public ResponseResult add(@RequestParam("data") String dataStr,
+ @RequestParam(value = "files", required = false) List files) {
+ try {
+ SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class);
+ SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null
+ : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class);
+ if (entity == null) {
+ return ResponseResult.error("数据不能为空");
+ }
+ entity.setId(IdUtil.simpleUUID());
+ entity.setCode(entity.getId());
+
+ // 上传文件并设置附件ID到实体
+ applyUploadedFiles(entity, files);
+
+ boolean result = sdFishDictoryBService.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(@RequestBody SdFishDictoryB fishDictoryB) {
- boolean result = sdFishDictoryBService.updateById(fishDictoryB);
- return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
+ public ResponseResult update(@RequestParam("data") String dataStr,
+ @RequestParam(value = "files", required = false) List files) {
+ try {
+ SdEngInfoBHOperateRequest request = objectMapper.readValue(dataStr, SdEngInfoBHOperateRequest.class);
+ SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null
+ : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class);
+ if (entity == null || entity.getId() == null) {
+ return ResponseResult.error("数据或ID不能为空");
+ }
+
+ // 获取修改前的实体,用于后续清理旧文件
+ SdFishDictoryB before = sdFishDictoryBService.getById(entity.getId());
+ List oldAttachmentIds = before != null ? collectAttachmentIds(before) : Collections.emptyList();
+
+ // 上传新文件并设置附件ID
+ applyUploadedFiles(entity, files);
+
+ boolean result = sdFishDictoryBService.update(entity, request.getSource());
+ if (result) {
+ // 清理被替换的旧文件
+ deleteReplacedFiles(oldAttachmentIds, collectAttachmentIds(entity));
+ }
+ 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(@RequestParam String id) {
- boolean result = sdFishDictoryBService.deleteById(id);
+ 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) {
+ SdFishDictoryB entity = sdFishDictoryBService.getById(id);
+ if (entity != null) {
+ allAttachmentIds.addAll(collectAttachmentIds(entity));
+ }
+ }
+
+ boolean result = sdFishDictoryBService.delete(ids, request.getSource());
+ if (result) {
+ // 删除关联的附件
+ deleteAttachments(allAttachmentIds);
+ }
return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
}
@@ -97,4 +166,67 @@ public class SdFishDictoryBController {
@RequestParam(required = false, defaultValue = "10") Integer limit) {
return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit));
}
-}
\ No newline at end of file
+
+ // ==================== 文件处理辅助方法 ====================
+
+ /**
+ * 上传文件并追加附件ID到inffile字段(与已有ID以逗号拼接)
+ */
+ private void applyUploadedFiles(SdFishDictoryB entity, List files) {
+ if (files == null || files.isEmpty()) {
+ return;
+ }
+ List attachmentIds = attachmentUploadService.uploadMultipartFiles(files);
+ if (attachmentIds.isEmpty()) {
+ return;
+ }
+ // 新上传的文件ID
+ String newIds = attachmentIds.stream()
+ .filter(StrUtil::isNotBlank)
+ .collect(Collectors.joining(","));
+ if (StrUtil.isBlank(newIds)) {
+ return;
+ }
+ // 追加到已有的inffile后面
+ String existing = StrUtil.isNotBlank(entity.getInffile()) ? entity.getInffile() : "";
+ String merged = StrUtil.isBlank(existing) ? newIds : existing + "," + newIds;
+ entity.setInffile(merged);
+ }
+
+ /**
+ * 收集实体中inffile字段的附件ID
+ */
+ private List collectAttachmentIds(SdFishDictoryB 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);
+ }
+ }
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssrlRController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssrlRController.java
new file mode 100644
index 00000000..ae195913
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssrlRController.java
@@ -0,0 +1,162 @@
+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.annotation.Log;
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest;
+import com.yfd.platform.qgc_base.domain.SdFpssrlR;
+import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest;
+import com.yfd.platform.qgc_base.service.ISdFpssrlRService;
+import com.yfd.platform.qgc_data.service.AttachmentUploadService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * 过鱼设施自动数据表(AI识别) 前端控制器
+ *
+ */
+@Slf4j
+@RestController
+@RequestMapping("/base/fpssrlR")
+@Tag(name = "过鱼设施自动数据管理")
+public class SdFpssrlRController {
+
+ @Resource
+ private ISdFpssrlRService sdFpssrlRService;
+
+ @Resource
+ private ObjectMapper objectMapper;
+
+ @Resource
+ private AttachmentUploadService attachmentUploadService;
+
+ // ==================== CRUD 方法 ====================
+
+ @PostMapping("/queryPageList")
+ @Operation(summary = "分页查询过鱼自动数据列表(支持动态过滤和排序)")
+ public ResponseResult queryPageList(@RequestBody DataSourceRequest request) {
+ Page page = sdFpssrlRService.queryPageList(request);
+ return ResponseResult.successData(page);
+ }
+
+ @GetMapping("/getById")
+ @Operation(summary = "根据ID查询过鱼自动数据")
+ public ResponseResult getById(@RequestParam String id) {
+ return ResponseResult.successData(sdFpssrlRService.getById(id));
+ }
+
+ @Log(module = "过鱼设施自动数据管理", value = "新增过鱼自动数据")
+ @PostMapping("/add")
+ @Operation(summary = "新增过鱼自动数据")
+ public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) {
+ SdFpssrlR entity = request == null || request.getEngInfo() == null ? null
+ : objectMapper.convertValue(request.getEngInfo(), SdFpssrlR.class);
+ if (entity == null) {
+ return ResponseResult.error("数据不能为空");
+ }
+ boolean result = sdFpssrlRService.add(entity, request.getSource());
+ return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败");
+ }
+
+ @Log(module = "过鱼设施自动数据管理", value = "修改过鱼自动数据")
+ @PostMapping("/update")
+ @Operation(summary = "修改过鱼自动数据")
+ public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) {
+ SdFpssrlR entity = request == null || request.getEngInfo() == null ? null
+ : objectMapper.convertValue(request.getEngInfo(), SdFpssrlR.class);
+ if (entity == null || entity.getId() == null) {
+ return ResponseResult.error("数据或ID不能为空");
+ }
+ boolean result = sdFpssrlRService.update(entity, request.getSource());
+ return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败");
+ }
+
+ @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不能为空");
+ }
+ boolean result = sdFpssrlRService.delete(ids, request.getSource());
+ return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败");
+ }
+
+ // ==================== AI 设备识别数据上报接口 ====================
+
+ /**
+ * AI设备图片/视频上传接口
+ * 步骤1:先上传图片获取附件URL,再将URL填入数据上报接口
+ */
+ @PostMapping("/ai/uploadImage")
+ @Operation(summary = "AI设备图片上传")
+ public ResponseResult aiUploadImage(@RequestParam("file") MultipartFile file) {
+ if (file == null || file.isEmpty()) {
+ return ResponseResult.error("文件不能为空");
+ }
+ try {
+ List files = new ArrayList<>();
+ files.add(file);
+ List attachmentIds = attachmentUploadService.uploadMultipartFiles(files);
+ if (attachmentIds != null && !attachmentIds.isEmpty()) {
+ return ResponseResult.successData(attachmentIds);
+ } else {
+ return ResponseResult.error("图片上传失败");
+ }
+ } catch (Exception e) {
+ log.error("AI图片上传失败", e);
+ return ResponseResult.error("图片上传失败: " + e.getMessage());
+ }
+ }
+
+ /**
+ * AI设备识别数据上报接口(支持单条和批量)
+ * 步骤2:上传完图片后,将附件ID填入JSON数组调用此接口
+ */
+ @PostMapping("/ai/report")
+ @Operation(summary = "AI设备识别数据上报(支持批量)")
+ public ResponseResult aiReport(@RequestBody List requests) {
+ if (requests == null || requests.isEmpty()) {
+ return ResponseResult.error("请求数据不能为空");
+ }
+
+ // 逐条校验
+ for (int i = 0; i < requests.size(); i++) {
+ SdFpssrlRAiRequest req = requests.get(i);
+ if (req == null) {
+ return ResponseResult.error("第" + (i + 1) + "条数据为空");
+ }
+ if (req.getStcd() == null || req.getStcd().isEmpty()) {
+ return ResponseResult.error("第" + (i + 1) + "条过鱼设施编码(stcd)不能为空");
+ }
+ if (req.getTm() == null) {
+ return ResponseResult.error("第" + (i + 1) + "条识别时间(tm)不能为空");
+ }
+ if (req.getFtp() == null || req.getFtp().isEmpty()) {
+ return ResponseResult.error("第" + (i + 1) + "条鱼种类(ftp)不能为空");
+ }
+ }
+
+ try {
+ List result = sdFpssrlRService.processAiReportBatch(requests);
+// List ids = result.stream().map(SdFpssrlR::getId).collect(Collectors.toList());
+ log.info("AI批量上报成功,共{}条", result.size());
+ return ResponseResult.success();
+ } catch (Exception e) {
+ log.error("AI识别数据批量上报失败", e);
+ return ResponseResult.error("上报失败: " + e.getMessage());
+ }
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPpbclB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPpbclB.java
new file mode 100644
index 00000000..4e79b03a
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPpbclB.java
@@ -0,0 +1,82 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 平台产品化-业务组件基础表
+ *
+ * @author migration
+ */
+@Data
+@TableName("MS_PPBCL_B")
+public class MsPpbclB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /** 编码 */
+ @TableField("CODE")
+ private String code;
+
+ /** 名称 */
+ @TableField("NAME")
+ private String name;
+
+ /** 适用方式:normal=普通 eng_common=电站通用 */
+ @TableField("USETYPE")
+ private String usetype;
+
+ /** 备注 */
+ @TableField("REMARK")
+ private String remark;
+
+ /** 示例图:base64 */
+ @TableField("EXAMPLEIMG")
+ private String exampleimg;
+
+ /** 前端配置数据 */
+ @TableField("DATA")
+ private String data;
+
+ /** 标签ID集合 */
+ @TableField("TAG_IDS")
+ private String tagIds;
+
+ // ---------- 非持久化字段 ----------
+
+ /** 标签名称集合 */
+ @TableField(exist = false)
+ private String tagNames;
+
+ // ---------- 审计字段 ----------
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @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_base/domain/MsPplayoutB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPplayoutB.java
new file mode 100644
index 00000000..a35546ef
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPplayoutB.java
@@ -0,0 +1,72 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 平台产品化-页面布局基础表
+ *
+ * @author migration
+ */
+@Data
+@TableName("MS_PPLAYOUT_B")
+public class MsPplayoutB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /** 布局类型:page=页面布局 map=地图布局 */
+ @TableField("TYPE")
+ private String type;
+
+ /** 编码 */
+ @TableField("CODE")
+ private String code;
+
+ /** 名称 */
+ @TableField("NAME")
+ private String name;
+
+ /** 备注 */
+ @TableField("REMARK")
+ private String remark;
+
+ /** 示例图:base64 */
+ @TableField("EXAMPLEIMG")
+ private String exampleimg;
+
+ /** 前端配置数据 */
+ @TableField("DATA")
+ private String data;
+
+ // ---------- 审计字段 ----------
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @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_base/domain/MsPsbmodulelbB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPsbmodulelbB.java
new file mode 100644
index 00000000..4c5e7e93
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPsbmodulelbB.java
@@ -0,0 +1,87 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 平台产品化-电站与布局组件配置表
+ *
+ * @author migration
+ */
+@Data
+@TableName("MS_PSBMODULELB_B")
+public class MsPsbmodulelbB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /** 所属电站 */
+ @TableField("STCD")
+ private String stcd;
+
+ /** 布局 */
+ @TableField("LAYOUT_ID")
+ private String layoutId;
+
+ /** 布局各组件配置 */
+ @TableField("BCL_DATA")
+ private String bclData;
+
+ /** 角色ID */
+ @TableField("ROLE_ID")
+ private String roleId;
+
+ /** 是否布局 */
+ @TableField("IS_LAYOUT")
+ private Integer isLayout;
+
+ // ---------- 非持久化字段 ----------
+
+ /** 模板id */
+ @TableField(exist = false)
+ private String templateId;
+
+ /** 主控件标签配置 */
+ @TableField(exist = false)
+ private List mainTagList;
+
+ /** 组件标签配置 */
+ @TableField(exist = false)
+ private List ppbclTagList;
+
+ /** 有配置标签的组件集合 */
+ @TableField(exist = false)
+ private List codeList;
+
+ // ---------- 审计字段 ----------
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @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_base/domain/MsTagConfigB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTagConfigB.java
new file mode 100644
index 00000000..8792193f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTagConfigB.java
@@ -0,0 +1,72 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 页面标签配置表
+ *
+ * @author migration
+ */
+@Data
+@TableName("MS_TAGCONFIG_B")
+public class MsTagConfigB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /** 菜单ID */
+ @TableField("MODULE_ID")
+ private String moduleId;
+
+ /** 模板ID */
+ @TableField("TEMPLATE_ID")
+ private String templateId;
+
+ /** 组件CODE */
+ @TableField("CODE")
+ private String code;
+
+ /** 标签ID */
+ @TableField("TAG_ID")
+ private String tagId;
+
+ /** 标签值 */
+ @TableField("TAG_VALUE")
+ private String tagValue;
+
+ /** 是否展示 0=否 1=是 */
+ @TableField("IS_SHOW")
+ private Integer isShow;
+
+ // ---------- 审计字段 ----------
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @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_base/domain/MsTemplateB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTemplateB.java
new file mode 100644
index 00000000..c92e3a3b
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTemplateB.java
@@ -0,0 +1,78 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 页面配置模板表
+ *
+ * @author migration
+ */
+@Data
+@TableName("MS_TEMPLATE_B")
+public class MsTemplateB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /** 模板名称 */
+ @TableField("TEMPLATE_NAME")
+ private String templateName;
+
+ /** 模块ID */
+ @TableField("MODULE_ID")
+ private String moduleId;
+
+ /** 模板预览图片 */
+ @TableField("FID")
+ private String fid;
+
+ /** 页面配置ID */
+ @TableField("PAGE_ID")
+ private String pageId;
+
+ /** 是否是默认模板 0=否 1=是 */
+ @TableField("IS_DEFAULT")
+ private Integer isDefault;
+
+ // ---------- 非持久化字段 ----------
+
+ /** 模块类型 1=普通菜单模板 2=电站专题模板 */
+ @TableField(exist = false)
+ private Integer templateType;
+
+ /** 模块名称 */
+ @TableField(exist = false)
+ private String moduleName;
+
+ // ---------- 审计字段 ----------
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @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_base/domain/MsWarnRuleB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleB.java
index f3e806e8..1812285c 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleB.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleB.java
@@ -24,6 +24,10 @@ public class MsWarnRuleB implements Serializable {
@TableField("RULE_TYPE")
private String ruleType;
+ /** 预警规则类型名称(字典转换) */
+ @TableField(exist = false)
+ private String ruleTypeName;
+
/** 预警规则名称 */
@TableField("RULE_NAME")
private String ruleName;
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleDetailB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleDetailB.java
new file mode 100644
index 00000000..d6c21da9
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleDetailB.java
@@ -0,0 +1,90 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警规则配置详情表
+ */
+@Data
+@TableName("MS_WARN_RULE_DETAIL_B")
+public class MsWarnRuleDetailB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @TableField("RULE_ID")
+ private String ruleId;
+
+ @TableField("TB_ID")
+ private String tbId;
+
+ @TableField("YS")
+ private String ys;
+
+ @TableField("TM")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date tm;
+
+ @TableField("BEGIN_TIME")
+ private String beginTime;
+
+ @TableField("END_TIME")
+ private String endTime;
+
+ @TableField("MIN_VAL")
+ private BigDecimal minVal;
+
+ @TableField("MAX_VAL")
+ private BigDecimal maxVal;
+
+ @TableField("LVL")
+ private Integer lvl;
+
+ @TableField("LVL_NOTE")
+ private String lvlNote;
+
+ @TableField("STTY")
+ private String stty;
+
+ @TableField("ALWYRQST")
+ private Integer alwyrqst;
+
+ @TableField("ELAEQ")
+ private Integer elaeq;
+
+ @TableField("QECSC")
+ private BigDecimal qecsc;
+
+ @TableField("DESCRIPTION")
+ private String description;
+
+ @TableField("WARN_LEVEL")
+ private Integer warnLevel;
+
+ @TableField("MARK")
+ private String mark;
+
+ @TableField("VLSR")
+ private String vlsr;
+
+ @TableField("VLSR_TM")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date vlsrTm;
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleStbprpB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleStbprpB.java
new file mode 100644
index 00000000..4e9cf950
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleStbprpB.java
@@ -0,0 +1,59 @@
+package com.yfd.platform.qgc_base.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 预警规则与测站关联表
+ */
+@Data
+@TableName("MS_WARN_RULE_STBPRP_B")
+public class MsWarnRuleStbprpB implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @TableField("RULE_ID")
+ private String ruleId;
+
+ @TableField("STTP_ID")
+ private String sttpId;
+
+ @TableField("STCD")
+ private String stcd;
+
+ @TableField("DESCRIPTION")
+ private String description;
+
+ @TableField("RECORD_USER")
+ private String recordUser;
+
+ @TableField("RECORD_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date recordTime;
+
+ @TableField("MODIFY_USER")
+ private String modifyUser;
+
+ @TableField("MODIFY_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date modifyTime;
+
+ @TableField("IS_DELETED")
+ private Integer isDeleted;
+
+ @TableField("DELETE_USER")
+ private String deleteUser;
+
+ @TableField("DELETE_TIME")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date deleteTime;
+
+ @TableField("ISOLATE_ID")
+ private String isolateId;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/PpbclCodeVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/PpbclCodeVo.java
new file mode 100644
index 00000000..12a6a3cc
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/PpbclCodeVo.java
@@ -0,0 +1,15 @@
+package com.yfd.platform.qgc_base.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 组件编码VO(用于解析 BCL_DATA JSON)
+ */
+@Data
+public class PpbclCodeVo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String code;
+}
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 5bdeb096..ec63dfc4 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
@@ -116,6 +116,7 @@ public class SdArtsgBH implements Serializable {
*/
private String rvcd;
+
@TableField(exist = false)
private String rvnm;
@@ -165,6 +166,7 @@ public class SdArtsgBH implements Serializable {
*/
private Integer bldsttCode;
+ @TableField(exist = false)
private String bldsttCodeName;
/**
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 81adf7a5..2997cc93 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
@@ -198,7 +198,7 @@ public class SdDwBH implements Serializable {
/**
* 叠梁门层数高度
*/
- private BigDecimal dcshg;
+ private String dcshg;
/**
* 叠梁门单层取水口个数
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 554ddf1e..589c8251 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
@@ -22,7 +22,7 @@ public class SdFishDictoryB implements Serializable {
/**
* 主键
*/
- @TableId(type = IdType.INPUT)
+ @TableId(type = IdType.ASSIGN_UUID)
private String id;
/**
@@ -85,6 +85,9 @@ public class SdFishDictoryB implements Serializable {
*/
private Integer type;
+ @TableField(exist = false)
+ private String typeName;
+
/**
* 成鱼大小:单位:cm
*/
@@ -95,16 +98,25 @@ public class SdFishDictoryB implements Serializable {
*/
private Integer rare;
+ @TableField(exist = false)
+ private String rareName;
+
/**
* 物种来源:1=本土物种 2=外来物种
*/
private Integer specOrigin;
+ @TableField(exist = false)
+ private String specOriginName;
+
/**
* 保护类型:1=濒危 2=极危 3=近危 4=易危 5=重点保护 6=无危 7=国家二级 8=市二级保护
*/
private Integer ptype;
+ @TableField(exist = false)
+ private String ptypeName;
+
/**
* 所属流域
*/
@@ -165,21 +177,33 @@ public class SdFishDictoryB implements Serializable {
*/
private String wqtq;
+// @TableField(exist = false)
+// private String wqtqName;
+
/**
* 主要生活环境 1=流水生境 2=静缓流生境 3=洞穴生境
*/
private Integer habitat;
+ @TableField(exist = false)
+ private String habitatName;
+
/**
* 种群现状 1=优势种 2=常见种 3=少见种 4=记录种
*/
private Integer situation;
+ @TableField(exist = false)
+ private String situationName;
+
/**
* 资源类型 1=保护鱼类 2=特有鱼类 3=重要经济鱼类 4=濒危状况
*/
private Integer resourceType;
+ @TableField(exist = false)
+ private String resourceTypeName;
+
/**
* 形态描述
*/
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlR.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlR.java
new file mode 100644
index 00000000..a768db6f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlR.java
@@ -0,0 +1,180 @@
+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 lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * 过鱼设施自动数据表(AI识别)
+ *
+ */
+@Data
+@TableName("SD_FPSSRL_R")
+public class SdFpssrlR implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_UUID)
+ private String id;
+
+ /**
+ * 过鱼设施编码
+ */
+ private String stcd;
+
+ /**
+ * 时间
+ */
+ private Date tm;
+
+ /**
+ * 鱼种类
+ */
+ private String ftp;
+
+ /**
+ * 过鱼数量
+ */
+ private Integer fcnt;
+
+ /**
+ * 鱼尺寸:大/中/小
+ */
+ private String fsz;
+
+ /**
+ * 鱼长度
+ */
+ private BigDecimal length;
+
+ /**
+ * 鱼宽度
+ */
+ private BigDecimal width;
+
+ /**
+ * 鱼速度
+ */
+ private String fishspeed;
+
+ /**
+ * 游向:0=上行 1=下行
+ */
+ private Integer direction;
+
+ /**
+ * 鱼位置
+ */
+ private Long fishposition;
+
+ /**
+ * 鱼截图主图片url
+ */
+ private String firstImgUrl;
+
+ /**
+ * 鱼截图副图片url
+ */
+ private String secondImgUrl;
+
+ /**
+ * 视频url
+ */
+ private String videoUrl;
+
+ /**
+ * 水温:单位:℃
+ */
+ private BigDecimal temperature;
+
+ /**
+ * 水位:单位:m
+ */
+ private BigDecimal waterlevel;
+
+ /**
+ * 流速:单位:m/s
+ */
+ private BigDecimal speed;
+
+ /**
+ * 流量:单位:m3/s
+ */
+ private BigDecimal q;
+
+ /**
+ * 溶氧:单位:mg/L
+ */
+ private BigDecimal dox;
+
+ /**
+ * 浊度:单位:NTU
+ */
+ private Integer tu;
+
+ /**
+ * 过鱼通道
+ */
+ private String channelno;
+
+ /**
+ * 创建人:关联SYS_USER.ID
+ */
+ private String recordUser;
+
+ /**
+ * 创建时间
+ */
+ private Date recordTime;
+
+ /**
+ * 更新人:关联SYS_USER.ID
+ */
+ private String modifyUser;
+
+ /**
+ * 更新时间
+ */
+ private Date modifyTime;
+
+ /**
+ * 是否已删除:0=未删除 1=已删除
+ */
+ private Integer isDeleted;
+
+ /**
+ * 删除人:关联SYS_USER.ID
+ */
+ private String deleteUser;
+
+ /**
+ * 删除时间
+ */
+ private Date deleteTime;
+
+ /**
+ * 附件ID
+ */
+ private String fid;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 过鱼设施名称(非表字段,用于列表展示)
+ */
+ @TableField(exist = false)
+ private String stnm;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java
new file mode 100644
index 00000000..7b844d05
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java
@@ -0,0 +1,125 @@
+package com.yfd.platform.qgc_base.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ *
+ * AI设备识别数据上报请求
+ *
+ */
+@Data
+public class SdFpssrlRAiRequest {
+
+ /**
+ * 过鱼设施编码(必填)
+ */
+ private String stcd;
+
+ /**
+ * 识别时间(必填),格式:yyyy-MM-dd HH:mm:ss
+ */
+ private Date tm;
+
+ /**
+ * 鱼种类(必填)
+ */
+ private String ftp;
+
+ /**
+ * 过鱼数量,默认1
+ */
+ private Integer fcnt;
+
+ /**
+ * 鱼尺寸:大/中/小
+ */
+ private String fsz;
+
+ /**
+ * 鱼长度,单位:cm
+ */
+ private BigDecimal length;
+
+ /**
+ * 鱼宽度,单位:cm
+ */
+ private BigDecimal width;
+
+ /**
+ * 鱼速度
+ */
+ private String fishspeed;
+
+ /**
+ * 游向:0=上行 1=下行
+ */
+ private Integer direction;
+
+ /**
+ * 鱼位置
+ */
+ private Long fishposition;
+
+ /**
+ * 主图片URL
+ */
+ private String firstImgUrl;
+
+ /**
+ * 副图片URL
+ */
+ private String secondImgUrl;
+
+ /**
+ * 视频URL
+ */
+ private String videoUrl;
+
+ /**
+ * 水温:单位:℃
+ */
+ private BigDecimal temperature;
+
+ /**
+ * 水位:单位:m
+ */
+ private BigDecimal waterlevel;
+
+ /**
+ * 流速:单位:m/s
+ */
+ private BigDecimal speed;
+
+ /**
+ * 流量:单位:m³/s
+ */
+ private BigDecimal q;
+
+ /**
+ * 溶氧:单位:mg/L
+ */
+ private BigDecimal dox;
+
+ /**
+ * 浊度:单位:NTU
+ */
+ private Integer tu;
+
+ /**
+ * 过鱼通道,默认"主通道"
+ */
+ private String channelno;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 附件ID(多个以逗号分隔),通过上传图片接口获取
+ */
+ private String fid;
+}
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 f38789f6..058033af 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
@@ -38,6 +38,9 @@ public class SdOtteBH implements Serializable {
private Integer usfl;
+ @TableField(exist = false)
+ private String usflName;
+
private Integer dtin;
@TableField(exist = false)
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 7c162c2e..3066160b 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
@@ -38,6 +38,9 @@ public class SdOtweBH implements Serializable {
private Integer usfl;
+ @TableField(exist = false)
+ private String usflName;
+
private Integer dtin;
@TableField(exist = false)
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 a775f3ab..a503baae 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
@@ -52,6 +52,9 @@ public class SdSonarBH implements Serializable {
private Integer usfl;
+ @TableField(exist = false)
+ private String usflName;
+
private Integer dtin;
@TableField(exist = false)
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 3b0d445a..eb3ab517 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
@@ -38,6 +38,9 @@ public class SdVaBH implements Serializable {
private Integer usfl;
+ @TableField(exist = false)
+ private String usflName;
+
private Integer dtin;
@TableField(exist = false)
private String dtinName;
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 3865d5c1..f89e258d 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
@@ -57,6 +57,9 @@ public class SdVdinfoB implements Serializable {
private String addvcd;
+ @TableField(exist = false)
+ private String addvcdName;
+
private String hycd;
@TableField("BASE_ID")
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 043e6df2..c4b03141 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
@@ -85,7 +85,7 @@ public class SdWqBH implements Serializable {
private Integer mway;
@TableField(exist = false)
- private Integer mwayName;
+ private String mwayName;
private String stindx;
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/TagConfigVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/TagConfigVo.java
new file mode 100644
index 00000000..60a168cf
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/TagConfigVo.java
@@ -0,0 +1,18 @@
+package com.yfd.platform.qgc_base.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 标签配置VO
+ */
+@Data
+public class TagConfigVo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String code;
+ private String tagId;
+ private String tagValue;
+ private Integer isShow;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPpbclBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPpbclBMapper.java
new file mode 100644
index 00000000..b19ab323
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPpbclBMapper.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.MsPpbclB;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MsPpbclBMapper extends BaseMapper {
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPplayoutBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPplayoutBMapper.java
new file mode 100644
index 00000000..98ee7927
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPplayoutBMapper.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.MsPplayoutB;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MsPplayoutBMapper extends BaseMapper {
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPsbmodulelbBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPsbmodulelbBMapper.java
new file mode 100644
index 00000000..8b2f7017
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPsbmodulelbBMapper.java
@@ -0,0 +1,21 @@
+package com.yfd.platform.qgc_base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.qgc_base.domain.MsPsbmodulelbB;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface MsPsbmodulelbBMapper extends BaseMapper {
+
+ @Select("SELECT t1.* FROM MS_PSBMODULELB_B t1 " +
+ "INNER JOIN MS_PPLAYOUT_B t2 ON t1.LAYOUT_ID = t2.ID " +
+ "WHERE t1.STCD = #{stcd} AND t2.TYPE = #{layoutType}")
+ List getPsbmoduleByMidAndLt(@Param("stcd") String stcd, @Param("layoutType") String layoutType);
+
+ @Select("${sql}")
+ List selectBySql(@Param("sql") String sql);
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTagConfigBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTagConfigBMapper.java
new file mode 100644
index 00000000..1d3b8793
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTagConfigBMapper.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.MsTagConfigB;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MsTagConfigBMapper extends BaseMapper {
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTemplateBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTemplateBMapper.java
new file mode 100644
index 00000000..20d112c8
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTemplateBMapper.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.MsTemplateB;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MsTemplateBMapper extends BaseMapper {
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleBMapper.java
index 65897007..c61f1a2f 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleBMapper.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleBMapper.java
@@ -2,6 +2,55 @@ package com.yfd.platform.qgc_base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfd.platform.qgc_base.domain.MsWarnRuleB;
+import com.yfd.platform.qgc_sys.warnRule.vo.WarnRuleVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import java.util.List;
+
+@Mapper
public interface MsWarnRuleBMapper extends BaseMapper {
+
+ @Update("UPDATE MS_WARN_RULE_B SET IS_SHOW = #{isShow} WHERE RULE_CODE IN ('common','custom')")
+ void updateIsShow(@Param("isShow") Integer isShow);
+
+// @Select("SELECT RULE_NAME AS ruleName FROM (" +
+// "SELECT RULE_NAME FROM MS_WARN_RULE_B " +
+// "WHERE RULE_CODE = 'custom' AND STCD = #{stcd} AND IS_DELETED = 0 AND RECORD_TIME IS NOT NULL " +
+// "ORDER BY RECORD_TIME DESC) WHERE ROWNUM = 1")
+// String getCustomRuleNameByStcd(@Param("stcd") String stcd);
+
+
+ @Select("SELECT RULE_NAME AS ruleName FROM (" +
+ "SELECT RULE_NAME FROM MS_WARN_RULE_B " +
+ "WHERE 1=1 AND STCD = #{stcd} AND IS_DELETED = 0 AND RECORD_TIME IS NOT NULL " +
+ "ORDER BY RECORD_TIME DESC) WHERE ROWNUM = 1")
+ String getCustomRuleNameByStcd(@Param("stcd") String stcd);
+
+// @Select("SELECT t1.ID, RULE_NAME AS ruleName, RULE_CODE AS ruleCode, t2.LVL AS lvl " +
+// "FROM MS_WARN_RULE_B t1 INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " +
+// "WHERE (t1.RULE_CODE = 'common' OR (t1.RULE_CODE = 'custom' AND t1.STCD = #{stcd})) " +
+// "AND t1.RULE_TYPE = #{ruleType} AND t1.IS_DELETED = 0 AND t2.IS_DELETED = 0 " +
+// "GROUP BY t1.ID, RULE_NAME, RULE_CODE, lvl")
+// List getRuleListByStcd(@Param("stcd") String stcd, @Param("ruleType") String ruleType);
+
+ @Select("SELECT t1.ID, RULE_NAME AS ruleName, RULE_CODE AS ruleCode, t2.LVL AS lvl " +
+ "FROM MS_WARN_RULE_B t1 INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " +
+ "WHERE 1=1 AND t1.STCD = #{stcd} " +
+ "AND t1.RULE_TYPE = #{ruleType} AND t1.IS_DELETED = 0 AND t2.IS_DELETED = 0 " +
+ "GROUP BY t1.ID, RULE_NAME, RULE_CODE, lvl")
+ List getRuleListByStcd(@Param("stcd") String stcd, @Param("ruleType") String ruleType);
+
+ @Update("UPDATE MS_WARN_RULE_B SET STCD = #{stcd} WHERE ID = #{id}")
+ void updateStcd(@Param("stcd") String stcd, @Param("id") String id);
+
+ @Select("SELECT t2.STTP_NAME FROM V_MS_STBPRP_T t1 INNER JOIN SD_STTP_B t2 ON t1.STTP = t2.ID WHERE t1.STCD = #{stcd}")
+ String getSttpCodeNameByStcd(@Param("stcd") String stcd);
+
+ @Select("SELECT COUNT(t1.ID) FROM MS_WARN_RULE_B t1 INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID " +
+ "WHERE t1.RULE_TYPE = 'WQ_RULE' AND t1.RULE_CODE = 'common' AND t2.LVL = #{lvl} " +
+ "AND t1.IS_DELETED = 0 AND t2.IS_DELETED = 0")
+ Integer checkWqCommonRuleExist(@Param("lvl") Integer lvl);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleDetailBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleDetailBMapper.java
new file mode 100644
index 00000000..ee1916fb
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleDetailBMapper.java
@@ -0,0 +1,10 @@
+package com.yfd.platform.qgc_base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.qgc_base.domain.MsWarnRuleDetailB;
+
+/**
+ * 预警规则配置详情表 Mapper
+ */
+public interface MsWarnRuleDetailBMapper extends BaseMapper {
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleStbprpBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleStbprpBMapper.java
new file mode 100644
index 00000000..92ea093c
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleStbprpBMapper.java
@@ -0,0 +1,23 @@
+package com.yfd.platform.qgc_base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.qgc_base.domain.MsWarnRuleStbprpB;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 预警规则与测站关联表 Mapper
+ */
+public interface MsWarnRuleStbprpBMapper extends BaseMapper {
+
+ @Delete("DELETE FROM MS_WARN_RULE_STBPRP_B WHERE ID = #{id}")
+ void deleteBind(@Param("id") String id);
+
+ @Select("SELECT t1.ID, t1.RULE_ID, t1.STCD, t1.STTP_ID AS sttpId " +
+ "FROM MS_WARN_RULE_STBPRP_B t1 " +
+ "INNER JOIN MS_WARN_RULE_B t2 ON t1.RULE_ID = t2.ID " +
+ "WHERE t1.STCD = #{stcd} AND t2.RULE_TYPE = #{ruleType} " +
+ "AND t2.RULE_CODE IN ('common','custom') AND t1.IS_DELETED = 0 AND t2.IS_DELETED = 0")
+ MsWarnRuleStbprpB getBindRuleByStcd(@Param("stcd") String stcd, @Param("ruleType") String ruleType);
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java
new file mode 100644
index 00000000..1fce31a6
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java
@@ -0,0 +1,22 @@
+package com.yfd.platform.qgc_base.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yfd.platform.qgc_base.domain.SdFpssrlR;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ *
+ * 过鱼设施自动数据表 Mapper 接口
+ *
+ */
+@Mapper
+public interface SdFpssrlRMapper extends BaseMapper {
+
+ /**
+ * 批量合并过鱼自动数据(基于 STCD + TM + FTP 唯一)
+ * 存在则更新,不存在则新增
+ */
+ int mergeFishRecords(List list);
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java
index 203aae65..7ee1af42 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsOperationLogService.java
@@ -31,7 +31,7 @@ public interface IMsOperationLogService {
* @param source 操作来源
* @param 实体类型
*/
- void recordModifyDetailLog(String tableName, T before, T after, String source);
+ void recordModifyDetailLog(String recordId,String tableName, T before, T after, String source);
/**
* 通用新增操作详情日志(含字段级详情)
@@ -44,7 +44,7 @@ public interface IMsOperationLogService {
* @param source 操作来源
* @param 实体类型
*/
- void recordAddDetailLog(String tableName, T entity, String source);
+ void recordAddDetailLog(String recordId,String tableName, T entity, String source);
/**
* 通用删除操作详情日志(含字段级详情)
@@ -57,5 +57,5 @@ public interface IMsOperationLogService {
* @param source 操作来源
* @param 实体类型
*/
- void recordDeleteDetailLog(String tableName, T entity, String source);
+ void recordDeleteDetailLog(String recordId,String tableName, T entity, String source);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java
new file mode 100644
index 00000000..1647056f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java
@@ -0,0 +1,39 @@
+package com.yfd.platform.qgc_base.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.qgc_base.domain.MsPsbmodulelbB;
+import com.yfd.platform.qgc_sys.psbmodulelbb.vo.WbsBPpVo;
+
+import java.util.List;
+
+/**
+ * 平台产品化-电站与布局组件配置表 Service 接口
+ */
+public interface IMsPsbmodulelbBService extends IService {
+
+ /**
+ * 处理kendo列表(含标签信息)
+ */
+ List queryPageList(DataSourceRequest request);
+
+ /**
+ * 获取电站与布局组件配置列表
+ */
+ List getPsbmoduleByMidAndLt(String stcd, String layoutType);
+
+ /**
+ * 保存或更新数据
+ */
+ boolean saveOrUpdateData(MsPsbmodulelbB entity);
+
+ /**
+ * 逻辑删除
+ */
+ boolean deleteData(String id);
+
+ /**
+ * 获取已配置电站及流域树形数据
+ */
+ List getTreeConfiguredps(DataSourceRequest dataSourceRequest);
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsWarnRuleBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsWarnRuleBService.java
index d15d8d16..21396e56 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsWarnRuleBService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsWarnRuleBService.java
@@ -4,8 +4,12 @@ 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.MsWarnRuleB;
+import com.yfd.platform.qgc_sys.warnRule.vo.MsWarnRuleBVo;
+import com.yfd.platform.qgc_sys.warnRule.vo.WarnRuleVo;
+import com.yfd.platform.qgc_sys.warnRule.vo.WarnYsVo;
import java.util.List;
+import java.util.Map;
/**
* 预警规则配置 Service 接口
@@ -15,4 +19,54 @@ public interface IMsWarnRuleBService extends IService {
boolean add(MsWarnRuleB entity, String source);
boolean update(MsWarnRuleB entity, String source);
boolean delete(List ids, String source);
+
+ /**
+ * 获取告警类型对应的要素列表
+ */
+ List getAllYs(String ruleType);
+
+ /**
+ * 新增或修改预警规则
+ */
+ MsWarnRuleB addOrUpdate(MsWarnRuleBVo vo);
+
+ /**
+ * 校验规则是否被测站引用
+ */
+ boolean check(String id);
+
+ /**
+ * 删除规则绑定
+ */
+ void deleteBind(String id);
+
+ /**
+ * 删除规则(物理删除详情和绑定,逻辑删除主表)
+ */
+ void deleteRule(String id);
+
+ /**
+ * 修改规则是否展示
+ */
+ void updateShow(Integer isShow);
+
+ /**
+ * 获取水位和生态流量限值
+ */
+ Map getLimit(DataSourceRequest request);
+
+ /**
+ * 查询测站和预警规则绑定列表
+ */
+ Page getRuleBindList(DataSourceRequest request);
+
+ /**
+ * 根据id查询规则配置详情
+ */
+ MsWarnRuleBVo getRuleBindDetail(String ruleId, String bindId);
+
+ /**
+ * 根据stcd查询可绑定的规则
+ */
+ List getRuleListByStcd(String stcd, String ruleType, String lvl);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFishDictoryBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFishDictoryBService.java
index 9352dada..c687cc28 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFishDictoryBService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFishDictoryBService.java
@@ -2,21 +2,24 @@ 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.SdFishDictoryB;
import java.util.List;
public interface ISdFishDictoryBService extends IService {
+ Page queryPageList(DataSourceRequest request);
+
Page selectPage(String name, String code, Integer type, Integer rare, Page page);
- boolean add(SdFishDictoryB fishDictoryB);
+ boolean add(SdFishDictoryB entity, String source);
- boolean updateById(SdFishDictoryB fishDictoryB);
+ boolean update(SdFishDictoryB entity, String source);
- boolean deleteById(String id);
+ boolean delete(List ids, String source);
SdFishDictoryB getById(String id);
List findSimilarFish(String name, Integer limit);
-}
\ No newline at end of file
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFpssrlRService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFpssrlRService.java
new file mode 100644
index 00000000..546fb5dc
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFpssrlRService.java
@@ -0,0 +1,52 @@
+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.SdFpssrlR;
+import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest;
+
+import java.util.List;
+
+/**
+ *
+ * 过鱼设施自动数据表 服务接口
+ *
+ */
+public interface ISdFpssrlRService extends IService {
+
+ /**
+ * 分页查询(Kendo Grid)
+ */
+ Page queryPageList(DataSourceRequest request);
+
+ /**
+ * 新增
+ */
+ boolean add(SdFpssrlR entity, String source);
+
+ /**
+ * 修改
+ */
+ boolean update(SdFpssrlR entity, String source);
+
+ /**
+ * 删除(逻辑删除)
+ */
+ boolean delete(List ids, String source);
+
+ /**
+ * 根据ID查询(排除已删除的)
+ */
+ SdFpssrlR getById(String id);
+
+ /**
+ * 处理AI设备上报的单条识别数据
+ */
+ SdFpssrlR processAiReport(SdFpssrlRAiRequest request);
+
+ /**
+ * 批量处理AI设备上报的识别数据
+ */
+ List processAiReportBatch(List requests);
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsEiaApprovalBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsEiaApprovalBServiceImpl.java
index f2df0ee4..9735a4f8 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsEiaApprovalBServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsEiaApprovalBServiceImpl.java
@@ -38,7 +38,7 @@ public class MsEiaApprovalBServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(MsEiaApprovalB::getId, id);
wrapper.set(MsEiaApprovalB::getIsDeleted, 1);
wrapper.set(MsEiaApprovalB::getDeleteUser, SecurityUtils.getCurrentUsername());
wrapper.set(MsEiaApprovalB::getDeleteTime, new Date());
if (this.update(wrapper)) {
- MsEiaApprovalB entity = this.getById(id);
- msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source);
+ msOperationLogService.recordDeleteDetailLog(id,TABLE_NAME, entity, source);
count++;
}
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java
index 9067a8dd..8b705c51 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsOperationLogServiceImpl.java
@@ -400,11 +400,11 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
}
@Override
- public void recordModifyDetailLog(String tableName, T before, T after, String source) {
+ public void recordModifyDetailLog(String recordId,String tableName, T before, T after, String source) {
if (before == null || after == null) {
return;
}
- String recordId = getStcd(before);
+// String recordId = getStcd(before);
MsOperationLog mainLog = buildMainLog(tableName, recordId, "修改", source);
msOperationLogMapper.insert(mainLog);
@@ -439,11 +439,11 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
}
@Override
- public void recordAddDetailLog(String tableName, T entity, String source) {
+ public void recordAddDetailLog(String recordId,String tableName, T entity, String source) {
if (entity == null) {
return;
}
- String recordId = getStcd(entity);
+// String recordId = getStcd(entity);
MsOperationLog mainLog = buildMainLog(tableName, recordId, "新增", source);
msOperationLogMapper.insert(mainLog);
@@ -469,11 +469,11 @@ public class MsOperationLogServiceImpl implements IMsOperationLogService {
}
@Override
- public void recordDeleteDetailLog(String tableName, T entity, String source) {
+ public void recordDeleteDetailLog(String recordId,String tableName, T entity, String source) {
if (entity == null) {
return;
}
- String recordId = getStcd(entity);
+// String recordId = getStcd(entity);
MsOperationLog mainLog = buildMainLog(tableName, recordId, "删除", source);
msOperationLogMapper.insert(mainLog);
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsPsbmodulelbBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsPsbmodulelbBServiceImpl.java
new file mode 100644
index 00000000..8dfd2ad4
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsPsbmodulelbBServiceImpl.java
@@ -0,0 +1,307 @@
+package com.yfd.platform.qgc_base.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.common.MicroservicDynamicSQLMapper;
+import com.yfd.platform.qgc_base.domain.*;
+import com.yfd.platform.qgc_base.mapper.*;
+import com.yfd.platform.qgc_base.service.IMsOperationLogService;
+import com.yfd.platform.qgc_base.service.IMsPsbmodulelbBService;
+import com.yfd.platform.qgc_sys.psbmodulelbb.vo.WbsBPpVo;
+import com.yfd.platform.utils.SecurityUtils;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 平台产品化-电站与布局组件配置表 Service 实现类
+ */
+@Service
+public class MsPsbmodulelbBServiceImpl extends ServiceImpl implements IMsPsbmodulelbBService {
+
+ private static final String TABLE_NAME = "MS_PSBMODULELB_B";
+
+ @Resource
+ private MsPsbmodulelbBMapper msPsbmodulelbBMapper;
+
+ @Resource
+ private MsTemplateBMapper msTemplateBMapper;
+
+ @Resource
+ private MsPpbclBMapper msPpbclBMapper;
+
+ @Resource
+ private MsTagConfigBMapper msTagConfigBMapper;
+
+ @Resource
+ private IMsOperationLogService msOperationLogService;
+
+ @Resource
+ private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
+
+ @Override
+ public List queryPageList(DataSourceRequest request) {
+ String templateId = getFilterFieldValue(request, "templateId");
+ String moduleId = getFilterFieldValue(request, "stcd");
+ String ext = getFilterFieldValue(request, "ext");
+
+ StringBuilder sql = new StringBuilder();
+ if (StringUtils.isBlank(templateId) && StringUtils.isNotBlank(ext) && StringUtils.isNotBlank(moduleId)) {
+ // 查询模块下是否有标识为默认的模板
+ LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
+ lambdaQueryWrapper.eq(MsTemplateB::getIsDefault, 1);
+ lambdaQueryWrapper.eq(MsTemplateB::getIsDeleted, 0);
+ lambdaQueryWrapper.eq(MsTemplateB::getModuleId, moduleId);
+ MsTemplateB msTemplateB = msTemplateBMapper.selectOne(lambdaQueryWrapper);
+ if (msTemplateB != null && StringUtils.isNotBlank(msTemplateB.getPageId())) {
+ templateId = msTemplateB.getId();
+ }
+ }
+
+ if (StringUtils.isBlank(templateId)) {
+ // 查询系统默认配置
+ sql.append("SELECT ID, STCD, LAYOUT_ID, BCL_DATA FROM MS_PSBMODULELB_B WHERE IS_DELETED = 0 AND STCD = '")
+ .append(moduleId).append("'")
+ .append(" AND ID NOT IN (SELECT PAGE_ID FROM MS_TEMPLATE_B WHERE PAGE_ID IS NOT NULL AND MODULE_ID = '")
+ .append(moduleId).append("') ORDER BY RECORD_TIME DESC");
+ } else {
+ // 查询指定模板配置
+ sql.append("SELECT t2.ID, t2.STCD, t2.LAYOUT_ID, t2.BCL_DATA ")
+ .append("FROM MS_TEMPLATE_B t1 ")
+ .append("INNER JOIN MS_PSBMODULELB_B t2 ON t1.PAGE_ID = t2.ID AND t1.MODULE_ID = t2.STCD ")
+ .append("WHERE t1.ID = '").append(templateId).append("'")
+ .append(" AND t1.MODULE_ID = '").append(moduleId).append("'");
+ }
+
+ List msPsbmodulelbBList = msPsbmodulelbBMapper.selectBySql(sql.toString());
+
+ // 获取电站配置的标签信息
+ if (!CollectionUtils.isEmpty(msPsbmodulelbBList)) {
+ MsPsbmodulelbB msPsbmodulelbB = msPsbmodulelbBList.get(0);
+
+ // 解析 BCL_DATA JSON 获取组件编码列表
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ List ppbclCodeVos;
+ try {
+ ppbclCodeVos = mapper.readValue(msPsbmodulelbB.getBclData(), new TypeReference>() {});
+ } catch (Exception e) {
+ throw new RuntimeException("解析 BCL_DATA 失败", e);
+ }
+
+ List codeList = ppbclCodeVos.stream().map(PpbclCodeVo::getCode).collect(Collectors.toList());
+
+ // 查询组件是否有配置标签
+ LambdaQueryWrapper ppbclBWrapper = new LambdaQueryWrapper<>();
+ ppbclBWrapper.select(MsPpbclB::getCode);
+ ppbclBWrapper.in(MsPpbclB::getCode, codeList);
+ ppbclBWrapper.isNotNull(MsPpbclB::getTagIds);
+ List msPpbclBList = msPpbclBMapper.selectList(ppbclBWrapper);
+
+ if (!CollectionUtils.isEmpty(msPpbclBList)) {
+ List codes = msPpbclBList.stream().map(MsPpbclB::getCode).collect(Collectors.toList());
+ msPsbmodulelbB.setCodeList(codes);
+ }
+
+ // 查询组件配置的标签值
+ LambdaQueryWrapper tagConfigWrapper = new LambdaQueryWrapper<>();
+ tagConfigWrapper.select(MsTagConfigB::getCode, MsTagConfigB::getTagId,
+ MsTagConfigB::getTagValue, MsTagConfigB::getIsShow);
+ tagConfigWrapper.eq(MsTagConfigB::getModuleId, moduleId);
+ if (StringUtils.isBlank(templateId)) {
+ tagConfigWrapper.isNull(MsTagConfigB::getTemplateId);
+ } else {
+ tagConfigWrapper.eq(MsTagConfigB::getTemplateId, templateId);
+ }
+ if (!codeList.isEmpty()) {
+ tagConfigWrapper.and(w -> {
+ w.in(MsTagConfigB::getCode, codeList);
+ w.or();
+ w.isNull(MsTagConfigB::getCode);
+ });
+ }
+ List msTagConfigBList = msTagConfigBMapper.selectList(tagConfigWrapper);
+
+ List mainTagList = new ArrayList<>();
+ List ppbclTagList = new ArrayList<>();
+ CopyOptions copyOptions = CopyOptions.create().setIgnoreCase(true).setIgnoreError(true);
+ for (MsTagConfigB msTagConfigB : msTagConfigBList) {
+ TagConfigVo tagConfigVo = BeanUtil.toBean(msTagConfigB, TagConfigVo.class, copyOptions);
+ if (StringUtils.isBlank(tagConfigVo.getCode())) {
+ mainTagList.add(tagConfigVo);
+ } else {
+ ppbclTagList.add(tagConfigVo);
+ }
+ }
+ msPsbmodulelbB.setMainTagList(mainTagList);
+ msPsbmodulelbB.setPpbclTagList(ppbclTagList);
+ }
+
+ return msPsbmodulelbBList;
+ }
+
+ @Override
+ public List getPsbmoduleByMidAndLt(String stcd, String layoutType) {
+ return msPsbmodulelbBMapper.getPsbmoduleByMidAndLt(stcd, layoutType);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean saveOrUpdateData(MsPsbmodulelbB entity) {
+ // 如果包含图片则标记为布局
+ if (entity.getBclData() != null && entity.getBclData().contains("image/png")) {
+ entity.setIsLayout(1);
+ }
+
+ boolean result;
+ if (StringUtils.isNotBlank(entity.getId())) {
+ // 修改
+ MsPsbmodulelbB before = this.getById(entity.getId());
+ entity.setModifyUser(SecurityUtils.getCurrentUsername());
+ entity.setModifyTime(new Date());
+ result = this.updateById(entity);
+ if (result && before != null) {
+ msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, "psbmodulelbb");
+ }
+ } else {
+ // 新增
+ entity.setRecordUser(SecurityUtils.getCurrentUsername());
+ entity.setRecordTime(new Date());
+ result = this.save(entity);
+ if (result) {
+ msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, "psbmodulelbb");
+ }
+ }
+
+ // 如果是新增且有关联模板ID,更新模板的页面配置ID
+ if (result && StringUtils.isNotBlank(entity.getTemplateId())) {
+ MsTemplateB msTemplateB = new MsTemplateB();
+ msTemplateB.setId(entity.getTemplateId());
+ msTemplateB.setPageId(entity.getId());
+ msTemplateBMapper.updateById(msTemplateB);
+ }
+
+ return result;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public boolean deleteData(String id) {
+ MsPsbmodulelbB entity = this.getById(id);
+ if (entity == null) {
+ return false;
+ }
+ LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
+ wrapper.eq(MsPsbmodulelbB::getId, id);
+ wrapper.set(MsPsbmodulelbB::getIsDeleted, 1);
+ wrapper.set(MsPsbmodulelbB::getDeleteUser, SecurityUtils.getCurrentUsername());
+ wrapper.set(MsPsbmodulelbB::getDeleteTime, new Date());
+ boolean result = this.update(wrapper);
+ if (result) {
+ msOperationLogService.recordDeleteDetailLog(id, TABLE_NAME, entity, "psbmodulelbb");
+ }
+ return result;
+ }
+
+ @Override
+ public List getTreeConfiguredps(DataSourceRequest dataSourceRequest) {
+ String wbsCode = getFilterFieldValue(dataSourceRequest, "wbsCode");
+
+ // 第一步:获取已布局电站(IS_LAYOUT=1 且未删除)
+ StringBuilder ppsql = new StringBuilder();
+ ppsql.append("SELECT DISTINCT STCD FROM MS_PSBMODULELB_B WHERE IS_LAYOUT = 1 AND IS_DELETED = 0");
+ List