From f4dacb2efccd85da3072f6326244b72bf1696c6d Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 21 Jul 2026 18:24:41 +0800 Subject: [PATCH 01/17] =?UTF-8?q?fix:=20=E9=B1=BC=E7=B1=BB=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdFishDictoryBController.java | 35 +++-- .../platform/qgc_base/domain/SdArtsgBH.java | 2 + .../yfd/platform/qgc_base/domain/SdDwBH.java | 2 +- .../qgc_base/domain/SdFishDictoryB.java | 24 ++++ .../service/ISdFishDictoryBService.java | 11 +- .../impl/SdFishDictoryBServiceImpl.java | 133 ++++++++++++++---- 6 files changed, 160 insertions(+), 47 deletions(-) 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..119fd3dd 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 @@ -3,10 +3,12 @@ package com.yfd.platform.qgc_base.controller; 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.SdFishDictoryB; +import com.yfd.platform.qgc_base.domain.SdEngInfoBHOperateRequest; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; import com.yfd.platform.utils.DataSourceRequestUtil; import io.swagger.v3.oas.annotations.Operation; @@ -29,14 +31,13 @@ public class SdFishDictoryBController { @Resource private ISdFishDictoryBService sdFishDictoryBService; + @Resource + private ObjectMapper objectMapper; + @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); } @@ -56,7 +57,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 +71,31 @@ public class SdFishDictoryBController { @Log(module = "鱼类字典管理", value = "新增鱼类字典") @PostMapping("/add") @Operation(summary = "新增鱼类字典") - public ResponseResult add(@RequestBody SdFishDictoryB fishDictoryB) { - boolean result = sdFishDictoryBService.add(fishDictoryB); + public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) { + SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class); + boolean result = sdFishDictoryBService.add(entity, request == null ? null : request.getSource()); return result ? ResponseResult.success("新增成功") : ResponseResult.error("新增失败"); } @Log(module = "鱼类字典管理", value = "修改鱼类字典") @PostMapping("/update") @Operation(summary = "修改鱼类字典") - public ResponseResult update(@RequestBody SdFishDictoryB fishDictoryB) { - boolean result = sdFishDictoryBService.updateById(fishDictoryB); + public ResponseResult update(@RequestBody SdEngInfoBHOperateRequest request) { + SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null + : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class); + boolean result = sdFishDictoryBService.update(entity, request == null ? null : request.getSource()); return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } @Log(module = "鱼类字典管理", value = "删除鱼类字典") @PostMapping("/delete") @Operation(summary = "删除鱼类字典") - public ResponseResult delete(@RequestParam String id) { - boolean result = sdFishDictoryBService.deleteById(id); + public ResponseResult delete(@RequestBody SdEngInfoBHOperateRequest request) { + boolean result = sdFishDictoryBService.delete( + request == null ? null : request.getIds(), + request == null ? null : request.getSource() + ); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } @@ -97,4 +106,4 @@ public class SdFishDictoryBController { @RequestParam(required = false, defaultValue = "10") Integer limit) { return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit)); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdArtsgBH.java index 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..9ea09725 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 @@ -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/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/impl/SdFishDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java index 7544ea93..75c70e1a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java @@ -2,20 +2,124 @@ package com.yfd.platform.qgc_base.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.SdFishDictoryB; import com.yfd.platform.qgc_base.mapper.SdFishDictoryBMapper; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.ISdFishDictoryBService; +import com.yfd.platform.utils.CodeToNameMetadataBo; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.*; import java.util.stream.Collectors; +/** + * 鱼类字典 Service 实现类 + */ @Service public class SdFishDictoryBServiceImpl extends ServiceImpl implements ISdFishDictoryBService { + private static final String TABLE_NAME = "SD_FISHDICTORY_B"; + + @Resource + private IMsOperationLogService msOperationLogService; + + + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + + /** + * 代码转名称元数据配置列表(静态初始化) + *

+ * 每个模块的 ServiceImpl 中可按需定义自己的 codeToNameMetadataBoList, + * 在查询方法返回前调用 dictCodeToNameConverter.convertCodeToName(voList, codeToNameMetadataBoList) + * 即可自动将 code 字段转为对应的 name 字段。 + *

+ * + *
+     * 使用示例:
+     * // 在查询方法末尾调用:
+     * dictCodeToNameConverter.convertCodeToName(voList, CODE_TO_NAME_META_LIST);
+     * 
+ */ + private static final List CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("specOrigin").modifyProperty("specOriginName").dictType("STATIC").dictSource("SPEC_ORIGIN").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rare").modifyProperty("rareName").dictType("STATIC").dictSource("TY_SF").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("ptype").modifyProperty("ptypeName").dictType("STATIC").dictSource("PTYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("habitat").modifyProperty("habitatName").dictType("STATIC").dictSource("HABITAT").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("situation").modifyProperty("situationName").dictType("STATIC").dictSource("SITUATION").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("resourceType").modifyProperty("resourceTypeName").dictType("STATIC").dictSource("RESOURCE_TYPE").build()); +// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("wqtq").modifyProperty("wqtqName").dictType("STATIC").dictSource("WWQTG").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("type").modifyProperty("typeName").dictType("STATIC").dictSource("WATER_TYPE").build()); + } + + @Override + public Page queryPageList(DataSourceRequest request) { + Page sdFishDictoryBPage = DataSourceRequestUtil.executeQuery(request, SdFishDictoryB.class, this); + dictCodeToNameConverter.convertCodeToName(sdFishDictoryBPage, CODE_TO_NAME_META_LIST); + return sdFishDictoryBPage; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdFishDictoryB entity, String source) { + boolean result = this.save(entity); + if (result) { + msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdFishDictoryB entity, String source) { + SdFishDictoryB before = this.getById(entity.getId()); + boolean result = this.updateById(entity); + if (result && before != null) { + msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { + SdFishDictoryB entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdFishDictoryB::getId, id); + wrapper.set(SdFishDictoryB::getIsDeleted, 1); + wrapper.set(SdFishDictoryB::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdFishDictoryB::getDeleteTime, new Date()); + if (this.update(wrapper)) { + msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + count++; + } + } + return count > 0; + } + + @Override + public SdFishDictoryB getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdFishDictoryB::getId, id) + .eq(SdFishDictoryB::getIsDeleted, 0); + return getOne(wrapper); + } + @Override public Page selectPage(String name, String code, Integer type, Integer rare, Page page) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -38,35 +142,6 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SdFishDictoryB::getId, id) - .eq(SdFishDictoryB::getIsDeleted, 0); - return getOne(wrapper); - } - @Override public List findSimilarFish(String name, Integer limit) { if (!StringUtils.hasText(name)) { From e20cdb61cd45063b0885d2acf79c5b18ae9c7674 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 21 Jul 2026 18:36:20 +0800 Subject: [PATCH 02/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=AE=B0=E5=BD=95=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/service/impl/MsEiaApprovalBServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdAiboxBHServiceImpl.java | 2 +- .../qgc_base/service/impl/SdAimonitorBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdArtsgBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdDwBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdFpssBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdSonarBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdTeBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdVpBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java | 2 +- .../yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) 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..1efc9427 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 @@ -60,13 +60,13 @@ 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); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 08d10876..8040596c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -60,13 +60,13 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(MsWarnRuleB::getId, id); wrapper.set(MsWarnRuleB::getIsDeleted, 1); wrapper.set(MsWarnRuleB::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(MsWarnRuleB::getDeleteTime, new Date()); if (this.update(wrapper)) { - MsWarnRuleB entity = this.getById(id); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAiboxBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAiboxBHServiceImpl.java index 37e13342..7746c8dc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAiboxBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAiboxBHServiceImpl.java @@ -93,13 +93,13 @@ public class SdAiboxBHServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdAiboxBH::getStcd, stcd); wrapper.set(SdAiboxBH::getIsDeleted, 1); wrapper.set(SdAiboxBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdAiboxBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdAiboxBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java index 1d31a321..0e70ad66 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java @@ -81,13 +81,13 @@ public class SdAimonitorBHServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdAimonitorBH::getStcd, stcd); wrapper.set(SdAimonitorBH::getIsDeleted, 1); wrapper.set(SdAimonitorBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdAimonitorBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdAimonitorBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdArtsgBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdArtsgBHServiceImpl.java index 9c25ab10..b1146846 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdArtsgBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdArtsgBHServiceImpl.java @@ -88,8 +88,8 @@ public class SdArtsgBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdDwBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdDwBH::getStcd, stcd); wrapper.set(SdDwBH::getIsDeleted, 1); wrapper.set(SdDwBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdDwBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdDwBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java index bda41c3b..bd66d779 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java @@ -90,13 +90,13 @@ public class SdEqBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdEqBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdEqBH::getStcd, stcd); wrapper.set(SdEqBH::getIsDeleted, 1); wrapper.set(SdEqBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdEqBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdEqBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java index 36f8caa5..c1a4b14e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java @@ -87,8 +87,8 @@ public class SdFbrdBHServiceImpl extends ServiceImpl i if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdFbrdBH entity = this.getById(stcd); if (this.removeById(stcd)) { - SdFbrdBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java index c61dd69a..3f3fe0d8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java @@ -91,13 +91,13 @@ public class SdFhbtBHServiceImpl extends ServiceImpl i if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdFhbtBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdFhbtBH::getStcd, stcd); wrapper.set(SdFhbtBH::getIsDeleted, 1); wrapper.set(SdFhbtBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdFhbtBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdFhbtBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssBHServiceImpl.java index 99528a60..3f065aee 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssBHServiceImpl.java @@ -259,13 +259,13 @@ public class SdFpssBHServiceImpl extends ServiceImpl i if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdFpssBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdFpssBH::getStcd, stcd); wrapper.set(SdFpssBH::getIsDeleted, 1); wrapper.set(SdFpssBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdFpssBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdFpssBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java index c6eb7fc2..608fd0fb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java @@ -91,13 +91,13 @@ public class SdOpinfoBHServiceImpl extends ServiceImpl wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdOpinfoBH::getStcd, stcd); wrapper.set(SdOpinfoBH::getIsDeleted, 1); wrapper.set(SdOpinfoBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdOpinfoBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdOpinfoBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java index bca1e8ea..9ee7cb52 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java @@ -89,8 +89,8 @@ public class SdOtteBHServiceImpl extends ServiceImpl i if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdOtteBH entity = this.getById(stcd); if (this.removeById(stcd)) { - SdOtteBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java index 4a3a4516..fb95a8b8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java @@ -88,8 +88,8 @@ public class SdOtweBHServiceImpl extends ServiceImpl i if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdOtweBH entity = this.getById(stcd); if (this.removeById(stcd)) { - SdOtweBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java index 4b48a182..76a947b1 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java @@ -97,8 +97,8 @@ public class SdSonarBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdTeBH entity = this.getById(stcd); if (this.removeById(stcd)) { - SdTeBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java index 5be94d58..3c287f8c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java @@ -89,13 +89,13 @@ public class SdVaBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdVaBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdVaBH::getStcd, stcd); wrapper.set(SdVaBH::getIsDeleted, 1); wrapper.set(SdVaBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdVaBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdVaBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java index e5599d34..5dbc0523 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java @@ -92,8 +92,8 @@ public class SdVdinfoBServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdVpBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdVpBH::getStcd, stcd); wrapper.set(SdVpBH::getIsDeleted, 1); wrapper.set(SdVpBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdVpBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdVpBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java index b0ca0a7e..c4286a99 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java @@ -89,8 +89,8 @@ public class SdWeBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdWeBH entity = this.getById(stcd); if (this.removeById(stcd)) { - SdWeBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java index cb5fd299..2d19db74 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java @@ -91,13 +91,13 @@ public class SdWqBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdWqBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdWqBH::getStcd, stcd); wrapper.set(SdWqBH::getIsDeleted, 1); wrapper.set(SdWqBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdWqBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdWqBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index b7e4838b..c428b71c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -94,13 +94,13 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme if (stcds == null || stcds.isEmpty()) return false; int count = 0; for (String stcd : stcds) { + SdWtBH entity = this.getById(stcd); LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); wrapper.eq(SdWtBH::getStcd, stcd); wrapper.set(SdWtBH::getIsDeleted, 1); wrapper.set(SdWtBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdWtBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - SdWtBH entity = this.getById(stcd); msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; } From 9155ce1804432f9ee79c78e74d88ce09af9d03e4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 10:57:02 +0800 Subject: [PATCH 03/17] =?UTF-8?q?fix:=20=E9=B1=BC=E7=B1=BB=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdFishDictoryBController.java | 165 +++++++++++++++--- .../qgc_base/domain/SdFishDictoryB.java | 2 +- 2 files changed, 145 insertions(+), 22 deletions(-) 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 119fd3dd..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,5 +1,6 @@ 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; @@ -7,22 +8,29 @@ 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.SdFishDictoryB; 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 = "鱼类字典管理") @@ -34,6 +42,9 @@ public class SdFishDictoryBController { @Resource private ObjectMapper objectMapper; + @Resource + private AttachmentUploadService attachmentUploadService; + @PostMapping("/queryPageList") @Operation(summary = "分页查询鱼类字典列表(支持动态过滤和排序)") public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { @@ -44,11 +55,7 @@ public class SdFishDictoryBController { @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); } @@ -71,31 +78,84 @@ public class SdFishDictoryBController { @Log(module = "鱼类字典管理", value = "新增鱼类字典") @PostMapping("/add") @Operation(summary = "新增鱼类字典") - public ResponseResult add(@RequestBody SdEngInfoBHOperateRequest request) { - SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null - : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class); - boolean result = sdFishDictoryBService.add(entity, request == null ? null : request.getSource()); - 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 SdEngInfoBHOperateRequest request) { - SdFishDictoryB entity = request == null || request.getEngInfo() == null ? null - : objectMapper.convertValue(request.getEngInfo(), SdFishDictoryB.class); - boolean result = sdFishDictoryBService.update(entity, request == null ? null : request.getSource()); - 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(@RequestBody SdEngInfoBHOperateRequest request) { - boolean result = sdFishDictoryBService.delete( - request == null ? null : request.getIds(), - request == null ? null : request.getSource() - ); + 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("删除失败"); } @@ -106,4 +166,67 @@ public class SdFishDictoryBController { @RequestParam(required = false, defaultValue = "10") Integer limit) { return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit)); } + + // ==================== 文件处理辅助方法 ==================== + + /** + * 上传文件并追加附件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/domain/SdFishDictoryB.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFishDictoryB.java index 9ea09725..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; /** From 964c1d3a416fed1b71a2fdc87a8b2e33257cc68e Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 11:13:04 +0800 Subject: [PATCH 04/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=AD=98=E5=82=A8=E8=AE=B0=E5=BD=95id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/service/IMsOperationLogService.java | 6 +++--- .../service/impl/MsEiaApprovalBServiceImpl.java | 6 +++--- .../service/impl/MsOperationLogServiceImpl.java | 12 ++++++------ .../service/impl/MsWarnRuleBServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdAiboxBHServiceImpl.java | 6 +++--- .../service/impl/SdAimonitorBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdArtsgBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdDwBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdEqBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdFbrdBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdFhbtBHServiceImpl.java | 6 +++--- .../service/impl/SdFishDictoryBServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdFpssBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdOpinfoBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdOtteBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdOtweBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdSonarBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdTeBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdVaBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdVdinfoBServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdVpBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdWeBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdWqBHServiceImpl.java | 6 +++--- .../qgc_base/service/impl/SdWtBHServiceImpl.java | 6 +++--- 24 files changed, 75 insertions(+), 75 deletions(-) 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/impl/MsEiaApprovalBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsEiaApprovalBServiceImpl.java index 1efc9427..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 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/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 8040596c..7e50fa11 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -38,7 +38,7 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java index 0e70ad66..6da771b6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdAimonitorBHServiceImpl.java @@ -59,7 +59,7 @@ public class SdAimonitorBHServiceImpl extends ServiceImpl 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdDwBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdDwBHServiceImpl.java index 543dc6c1..32bf57be 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdDwBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdDwBHServiceImpl.java @@ -68,7 +68,7 @@ public class SdDwBHServiceImpl extends ServiceImpl impleme public boolean add(SdDwBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -79,7 +79,7 @@ public class SdDwBHServiceImpl extends ServiceImpl impleme SdDwBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -97,7 +97,7 @@ public class SdDwBHServiceImpl extends ServiceImpl impleme wrapper.set(SdDwBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdDwBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java index bd66d779..bc2810f7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEqBHServiceImpl.java @@ -68,7 +68,7 @@ public class SdEqBHServiceImpl extends ServiceImpl impleme public boolean add(SdEqBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -79,7 +79,7 @@ public class SdEqBHServiceImpl extends ServiceImpl impleme SdEqBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -97,7 +97,7 @@ public class SdEqBHServiceImpl extends ServiceImpl impleme wrapper.set(SdEqBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdEqBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java index c1a4b14e..3c2b4fa6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFbrdBHServiceImpl.java @@ -65,7 +65,7 @@ public class SdFbrdBHServiceImpl extends ServiceImpl i public boolean add(SdFbrdBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -76,7 +76,7 @@ public class SdFbrdBHServiceImpl extends ServiceImpl i SdFbrdBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -89,7 +89,7 @@ public class SdFbrdBHServiceImpl extends ServiceImpl i for (String stcd : stcds) { SdFbrdBH entity = this.getById(stcd); if (this.removeById(stcd)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java index 3f3fe0d8..f30de316 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFhbtBHServiceImpl.java @@ -69,7 +69,7 @@ public class SdFhbtBHServiceImpl extends ServiceImpl i public boolean add(SdFhbtBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -80,7 +80,7 @@ public class SdFhbtBHServiceImpl extends ServiceImpl i SdFhbtBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -98,7 +98,7 @@ public class SdFhbtBHServiceImpl extends ServiceImpl i wrapper.set(SdFhbtBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdFhbtBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java index 75c70e1a..638f9f89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFishDictoryBServiceImpl.java @@ -76,7 +76,7 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl i boolean result = save(entity); if (result) { // msOperationLogService.recordOperationLog(TABLE_NAME, entity.getStcd(), "新增", source); - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -226,7 +226,7 @@ public class SdFpssBHServiceImpl extends ServiceImpl i SdFpssBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -266,7 +266,7 @@ public class SdFpssBHServiceImpl extends ServiceImpl i wrapper.set(SdFpssBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdFpssBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java index 608fd0fb..3b26ccdc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOpinfoBHServiceImpl.java @@ -69,7 +69,7 @@ public class SdOpinfoBHServiceImpl extends ServiceImpl i public boolean add(SdOtteBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -78,7 +78,7 @@ public class SdOtteBHServiceImpl extends ServiceImpl i SdOtteBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -91,7 +91,7 @@ public class SdOtteBHServiceImpl extends ServiceImpl i for (String stcd : stcds) { SdOtteBH entity = this.getById(stcd); if (this.removeById(stcd)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java index fb95a8b8..5e976264 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java @@ -66,7 +66,7 @@ public class SdOtweBHServiceImpl extends ServiceImpl i public boolean add(SdOtweBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -77,7 +77,7 @@ public class SdOtweBHServiceImpl extends ServiceImpl i SdOtweBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -90,7 +90,7 @@ public class SdOtweBHServiceImpl extends ServiceImpl i for (String stcd : stcds) { SdOtweBH entity = this.getById(stcd); if (this.removeById(stcd)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java index 76a947b1..4afd5f69 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java @@ -70,7 +70,7 @@ public class SdSonarBHServiceImpl extends ServiceImpl impleme public boolean add(SdTeBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -77,7 +77,7 @@ public class SdTeBHServiceImpl extends ServiceImpl impleme SdTeBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -90,7 +90,7 @@ public class SdTeBHServiceImpl extends ServiceImpl impleme for (String stcd : stcds) { SdTeBH entity = this.getById(stcd); if (this.removeById(stcd)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java index 3c287f8c..521cb6cc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java @@ -67,7 +67,7 @@ public class SdVaBHServiceImpl extends ServiceImpl impleme public boolean add(SdVaBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -78,7 +78,7 @@ public class SdVaBHServiceImpl extends ServiceImpl impleme SdVaBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -96,7 +96,7 @@ public class SdVaBHServiceImpl extends ServiceImpl impleme wrapper.set(SdVaBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdVaBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java index 5dbc0523..b414dcfb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java @@ -71,7 +71,7 @@ public class SdVdinfoBServiceImpl extends ServiceImpl 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVpBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVpBHServiceImpl.java index 6ec07561..c89dc3cc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVpBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVpBHServiceImpl.java @@ -67,7 +67,7 @@ public class SdVpBHServiceImpl extends ServiceImpl impleme public boolean add(SdVpBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); } + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -77,7 +77,7 @@ public class SdVpBHServiceImpl extends ServiceImpl impleme SdVpBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -95,7 +95,7 @@ public class SdVpBHServiceImpl extends ServiceImpl impleme wrapper.set(SdVpBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdVpBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java index c4286a99..e5936adf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWeBHServiceImpl.java @@ -68,7 +68,7 @@ public class SdWeBHServiceImpl extends ServiceImpl impleme public boolean add(SdWeBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); } + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -78,7 +78,7 @@ public class SdWeBHServiceImpl extends ServiceImpl impleme SdWeBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -91,7 +91,7 @@ public class SdWeBHServiceImpl extends ServiceImpl impleme for (String stcd : stcds) { SdWeBH entity = this.getById(stcd); if (this.removeById(stcd)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java index 2d19db74..20eb8bd2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWqBHServiceImpl.java @@ -70,7 +70,7 @@ public class SdWqBHServiceImpl extends ServiceImpl impleme public boolean add(SdWqBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); } + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -80,7 +80,7 @@ public class SdWqBHServiceImpl extends ServiceImpl impleme SdWqBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -98,7 +98,7 @@ public class SdWqBHServiceImpl extends ServiceImpl impleme wrapper.set(SdWqBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdWqBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); count++; + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } return count > 0; diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java index c428b71c..c82548fe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdWtBHServiceImpl.java @@ -72,7 +72,7 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme public boolean add(SdWtBH entity, String source) { boolean result = this.save(entity); if (result) { - msOperationLogService.recordAddDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordAddDetailLog(entity.getStcd(),TABLE_NAME, entity, source); } return result; } @@ -83,7 +83,7 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme SdWtBH before = this.getById(entity.getStcd()); boolean result = this.updateById(entity); if (result && before != null) { - msOperationLogService.recordModifyDetailLog(TABLE_NAME, before, entity, source); + msOperationLogService.recordModifyDetailLog(entity.getStcd(),TABLE_NAME, before, entity, source); } return result; } @@ -101,7 +101,7 @@ public class SdWtBHServiceImpl extends ServiceImpl impleme wrapper.set(SdWtBH::getDeleteUser, SecurityUtils.getCurrentUsername()); wrapper.set(SdWtBH::getDeleteTime, new Date()); if (this.update(wrapper)) { - msOperationLogService.recordDeleteDetailLog(TABLE_NAME, entity, source); + msOperationLogService.recordDeleteDetailLog(stcd,TABLE_NAME, entity, source); count++; } } From f7de51f6d25793459d00c747047effcda6dfe9f7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 11:32:37 +0800 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdFpssrlRController.java | 124 ++++++++++++ .../platform/qgc_base/domain/SdFpssrlR.java | 180 ++++++++++++++++++ .../qgc_base/domain/SdFpssrlRAiRequest.java | 120 ++++++++++++ .../qgc_base/mapper/SdFpssrlRMapper.java | 14 ++ .../qgc_base/service/ISdFpssrlRService.java | 47 +++++ .../service/impl/SdFpssrlRServiceImpl.java | 129 +++++++++++++ 6 files changed, 614 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssrlRController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlR.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFpssrlRService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java 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..4883f43f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdFpssrlRController.java @@ -0,0 +1,124 @@ +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 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 java.util.List; + +/** + *

+ * 过鱼设施自动数据表(AI识别) 前端控制器 + *

+ */ +@Slf4j +@RestController +@RequestMapping("/base/fpssrlR") +@Tag(name = "过鱼设施自动数据管理") +public class SdFpssrlRController { + + @Resource + private ISdFpssrlRService sdFpssrlRService; + + @Resource + private ObjectMapper objectMapper; + + // ==================== 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设备识别数据上报接口 + * 接收AI设备自动识别的过鱼数据并入库 + */ + @PostMapping("/ai/report") + @Operation(summary = "AI设备识别数据上报") + public ResponseResult aiReport(@RequestBody SdFpssrlRAiRequest request) { + if (request == null) { + return ResponseResult.error("请求数据不能为空"); + } + if (request.getStcd() == null || request.getStcd().isEmpty()) { + return ResponseResult.error("过鱼设施编码(stcd)不能为空"); + } + if (request.getTm() == null) { + return ResponseResult.error("识别时间(tm)不能为空"); + } + if (request.getFtp() == null || request.getFtp().isEmpty()) { + return ResponseResult.error("鱼种类(ftp)不能为空"); + } + + try { + SdFpssrlR entity = sdFpssrlRService.processAiReport(request); + if (entity != null) { + return ResponseResult.successData(entity.getId()); + } else { + return ResponseResult.error("数据保存失败"); + } + } 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/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..37b9c3e4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/SdFpssrlRAiRequest.java @@ -0,0 +1,120 @@ +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; +} 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..6998c983 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/SdFpssrlRMapper.java @@ -0,0 +1,14 @@ +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; + +/** + *

+ * 过鱼设施自动数据表 Mapper 接口 + *

+ */ +@Mapper +public interface SdFpssrlRMapper extends BaseMapper { +} 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..4c129542 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdFpssrlRService.java @@ -0,0 +1,47 @@ +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); +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java new file mode 100644 index 00000000..04eb0406 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java @@ -0,0 +1,129 @@ +package com.yfd.platform.qgc_base.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.qgc_base.domain.SdFpssrlR; +import com.yfd.platform.qgc_base.domain.SdFpssrlRAiRequest; +import com.yfd.platform.qgc_base.mapper.SdFpssrlRMapper; +import com.yfd.platform.qgc_base.service.IMsOperationLogService; +import com.yfd.platform.qgc_base.service.ISdFpssrlRService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 过鱼设施自动数据表 服务实现类 + *

+ */ +@Slf4j +@Service +public class SdFpssrlRServiceImpl extends ServiceImpl implements ISdFpssrlRService { + + private static final String TABLE_NAME = "SD_FPSSRL_R"; + + @Resource + private IMsOperationLogService msOperationLogService; + + @Override + public Page queryPageList(DataSourceRequest request) { + return DataSourceRequestUtil.executeQuery(request, SdFpssrlR.class, this); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(SdFpssrlR entity, String source) { + boolean result = this.save(entity); +// if (result) { +// msOperationLogService.recordAddDetailLog(entity.getId(),TABLE_NAME, entity, source); +// } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean update(SdFpssrlR entity, String source) { +// SdFpssrlR before = this.getById(entity.getId()); + boolean result = this.updateById(entity); +// if (result && before != null) { +// msOperationLogService.recordModifyDetailLog(entity.getId(),TABLE_NAME, before, entity, source); +// } + return result; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean delete(List ids, String source) { + if (ids == null || ids.isEmpty()) return false; + int count = 0; + for (String id : ids) { +// SdFpssrlR entity = getById(id); + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(SdFpssrlR::getId, id); + wrapper.set(SdFpssrlR::getIsDeleted, 1); + wrapper.set(SdFpssrlR::getDeleteUser, SecurityUtils.getCurrentUsername()); + wrapper.set(SdFpssrlR::getDeleteTime, new Date()); + if (this.update(wrapper)) { +// msOperationLogService.recordDeleteDetailLog(id,TABLE_NAME, entity, source); + count++; + } + } + return count > 0; + } + + @Override + public SdFpssrlR getById(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdFpssrlR::getId, id) + .eq(SdFpssrlR::getIsDeleted, 0); + return getOne(wrapper); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public SdFpssrlR processAiReport(SdFpssrlRAiRequest request) { + SdFpssrlR entity = new SdFpssrlR(); + entity.setStcd(request.getStcd()); + entity.setTm(request.getTm()); + entity.setFtp(request.getFtp()); + entity.setFcnt(request.getFcnt() != null ? request.getFcnt() : 1); + entity.setFsz(request.getFsz()); + entity.setLength(request.getLength()); + entity.setWidth(request.getWidth()); + entity.setFishspeed(request.getFishspeed()); + entity.setDirection(request.getDirection()); + entity.setFishposition(request.getFishposition()); + entity.setFirstImgUrl(request.getFirstImgUrl()); + entity.setSecondImgUrl(request.getSecondImgUrl()); + entity.setVideoUrl(request.getVideoUrl()); + entity.setTemperature(request.getTemperature()); + entity.setWaterlevel(request.getWaterlevel()); + entity.setSpeed(request.getSpeed()); + entity.setQ(request.getQ()); + entity.setDox(request.getDox()); + entity.setTu(request.getTu()); + entity.setChannelno(StrUtil.isNotBlank(request.getChannelno()) ? request.getChannelno() : "主通道"); + entity.setRecordUser("AI_SYSTEM"); + entity.setRecordTime(new Date()); + entity.setIsDeleted(0); + entity.setRemark(request.getRemark()); + + boolean result = this.save(entity); + if (result) { + log.info("AI识别数据保存成功, id={}, stcd={}, ftp={}", entity.getId(), entity.getStcd(), entity.getFtp()); + } else { + log.error("AI识别数据保存失败, stcd={}, ftp={}", request.getStcd(), request.getFtp()); + } + return result ? entity : null; + } +} From aa8013fdb48300088a09331a3e05816b4024106f Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 13:51:46 +0800 Subject: [PATCH 06/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdFpssrlRController.java | 78 ++++++++++++++----- .../qgc_base/service/ISdFpssrlRService.java | 7 +- .../service/impl/SdFpssrlRServiceImpl.java | 27 +++++-- 3 files changed, 85 insertions(+), 27 deletions(-) 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 index 4883f43f..ae195913 100644 --- 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 @@ -9,13 +9,17 @@ 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; /** *

@@ -34,6 +38,9 @@ public class SdFpssrlRController { @Resource private ObjectMapper objectMapper; + @Resource + private AttachmentUploadService attachmentUploadService; + // ==================== CRUD 方法 ==================== @PostMapping("/queryPageList") @@ -90,34 +97,65 @@ public class SdFpssrlRController { // ==================== AI 设备识别数据上报接口 ==================== /** - * AI设备识别数据上报接口 - * 接收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 SdFpssrlRAiRequest request) { - if (request == null) { + @Operation(summary = "AI设备识别数据上报(支持批量)") + public ResponseResult aiReport(@RequestBody List requests) { + if (requests == null || requests.isEmpty()) { return ResponseResult.error("请求数据不能为空"); } - if (request.getStcd() == null || request.getStcd().isEmpty()) { - return ResponseResult.error("过鱼设施编码(stcd)不能为空"); - } - if (request.getTm() == null) { - return ResponseResult.error("识别时间(tm)不能为空"); - } - if (request.getFtp() == null || request.getFtp().isEmpty()) { - return ResponseResult.error("鱼种类(ftp)不能为空"); + + // 逐条校验 + 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 { - SdFpssrlR entity = sdFpssrlRService.processAiReport(request); - if (entity != null) { - return ResponseResult.successData(entity.getId()); - } else { - return ResponseResult.error("数据保存失败"); - } + 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); + log.error("AI识别数据批量上报失败", e); return ResponseResult.error("上报失败: " + e.getMessage()); } } 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 index 4c129542..546fb5dc 100644 --- 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 @@ -41,7 +41,12 @@ public interface ISdFpssrlRService extends IService { SdFpssrlR getById(String id); /** - * 处理AI设备上报的识别数据 + * 处理AI设备上报的单条识别数据 */ SdFpssrlR processAiReport(SdFpssrlRAiRequest request); + + /** + * 批量处理AI设备上报的识别数据 + */ + List processAiReportBatch(List requests); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java index 04eb0406..4e431a88 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java @@ -18,6 +18,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -118,12 +119,26 @@ public class SdFpssrlRServiceImpl extends ServiceImpl processAiReportBatch(List requests) { + List results = new ArrayList<>(); + for (SdFpssrlRAiRequest req : requests) { + SdFpssrlR entity = processAiReport(req); + if (entity != null) { + results.add(entity); + } } - return result ? entity : null; + this.saveBatch(results); + return results; } } From a167b41404810fa49db4bd428218e27dafdaf8d1 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 14:25:39 +0800 Subject: [PATCH 07/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=BF=87=E9=B1=BC=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/SdFpssrlRAiRequest.java | 5 ++ .../qgc_base/mapper/SdFpssrlRMapper.java | 8 ++ .../service/impl/SdFpssrlRServiceImpl.java | 40 ++++++++-- .../mapper/qgc_base/SdFpssrlRMapper.xml | 80 +++++++++++++++++++ 4 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml 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 index 37b9c3e4..7b844d05 100644 --- 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 @@ -117,4 +117,9 @@ public class SdFpssrlRAiRequest { * 备注 */ private String remark; + + /** + * 附件ID(多个以逗号分隔),通过上传图片接口获取 + */ + private String fid; } 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 index 6998c983..1fce31a6 100644 --- 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 @@ -4,6 +4,8 @@ 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 接口 @@ -11,4 +13,10 @@ import org.apache.ibatis.annotations.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/impl/SdFpssrlRServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java index 4e431a88..2b658fb2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdFpssrlRServiceImpl.java @@ -131,14 +131,40 @@ public class SdFpssrlRServiceImpl extends ServiceImpl processAiReportBatch(List requests) { - List results = new ArrayList<>(); + List entities = new ArrayList<>(); + Date now = new Date(); for (SdFpssrlRAiRequest req : requests) { - SdFpssrlR entity = processAiReport(req); - if (entity != null) { - results.add(entity); - } + SdFpssrlR entity = new SdFpssrlR(); + entity.setStcd(req.getStcd()); + entity.setTm(req.getTm()); + entity.setFtp(req.getFtp()); + entity.setFcnt(req.getFcnt() != null ? req.getFcnt() : 1); + entity.setFsz(req.getFsz()); + entity.setLength(req.getLength()); + entity.setWidth(req.getWidth()); + entity.setFishspeed(req.getFishspeed()); + entity.setDirection(req.getDirection()); + entity.setFishposition(req.getFishposition()); + entity.setFirstImgUrl(req.getFirstImgUrl()); + entity.setSecondImgUrl(req.getSecondImgUrl()); + entity.setVideoUrl(req.getVideoUrl()); + entity.setTemperature(req.getTemperature()); + entity.setWaterlevel(req.getWaterlevel()); + entity.setSpeed(req.getSpeed()); + entity.setQ(req.getQ()); + entity.setDox(req.getDox()); + entity.setTu(req.getTu()); + entity.setChannelno(StrUtil.isNotBlank(req.getChannelno()) ? req.getChannelno() : "主通道"); + entity.setFid(req.getFid()); + entity.setRemark(req.getRemark()); + entity.setRecordUser("AI_SYSTEM"); + entity.setRecordTime(now); + entity.setModifyUser("AI_SYSTEM"); + entity.setModifyTime(now); + entity.setIsDeleted(0); + entities.add(entity); } - this.saveBatch(results); - return results; + baseMapper.mergeFishRecords(entities); + return entities; } } diff --git a/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml new file mode 100644 index 00000000..f029bced --- /dev/null +++ b/backend/src/main/resources/mapper/qgc_base/SdFpssrlRMapper.xml @@ -0,0 +1,80 @@ + + + + + + + MERGE INTO SD_FPSSRL_R T + USING ( + + SELECT + #{obj.stcd, jdbcType=VARCHAR} AS STCD, + #{obj.tm, jdbcType=TIMESTAMP} AS TM, + #{obj.ftp, jdbcType=VARCHAR} AS FTP, + #{obj.fcnt, jdbcType=INTEGER} AS FCNT, + #{obj.fsz, jdbcType=VARCHAR} AS FSZ, + #{obj.length, jdbcType=DECIMAL} AS LENGTH, + #{obj.width, jdbcType=DECIMAL} AS WIDTH, + #{obj.fishspeed, jdbcType=VARCHAR} AS FISHSPEED, + #{obj.direction, jdbcType=INTEGER} AS DIRECTION, + #{obj.fishposition, jdbcType=DECIMAL} AS FISHPOSITION, + #{obj.firstImgUrl, jdbcType=VARCHAR} AS FIRSTIMGURL, + #{obj.secondImgUrl, jdbcType=VARCHAR} AS SECONDIMGURL, + #{obj.videoUrl, jdbcType=VARCHAR} AS VIDEOURL, + #{obj.temperature, jdbcType=DECIMAL} AS TEMPERATURE, + #{obj.waterlevel, jdbcType=DECIMAL} AS WATERLEVEL, + #{obj.speed, jdbcType=DECIMAL} AS SPEED, + #{obj.q, jdbcType=DECIMAL} AS Q, + #{obj.dox, jdbcType=DECIMAL} AS DOX, + #{obj.tu, jdbcType=INTEGER} AS TU, + #{obj.channelno, jdbcType=VARCHAR} AS CHANNELNO, + #{obj.fid, jdbcType=VARCHAR} AS FID, + #{obj.remark, jdbcType=VARCHAR} AS REMARK, + #{obj.recordUser, jdbcType=VARCHAR} AS RECORD_USER, + #{obj.modifyUser, jdbcType=VARCHAR} AS MODIFY_USER + FROM DUAL + + ) S + ON (T.STCD = S.STCD AND T.TM = S.TM AND T.FTP = S.FTP AND T.IS_DELETED = 0) + WHEN MATCHED THEN + UPDATE SET + T.FCNT = S.FCNT, + T.FSZ = S.FSZ, + T.LENGTH = S.LENGTH, + T.WIDTH = S.WIDTH, + T.FISHSPEED = S.FISHSPEED, + T.DIRECTION = S.DIRECTION, + T.FISHPOSITION = S.FISHPOSITION, + T.FIRSTIMGURL = S.FIRSTIMGURL, + T.SECONDIMGURL = S.SECONDIMGURL, + T.VIDEOURL = S.VIDEOURL, + T.TEMPERATURE = S.TEMPERATURE, + T.WATERLEVEL = S.WATERLEVEL, + T.SPEED = S.SPEED, + T.Q = S.Q, + T.DOX = S.DOX, + T.TU = S.TU, + T.CHANNELNO = S.CHANNELNO, + T.FID = S.FID, + T.REMARK = S.REMARK, + T.MODIFY_USER = S.MODIFY_USER, + T.MODIFY_TIME = SYSDATE + WHEN NOT MATCHED THEN + INSERT ( + ID, STCD, TM, FTP, FCNT, FSZ, LENGTH, WIDTH, FISHSPEED, + DIRECTION, FISHPOSITION, FIRSTIMGURL, SECONDIMGURL, VIDEOURL, + TEMPERATURE, WATERLEVEL, SPEED, Q, DOX, TU, CHANNELNO, + FID, REMARK, RECORD_USER, RECORD_TIME, MODIFY_USER, MODIFY_TIME, + IS_DELETED + ) VALUES ( + SYS_GUID(), + S.STCD, S.TM, S.FTP, S.FCNT, S.FSZ, S.LENGTH, S.WIDTH, S.FISHSPEED, + S.DIRECTION, S.FISHPOSITION, S.FIRSTIMGURL, S.SECONDIMGURL, S.VIDEOURL, + S.TEMPERATURE, S.WATERLEVEL, S.SPEED, S.Q, S.DOX, S.TU, S.CHANNELNO, + S.FID, S.REMARK, S.RECORD_USER, SYSDATE, S.MODIFY_USER, SYSDATE, + 0 + ) + + + From 939a98acfa0f4cd6584ad88a45cd356ea0709101 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 22 Jul 2026 15:26:07 +0800 Subject: [PATCH 08/17] =?UTF-8?q?fix:=20=E5=9F=BA=E6=9C=AC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=97=E5=85=B8=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yfd/platform/qgc_base/domain/SdOtteBH.java | 3 +++ .../main/java/com/yfd/platform/qgc_base/domain/SdOtweBH.java | 3 +++ .../main/java/com/yfd/platform/qgc_base/domain/SdSonarBH.java | 3 +++ .../src/main/java/com/yfd/platform/qgc_base/domain/SdVaBH.java | 3 +++ .../main/java/com/yfd/platform/qgc_base/domain/SdVdinfoB.java | 3 +++ .../src/main/java/com/yfd/platform/qgc_base/domain/SdWqBH.java | 2 +- .../platform/qgc_base/service/impl/SdOtteBHServiceImpl.java | 1 + .../platform/qgc_base/service/impl/SdOtweBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdSonarBHServiceImpl.java | 1 + .../yfd/platform/qgc_base/service/impl/SdVaBHServiceImpl.java | 2 +- .../platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java | 1 + 11 files changed, 21 insertions(+), 3 deletions(-) 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/service/impl/SdOtteBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java index 81f54a9c..3e200c78 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtteBHServiceImpl.java @@ -52,6 +52,7 @@ public class SdOtteBHServiceImpl extends ServiceImpl i CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build()); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java index 5e976264..08c90eef 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdOtweBHServiceImpl.java @@ -51,7 +51,7 @@ public class SdOtweBHServiceImpl extends ServiceImpl i CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rvcd").modifyProperty("rvnm").dictType("DYNAMIC").dictSource("V_SD_RVCD_DIC_TREE").codeColumn("RVCD").nameColumn("RVNM").build()); - + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build()); } @Override diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java index 4afd5f69..33a929c7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdSonarBHServiceImpl.java @@ -55,6 +55,7 @@ public class SdSonarBHServiceImpl extends ServiceImpl impleme static { CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtin").modifyProperty("dtinName").dictType("STATIC").dictSource("DTIN").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("bldsttCode").modifyProperty("bldsttCodeName").dictType("STATIC").dictSource("BLDSTT_CODE").build()); -// CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("dtinType").modifyProperty("dtinTypeName").dictType("STATIC").dictSource("DTIN_TYPE").build()); + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("usfl").modifyProperty("usflName").dictType("STATIC").dictSource("USFL").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("sttp").modifyProperty("sttpName").dictType("DYNAMIC").dictSource("SD_STTP_B").codeColumn("STTP_CODE").nameColumn("STTP_NAME").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("baseId").modifyProperty("baseName").dictType("DYNAMIC").dictSource("SD_HYDROBASE").codeColumn("BASEID").nameColumn("BASENAME").filter("NVL(IS_DELETED, 0) = 0 ").build()); CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder().codeProperty("rstcd").modifyProperty("ennm").dictType("DYNAMIC").dictSource("SD_ENGINFO_B_H").codeColumn("STCD").nameColumn("ENNM").filter("NVL(IS_DELETED, 0) = 0 ").build()); diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java index b414dcfb..117af726 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdVdinfoBServiceImpl.java @@ -52,6 +52,7 @@ public class SdVdinfoBServiceImpl extends ServiceImpl Date: Thu, 23 Jul 2026 08:20:31 +0800 Subject: [PATCH 09/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_env/overview/service/impl/OverviewServiceImpl.java | 1 + .../cuscolumn/service/impl/MsUsercolumnBServiceImpl.java | 4 ++-- .../platform/system/controller/SysDictionaryController.java | 4 ++-- .../yfd/platform/system/service/ISysDictionaryService.java | 2 +- .../system/service/impl/SysDictionaryServiceImpl.java | 5 +++-- .../src/main/resources/mapper/system/MsUsercolumnBMapper.xml | 3 ++- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java index a84ca5a7..654b1640 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java @@ -1617,6 +1617,7 @@ public class OverviewServiceImpl implements OverviewService { case "topHynm" -> "t.TOP_HYNM"; case "lgtd" -> "t.LGTD"; case "lttd" -> "t.LTTD"; + case "url" -> "t.URL"; case "stlc" -> "t.STLC"; case "usfl" -> "t.USFL"; case "dtin" -> "t.DTIN"; diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/cuscolumn/service/impl/MsUsercolumnBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/cuscolumn/service/impl/MsUsercolumnBServiceImpl.java index 1524c95c..9c547343 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/cuscolumn/service/impl/MsUsercolumnBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/cuscolumn/service/impl/MsUsercolumnBServiceImpl.java @@ -29,7 +29,7 @@ public class MsUsercolumnBServiceImpl throw new IllegalArgumentException("模块(cfgId)不能为空"); } - String currentUser = SecurityUtils.getCurrentUsername(); + String currentUser = SecurityUtils.getUserId(); List list = userColumn.getList(); if (list != null && !list.isEmpty()) { @@ -53,7 +53,7 @@ public class MsUsercolumnBServiceImpl @Override public List getUserColumnData(MsUsercolumnB userColumn) { - String currentUser = SecurityUtils.getCurrentUsername(); + String currentUser = SecurityUtils.getUserId(); return usercolumnBMapper.getUserColumnList(currentUser, userColumn.getCfgId()); } } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java index b3db106e..b91f785c 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysDictionaryController.java @@ -43,12 +43,12 @@ public class SysDictionaryController { ***********************************/ @GetMapping("/dictList") @Operation(summary = "获取数据字典列表") - public ResponseResult getDictList(String dictType) { + public ResponseResult getDictList(String dictType,String dictName) { if (StrUtil.isBlank(dictType)) { return ResponseResult.error("参数为空"); } List sysDictionaries = - sysDictionaryService.getDictList(dictType); + sysDictionaryService.getDictList(dictType,dictName); return ResponseResult.successData(sysDictionaries); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java index 724e240e..fdcb9a14 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysDictionaryService.java @@ -20,7 +20,7 @@ public interface ISysDictionaryService extends IService { * 参数说明 dictType 字典类型 * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 ***********************************/ - List getDictList(String dictType); + List getDictList(String dictType,String dictName); /********************************** * 用途说明: 新增字典 diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java index f3e81308..19bed6c3 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysDictionaryServiceImpl.java @@ -1,5 +1,6 @@ package com.yfd.platform.system.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.core.conditions.update.LambdaUpdateWrapper; @@ -39,10 +40,10 @@ public class SysDictionaryServiceImpl extends ServiceImpl getDictList(String dictType) { + public List getDictList(String dictType,String dictName) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDictionary::getDictType, dictType).orderByAsc(SysDictionary::getOrderNo); + queryWrapper.eq(SysDictionary::getDictType, dictType).eq(StrUtil.isNotBlank(dictName),SysDictionary::getDictName, dictName).orderByAsc(SysDictionary::getOrderNo); return sysDictionaryMapper.selectList(queryWrapper); } diff --git a/backend/src/main/resources/mapper/system/MsUsercolumnBMapper.xml b/backend/src/main/resources/mapper/system/MsUsercolumnBMapper.xml index 14819390..ca72d700 100644 --- a/backend/src/main/resources/mapper/system/MsUsercolumnBMapper.xml +++ b/backend/src/main/resources/mapper/system/MsUsercolumnBMapper.xml @@ -35,7 +35,8 @@ mcb.COLUMN_EN, mcb.COLUMN_CFG AS COLUMN_NAME, CASE WHEN mub.COLUMN_EN IS NULL THEN 1 ELSE 0 END AS DEFAULT_CONFIG, - CASE WHEN mub.ENABLE IS NULL THEN mcb.ENABLE ELSE mub.ENABLE END AS ENABLE, +-- CASE WHEN mub.ENABLE IS NULL THEN mcb.ENABLE ELSE mub.ENABLE END AS ENABLE, + CASE WHEN mcb.ENABLE IS NULL THEN mub.ENABLE ELSE mcb.ENABLE END AS ENABLE, CASE WHEN mub.ORDER_INDEX IS NULL THEN mcb.ORDER_INDEX ELSE mub.ORDER_INDEX END AS ORDER_INDEX, mub.RECORD_USER, CASE WHEN mub.CHECKED IS NULL THEN mcb.DEFAULT_CHECKED ELSE mub.CHECKED END AS CHECKED, From 0dfd6d04cd9a76b8efd6182ea5d60fb5cae75085 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 08:45:00 +0800 Subject: [PATCH 10/17] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E8=A7=84=E5=88=99=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/MsWarnRuleB.java | 4 +++ .../service/impl/MsWarnRuleBServiceImpl.java | 21 +++++++++++- .../controller/MsWarnRuleBController.java | 33 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java 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/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 7e50fa11..e5e4501a 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -9,11 +9,14 @@ import com.yfd.platform.qgc_base.mapper.MsWarnRuleBMapper; import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; import com.yfd.platform.utils.DataSourceRequestUtil; +import com.yfd.platform.utils.DictCodeToNameConverter; +import com.yfd.platform.utils.CodeToNameMetadataBo; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -25,12 +28,28 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl CODE_TO_NAME_META_LIST = new ArrayList<>(); + + static { + CODE_TO_NAME_META_LIST.add(CodeToNameMetadataBo.builder() + .codeProperty("ruleType") + .modifyProperty("ruleTypeName") + .dictType("STATIC") + .dictSource("WARN_RULE_TYPE") + .build()); + } + @Resource private IMsOperationLogService msOperationLogService; + @Resource + private DictCodeToNameConverter dictCodeToNameConverter; + @Override public Page queryPageList(DataSourceRequest request) { - return DataSourceRequestUtil.executeQuery(request, MsWarnRuleB.class, this); + Page page = DataSourceRequestUtil.executeQuery(request, MsWarnRuleB.class, this); + dictCodeToNameConverter.convertCodeToName(page, CODE_TO_NAME_META_LIST); + return page; } @Override diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java new file mode 100644 index 00000000..3a82f1db --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java @@ -0,0 +1,33 @@ +package com.yfd.platform.qgc_sys.warnRule.controller; + +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.MsWarnRuleB; +import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 告警规则控制器 + */ +@Slf4j +@RestController +@RequestMapping("/sys/warnRule") +@Tag(name = "告警规则配置管理") +public class MsWarnRuleBController { + + @Resource + private IMsWarnRuleBService msWarnRuleBService; + + @PostMapping("/GetKendoListCust") + @Operation(summary = "条件过滤数据列表") + public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(msWarnRuleBService.queryPageList(dataSourceRequest)); + } +} From 3b10901fda5853e122c187245fe08383f51e6106 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 09:11:22 +0800 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E7=B1=BB=E5=9E=8B=E5=AF=B9=E5=BA=94=E7=9A=84=E8=A6=81?= =?UTF-8?q?=E7=B4=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/service/IMsWarnRuleBService.java | 6 ++ .../service/impl/MsWarnRuleBServiceImpl.java | 69 +++++++++++++++++++ .../controller/MsWarnRuleBController.java | 39 ++++++++++- .../qgc_sys/warnRule/vo/WarnYsVo.java | 29 ++++++++ 4 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnYsVo.java 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..68cba268 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,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.qgc_base.domain.MsWarnRuleB; +import com.yfd.platform.qgc_sys.warnRule.vo.WarnYsVo; import java.util.List; @@ -15,4 +16,9 @@ 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); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index e5e4501a..b86dd078 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_base.domain.MsWarnRuleB; import com.yfd.platform.qgc_base.mapper.MsWarnRuleBMapper; import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; +import com.yfd.platform.qgc_sys.warnRule.vo.WarnYsVo; import com.yfd.platform.utils.DataSourceRequestUtil; import com.yfd.platform.utils.DictCodeToNameConverter; import com.yfd.platform.utils.CodeToNameMetadataBo; @@ -18,7 +20,9 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 预警规则配置 Service 实现类 @@ -45,6 +49,9 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl queryPageList(DataSourceRequest request) { Page page = DataSourceRequestUtil.executeQuery(request, MsWarnRuleB.class, this); @@ -92,4 +99,66 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl 0; } + + @Override + public List getAllYs(String ruleType) { + String dbRuleType = getOldRuleType(ruleType); + String sql = "SELECT t2.TB_ID AS tbId, t2.YS, t3.YS_SHOW_NAME AS ysName\n" + + "FROM MS_WARN_RULE_B t1\n" + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID\n" + + "INNER JOIN ST_YS_B t3 ON t2.YS = t3.YS\n" + + "WHERE t1.RULE_TYPE = #{ruleType}\n" + + " AND t1.IS_DELETED = 0\n" + + " AND t2.IS_DELETED = 0\n" + + "GROUP BY t2.TB_ID, t2.YS, t3.YS_SHOW_NAME"; + Map paramMap = new HashMap<>(); + paramMap.put("ruleType", dbRuleType); + return microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WarnYsVo.class); + } + + /** + * 旧版规则类型枚举映射 + */ + private String getOldRuleType(String ruleType) { + if ("WQ".equals(ruleType)) { + return "WQLVL"; + } else if ("WT".equals(ruleType)) { + return "WTMN"; + } else if ("QGC".equals(ruleType)) { + return "EQMN"; + } else if ("RZ".equals(ruleType)) { + return "RSVRFSR"; + } + return ruleType; + } + + /** + * 从 DataSourceRequest 过滤条件中提取指定字段的值 + */ + private String getFilterFieldValue(DataSourceRequest request, String fieldName) { + if (request == null || request.getFilter() == null) { + return null; + } + return findFilterValue(request.getFilter(), fieldName); + } + + private String findFilterValue(DataSourceRequest.FilterDescriptor filter, String fieldName) { + if (filter == null) { + return null; + } + // 直接匹配 + if (fieldName.equals(filter.getField()) && filter.getValue() != null) { + return filter.getValue().toString(); + } + // 递归子过滤器 + if (filter.getFilters() != null) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterValue(child, fieldName); + if (value != null) { + return value; + } + } + } + return null; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java index 3a82f1db..8ce549d4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java @@ -2,7 +2,6 @@ package com.yfd.platform.qgc_sys.warnRule.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.qgc_base.domain.MsWarnRuleB; import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -30,4 +29,42 @@ public class MsWarnRuleBController { public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(msWarnRuleBService.queryPageList(dataSourceRequest)); } + + @PostMapping("/ysList") + @Operation(summary = "获取告警类型对应的要素") + public ResponseResult getAllYs(@RequestBody DataSourceRequest dataSourceRequest) { + String ruleType = getFilterFieldValue(dataSourceRequest, "ruleType"); + if (ruleType == null || ruleType.isEmpty()) { + return ResponseResult.error("ruleType 不能为空"); + } + return ResponseResult.successData(msWarnRuleBService.getAllYs(ruleType)); + } + + /** + * 从 DataSourceRequest 过滤条件中提取指定字段的值 + */ + private String getFilterFieldValue(DataSourceRequest request, String fieldName) { + if (request == null || request.getFilter() == null) { + return null; + } + return findFilterValue(request.getFilter(), fieldName); + } + + private String findFilterValue(DataSourceRequest.FilterDescriptor filter, String fieldName) { + if (filter == null) { + return null; + } + if (fieldName.equals(filter.getField()) && filter.getValue() != null) { + return filter.getValue().toString(); + } + if (filter.getFilters() != null) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterValue(child, fieldName); + if (value != null) { + return value; + } + } + } + return null; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnYsVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnYsVo.java new file mode 100644 index 00000000..6c83c04d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnYsVo.java @@ -0,0 +1,29 @@ +package com.yfd.platform.qgc_sys.warnRule.vo; + +import lombok.Data; +import java.math.BigDecimal; + +/** + * 告警类型对应的要素VO + */ +@Data +public class WarnYsVo { + + /** 监测表id */ + private String tbId; + + /** 要素编码 */ + private String ys; + + /** 要素名称 */ + private String ysName; + + /** 最小值 */ + private BigDecimal minVal; + + /** 最大值 */ + private BigDecimal maxVal; + + /** 描述 */ + private String mark; +} From 0d8bc39af6d630470d9bc7b79fe53d31b5ad887a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 10:12:48 +0800 Subject: [PATCH 12/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yfd/platform/config/SwaggerConfig.java | 8 ++++++++ .../qgc_base/service/impl/MsWarnRuleBServiceImpl.java | 3 +-- .../warnRule/controller/MsWarnRuleBController.java | 2 ++ .../yfd/platform/system/controller/SysMenuController.java | 6 ++++++ 4 files changed, 17 insertions(+), 2 deletions(-) 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..00088d47 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,14 @@ 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 groupLygkApi() { diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index b86dd078..6f4fd70d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -107,12 +107,11 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl paramMap = new HashMap<>(); - paramMap.put("ruleType", dbRuleType); return microservicDynamicSQLMapper.getAllListWithResultType(sql, paramMap, WarnYsVo.class); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java index 8ce549d4..c1c516c7 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java @@ -7,6 +7,7 @@ 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.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/sys/warnRule") @Tag(name = "告警规则配置管理") +@Controller("msWarnRuleBControllerSys") public class MsWarnRuleBController { @Resource diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java index dea76c02..bb4f90c6 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysMenuController.java @@ -149,6 +149,9 @@ public class SysMenuController { public ResponseResult addMenu(@RequestBody SysMenu sysMenu, @RequestHeader(value = "Tenant_id", required = false) String tenantId) { sysMenu.setTenantId(StrUtil.trimToNull(tenantId)); + if(StrUtil.isBlank(sysMenu.getTenantId())){ + sysMenu.setTenantId(sysMenu.getSystemcode()); + } boolean isOk = sysMenuService.addMenu(sysMenu); if (isOk) { return ResponseResult.success(); @@ -176,6 +179,9 @@ public class SysMenuController { return ResponseResult.error("未找到对应租户的菜单"); } sysMenu.setTenantId(StrUtil.trimToNull(tenantId)); + if(StrUtil.isBlank(sysMenu.getTenantId())){ + sysMenu.setTenantId(sysMenu.getSystemcode()); + } sysMenu.setLastmodifier(userService.getUsername()); sysMenu.setLastmodifydate(new Timestamp(System.currentTimeMillis())); boolean isOk = sysMenuService.updateById(sysMenu); From aec144ccf381f2064bc56ac653f6d1ada2b48339 Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 11:50:31 +0800 Subject: [PATCH 13/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/service/impl/MsWarnRuleBServiceImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 6f4fd70d..037f0ef9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -107,7 +107,7 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl Date: Thu, 23 Jul 2026 14:41:52 +0800 Subject: [PATCH 14/17] =?UTF-8?q?feat:=20=E9=A2=84=E8=AD=A6=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qgc_base/domain/MsWarnRuleDetailB.java | 90 ++++ .../qgc_base/domain/MsWarnRuleStbprpB.java | 59 +++ .../qgc_base/mapper/MsWarnRuleBMapper.java | 35 ++ .../mapper/MsWarnRuleDetailBMapper.java | 10 + .../mapper/MsWarnRuleStbprpBMapper.java | 23 + .../qgc_base/service/IMsWarnRuleBService.java | 48 ++ .../service/impl/MsWarnRuleBServiceImpl.java | 486 +++++++++++++++++- .../controller/MsWarnRuleBController.java | 74 ++- .../qgc_sys/warnRule/vo/MsWarnRuleBVo.java | 69 +++ .../warnRule/vo/MsWarnRuleDetailVo.java | 24 + .../qgc_sys/warnRule/vo/WarnRuleVo.java | 18 + .../platform/utils/DataSourceRequestUtil.java | 25 +- 12 files changed, 940 insertions(+), 21 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleDetailB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsWarnRuleStbprpB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleDetailBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleStbprpBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleBVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleDetailVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnRuleVo.java 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/mapper/MsWarnRuleBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsWarnRuleBMapper.java index 65897007..242f0f4d 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,41 @@ 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 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); + + @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 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/service/IMsWarnRuleBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsWarnRuleBService.java index 68cba268..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,9 +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 接口 @@ -21,4 +24,49 @@ public interface IMsWarnRuleBService extends IService { * 获取告警类型对应的要素列表 */ 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/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 037f0ef9..800651e4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -1,28 +1,38 @@ package com.yfd.platform.qgc_base.service.impl; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.qgc_base.domain.MsWarnRuleB; +import com.yfd.platform.qgc_base.domain.MsWarnRuleDetailB; +import com.yfd.platform.qgc_base.domain.MsWarnRuleStbprpB; import com.yfd.platform.qgc_base.mapper.MsWarnRuleBMapper; +import com.yfd.platform.qgc_base.mapper.MsWarnRuleDetailBMapper; +import com.yfd.platform.qgc_base.mapper.MsWarnRuleStbprpBMapper; import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; +import com.yfd.platform.qgc_sys.warnRule.vo.MsWarnRuleBVo; +import com.yfd.platform.qgc_sys.warnRule.vo.MsWarnRuleDetailVo; +import com.yfd.platform.qgc_sys.warnRule.vo.WarnRuleVo; import com.yfd.platform.qgc_sys.warnRule.vo.WarnYsVo; import com.yfd.platform.utils.DataSourceRequestUtil; import com.yfd.platform.utils.DictCodeToNameConverter; import com.yfd.platform.utils.CodeToNameMetadataBo; 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.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; /** * 预警规则配置 Service 实现类 @@ -52,6 +62,12 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl queryPageList(DataSourceRequest request) { Page page = DataSourceRequestUtil.executeQuery(request, MsWarnRuleB.class, this); @@ -64,7 +80,7 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl detail = vo.getDetail(); + Integer lvl = null; + if (!CollectionUtils.isEmpty(detail) && detail.get(0) != null && detail.get(0).getLvl() != null) { + lvl = Integer.parseInt(detail.get(0).getLvl()); + } + + List detailBList = new ArrayList<>(); + AtomicInteger i = new AtomicInteger(); + if (detail != null) { + for (MsWarnRuleDetailVo detailVo : detail) { + List ysList = detailVo.getYsList(); + if (ysList != null) { + for (WarnYsVo ysVo : ysList) { + i.getAndIncrement(); + MsWarnRuleDetailB detailB = new MsWarnRuleDetailB(); + detailB.setRuleId(vo.getId()); + detailB.setTbId(ysVo.getTbId()); + detailB.setYs(ysVo.getYs()); + detailB.setWarnLevel(detailVo.getWarnLevel()); + detailB.setLvl(detailVo.getLvl() != null ? Integer.parseInt(detailVo.getLvl()) : null); + DateTime dateTime = DateUtil.offsetSecond(new Date(), i.get()); + detailB.setTm(dateTime); + detailB.setRecordUser(SecurityUtils.getCurrentUsername()); + detailB.setRecordTime(dateTime); + detailB.setIsDeleted(0); + detailBList.add(detailB); + } + } + } + } + + if (StringUtils.isBlank(vo.getId())) { + // ---- 新增 ---- + entity.setRecordUser(SecurityUtils.getCurrentUsername()); + if ("common".equals(vo.getRuleCode())) { + boolean exist = checkRuleExist(vo.getRuleType(), lvl); + if (exist) { + throw new RuntimeException("该预警类型的通用规则已存在"); + } + } + if (StringUtils.isBlank(vo.getRuleName()) && "custom".equals(vo.getRuleCode())) { + String ruleName = getCustomRuleName(vo.getStcd(), vo.getStnm()); + entity.setRuleName(ruleName); + } + entity.setModifyTime(new Date()); + this.baseMapper.insert(entity); + if (StringUtils.isNotBlank(entity.getStcd())) { + this.baseMapper.updateStcd(entity.getStcd(), entity.getId()); + } + for (MsWarnRuleDetailB detailB : detailBList) { + detailB.setRuleId(entity.getId()); + msWarnRuleDetailBMapper.insert(detailB); + } + // 新增测站与规则绑定 + if (StringUtils.isNotBlank(vo.getStcd())) { + MsWarnRuleStbprpB existing = msWarnRuleStbprpBMapper.getBindRuleByStcd(vo.getStcd(), vo.getRuleType()); + MsWarnRuleStbprpB binding = new MsWarnRuleStbprpB(); + binding.setRuleId(entity.getId()); + binding.setStcd(vo.getStcd()); + binding.setSttpId(vo.getSttpId()); + binding.setRecordUser(SecurityUtils.getCurrentUsername()); + binding.setRecordTime(new Date()); + binding.setIsDeleted(0); + if (existing == null) { + msWarnRuleStbprpBMapper.insert(binding); + } else { + binding.setId(existing.getId()); + msWarnRuleStbprpBMapper.updateById(binding); + } + } + msOperationLogService.recordAddDetailLog(entity.getId(), TABLE_NAME, entity, "warningRule"); + } else { + // ---- 修改 ---- + this.baseMapper.updateById(entity); + // 删除旧要素配置 + if (detail != null) { + for (MsWarnRuleDetailVo detailVo : detail) { + Set ysSet = detailVo.getYsList().stream().map(WarnYsVo::getYs).collect(Collectors.toSet()); + if (!CollectionUtils.isEmpty(ysSet)) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsWarnRuleDetailB::getRuleId, entity.getId()); + if (detailVo.getWarnLevel() != null) { + wrapper.eq(MsWarnRuleDetailB::getWarnLevel, detailVo.getWarnLevel()); + } + wrapper.in(MsWarnRuleDetailB::getYs, ysSet); + msWarnRuleDetailBMapper.delete(wrapper); + } + } + } + // 新增要素配置 + for (MsWarnRuleDetailB detailB : detailBList) { + msWarnRuleDetailBMapper.insert(detailB); + } + // 更新测站与规则绑定 + if (StringUtils.isNotBlank(vo.getStcd())) { + MsWarnRuleStbprpB existing = msWarnRuleStbprpBMapper.getBindRuleByStcd(vo.getStcd(), vo.getRuleType()); + MsWarnRuleStbprpB binding = new MsWarnRuleStbprpB(); + binding.setSttpId(vo.getSttpId()); + binding.setStcd(vo.getStcd()); + binding.setRuleId(vo.getId()); + binding.setRecordUser(SecurityUtils.getCurrentUsername()); + binding.setRecordTime(new Date()); + binding.setIsDeleted(0); + if (existing == null) { + msWarnRuleStbprpBMapper.insert(binding); + } else { + binding.setId(existing.getId()); + msWarnRuleStbprpBMapper.updateById(binding); + } + } + MsWarnRuleB before = this.getById(entity.getId()); + msOperationLogService.recordModifyDetailLog(entity.getId(), TABLE_NAME, before, entity, "warningRule"); + } + + // 修改 isShow + updateShow(vo.getIsShow()); + return entity; + } + + @Override + public boolean check(String id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsWarnRuleStbprpB::getRuleId, id); + return msWarnRuleStbprpBMapper.selectCount(wrapper) > 0; + } + + @Override + public void deleteBind(String id) { + msWarnRuleStbprpBMapper.deleteBind(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteRule(String id) { + // 删除要素配置 + LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); + detailWrapper.eq(MsWarnRuleDetailB::getRuleId, id); + msWarnRuleDetailBMapper.delete(detailWrapper); + + // 删除规则绑定 + LambdaQueryWrapper bindWrapper = new LambdaQueryWrapper<>(); + bindWrapper.eq(MsWarnRuleStbprpB::getRuleId, id); + msWarnRuleStbprpBMapper.delete(bindWrapper); + + // 逻辑删除规则主表 + MsWarnRuleB entity = this.getById(id); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(MsWarnRuleB::getId, id); + updateWrapper.set(MsWarnRuleB::getIsDeleted, 1); + updateWrapper.set(MsWarnRuleB::getDeleteUser, SecurityUtils.getCurrentUsername()); + updateWrapper.set(MsWarnRuleB::getDeleteTime, new Date()); + this.update(updateWrapper); + if (entity != null) { + msOperationLogService.recordDeleteDetailLog(id, TABLE_NAME, entity, "warningRule"); + } + } + + @Override + public void updateShow(Integer isShow) { + if (isShow != null) { + this.baseMapper.updateIsShow(isShow); + } + } + + @Override + public Map getLimit(DataSourceRequest request) { + String ruleType = getFilterFieldValue(request, "ruleType"); + ruleType = getOldRuleType(ruleType); + String stcd = getFilterFieldValue(request, "stcd"); + String sql = "SELECT * FROM (\n" + + "SELECT t2.MIN_VAL AS min, t2.MAX_VAL AS max\n" + + "FROM MS_WARN_RULE_B t1\n" + + "INNER JOIN MS_WARN_RULE_DETAIL_B t2 ON t1.ID = t2.RULE_ID\n" + + "INNER JOIN MS_WARN_RULE_STBPRP_B t3 ON t1.ID = t3.RULE_ID\n" + + "WHERE t1.RULE_TYPE = '" + ruleType + "'\n" + + " AND t3.STCD = '" + stcd + "'\n" + + "ORDER BY TM DESC) WHERE ROWNUM = 1"; + List> allList = microservicDynamicSQLMapper.getAllList(sql, null); + return CollectionUtils.isEmpty(allList) ? new HashMap<>() : allList.get(0); + } + + @Override + public Page getRuleBindList(DataSourceRequest request) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT id AS bindId, STCD, STNM, STTP_CODE AS sttpCode, RULE_NAME AS ruleName, ") + .append("RULE_TYPE AS ruleType, recordUser, MODIFY_TIME AS modifyTime, isShow, RULE_CODE AS ruleCode ") + .append("FROM (\n") + .append("SELECT t1.ID, t1.STCD, t3.STNM, t3.STTP_CODE, t2.RULE_NAME, t2.RULE_TYPE, ") + .append("t2.RECORD_USER AS recordUser, t2.MODIFY_TIME, t2.DESCRIPTION, t2.IS_SHOW AS isShow, t2.RULE_CODE ") + .append("FROM MS_WARN_RULE_STBPRP_B t1\n") + .append("INNER JOIN MS_WARN_RULE_B t2 ON t1.RULE_ID = t2.ID\n") + .append("INNER JOIN V_MS_STBPRP_T t3 ON t1.STCD = t3.STCD\n") + .append("WHERE t2.RULE_CODE IN ('common','custom')\n") + .append(") WHERE 1=1"); + + Map params = new HashMap<>(); + // 处理过滤条件 + appendFilterConditions(request, sql, params); + + // 处理排序 + appendOrderBy(request, sql); + + Page page; + if (request.getPage() > 0 && request.getPageSize() > 0) { + page = new Page<>(request.getPage(), request.getPageSize()); + } else if (request.getTake() > 0) { + long pageNum = (request.getSkip() / request.getTake()) + 1; + page = new Page<>(pageNum, request.getTake()); + } else { + page = new Page<>(1, 20); + } + microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), params, MsWarnRuleBVo.class); + return page; + } + + @Override + public MsWarnRuleBVo getRuleBindDetail(String ruleId, String bindId) { + if (StringUtils.isBlank(ruleId) && StringUtils.isBlank(bindId)) { + return null; + } + MsWarnRuleBVo vo = new MsWarnRuleBVo(); + vo.setId(ruleId); + + MsWarnRuleStbprpB msStcdWarnRuleB = null; + if (StringUtils.isNotBlank(bindId)) { + msStcdWarnRuleB = msWarnRuleStbprpBMapper.selectById(bindId); + if (msStcdWarnRuleB == null) { + return null; + } + ruleId = msStcdWarnRuleB.getRuleId(); + vo.setBindId(bindId); + vo.setId(ruleId); + } + + MsWarnRuleB rule = this.baseMapper.selectById(ruleId); + if (rule == null) { + return null; + } + org.springframework.beans.BeanUtils.copyProperties(rule, vo); + if (msStcdWarnRuleB != null) { + vo.setStcd(msStcdWarnRuleB.getStcd()); + vo.setSttpId(msStcdWarnRuleB.getSttpId()); + } + if (StringUtils.isNotBlank(vo.getStcd())) { + String sql = "SELECT stcd, stnm, rstcd, ennm FROM MS_STBPRP_T WHERE STCD = '" + vo.getStcd() + "'"; + List voList = microservicDynamicSQLMapper.pageAllListWithResultType(null, sql, null, MsWarnRuleBVo.class); + if (!CollectionUtils.isEmpty(voList)) { + MsWarnRuleBVo stationVo = voList.get(0); + vo.setRstcd(stationVo.getRstcd()); + vo.setEnnm(stationVo.getEnnm()); + vo.setStnm(stationVo.getStnm()); + } + } + + // 查询规则配置的要素 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MsWarnRuleDetailB::getRuleId, ruleId); + List detailBList = msWarnRuleDetailBMapper.selectList(queryWrapper); + + List detailVos = new ArrayList<>(); + if (!CollectionUtils.isEmpty(detailBList)) { + Map> warnLevelMap = detailBList.stream() + .collect(Collectors.groupingBy(d -> d.getWarnLevel() != null ? d.getWarnLevel() : 0)); + for (Integer warnLevel : warnLevelMap.keySet()) { + MsWarnRuleDetailVo detailVo = new MsWarnRuleDetailVo(); + List detailGroup = warnLevelMap.get(warnLevel); + List ysVoList = new ArrayList<>(); + MsWarnRuleDetailB first = detailGroup.get(0); + org.springframework.beans.BeanUtils.copyProperties(first, detailVo); + for (MsWarnRuleDetailB db : detailGroup) { + WarnYsVo ysVo = new WarnYsVo(); + org.springframework.beans.BeanUtils.copyProperties(db, ysVo); + ysVoList.add(ysVo); + } + detailVo.setYsList(ysVoList); + detailVos.add(detailVo); + } + } + vo.setDetail(detailVos); + return vo; + } + + @Override + public List getRuleListByStcd(String stcd, String ruleType, String lvl) { + List ruleList = this.baseMapper.getRuleListByStcd(stcd, ruleType); + if (CollectionUtils.isEmpty(ruleList)) { + return ruleList; + } + Set ruleIdSet = ruleList.stream().map(WarnRuleVo::getId).collect(Collectors.toSet()); + + // 如果测站有绑定规则,默认第一个 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsWarnRuleStbprpB::getStcd, stcd); + wrapper.in(MsWarnRuleStbprpB::getRuleId, ruleIdSet); + MsWarnRuleStbprpB binding = msWarnRuleStbprpBMapper.selectOne(wrapper); + if (binding != null) { + String boundRuleId = binding.getRuleId(); + WarnRuleVo first = ruleList.stream() + .filter(r -> r.getId().equals(boundRuleId)).findFirst().orElse(null); + if (first != null) { + ruleList.remove(first); + ruleList.add(0, first); + } + return ruleList; + } + if ("WQ_RULE".equals(ruleType) && StringUtils.isNotBlank(lvl)) { + WarnRuleVo matched = ruleList.stream() + .filter(r -> "common".equals(r.getRuleCode()) && r.getLvl().equals(lvl)) + .findFirst().orElse(null); + if (matched != null) { + ruleList.remove(matched); + ruleList.add(0, matched); + } + } + return ruleList; + } + + // ==================== 私有辅助方法 ==================== + + /** + * 生成自定义规则名称:站名-站类型名-自定义规则-序号 + */ + private String getCustomRuleName(String stcd, String stnm) { + StringBuilder sb = new StringBuilder(); + String sttpCodeName = this.baseMapper.getSttpCodeNameByStcd(stcd); + String customRuleName = this.baseMapper.getCustomRuleNameByStcd(stcd); + sb.append(stnm).append("-").append(sttpCodeName).append("-自定义规则-"); + if (StringUtils.isBlank(customRuleName)) { + sb.append(1); + return sb.toString(); + } + String num = customRuleName.substring(customRuleName.lastIndexOf("-") + 1); + if (!num.matches("-?\\d+")) { + throw new RuntimeException("自定义规则名称异常: " + customRuleName); + } + return sb.append(Integer.parseInt(num) + 1).toString(); + } + + /** + * 校验通用规则是否已存在 + */ + private boolean checkRuleExist(String ruleType, Integer lvl) { + if ("WQ_RULE".equals(ruleType)) { + if (lvl == null) { + throw new RuntimeException("新增通用水质规则时水质等级不能为空"); + } + return this.baseMapper.checkWqCommonRuleExist(lvl) > 0; + } else { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsWarnRuleB::getRuleType, ruleType); + wrapper.eq(MsWarnRuleB::getRuleCode, "common"); + wrapper.eq(MsWarnRuleB::getIsDeleted, 0); + return this.baseMapper.selectCount(wrapper) > 0; + } + } + /** * 旧版规则类型枚举映射 */ @@ -145,11 +527,9 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl params) { + if (request == null || request.getFilter() == null) { + return; + } + processFilters(request.getFilter(), sql, params); + } + + private void processFilters(DataSourceRequest.FilterDescriptor filter, StringBuilder sql, Map params) { + if (filter == null) { + return; + } + if (filter.getFilters() != null && !filter.getFilters().isEmpty()) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + processFilter(child, sql, params); + } + } + } + + private void processFilter(DataSourceRequest.FilterDescriptor filter, StringBuilder sql, Map params) { + if (filter == null || filter.getField() == null || filter.getValue() == null) { + return; + } + String field = filter.getField(); + String operator = filter.getOperator(); + Object value = filter.getValue(); + + switch (operator) { + case "eq": + sql.append(" AND ").append(field).append(" = '").append(value).append("'"); + break; + case "neq": + sql.append(" AND ").append(field).append(" <> '").append(value).append("'"); + break; + case "contains": + sql.append(" AND ").append(field).append(" LIKE '%").append(value).append("%'"); + break; + case "startswith": + sql.append(" AND ").append(field).append(" LIKE '").append(value).append("%'"); + break; + case "endswith": + sql.append(" AND ").append(field).append(" LIKE '%").append(value).append("'"); + break; + case "gt": + sql.append(" AND ").append(field).append(" > '").append(value).append("'"); + break; + case "gte": + sql.append(" AND ").append(field).append(" >= '").append(value).append("'"); + break; + case "lt": + sql.append(" AND ").append(field).append(" < '").append(value).append("'"); + break; + case "lte": + sql.append(" AND ").append(field).append(" <= '").append(value).append("'"); + break; + default: + break; + } + } + + /** + * 处理排序条件 + */ + private void appendOrderBy(DataSourceRequest request, StringBuilder sql) { + if (request.getSort() == null || request.getSort().isEmpty()) { + return; + } + sql.append(" ORDER BY "); + for (int i = 0; i < request.getSort().size(); i++) { + DataSourceRequest.SortDescriptor sort = request.getSort().get(i); + sql.append(sort.getField()); + if ("desc".equalsIgnoreCase(sort.getDir())) { + sql.append(" DESC"); + } else { + sql.append(" ASC"); + } + if (i < request.getSort().size() - 1) { + sql.append(", "); + } + } + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java index c1c516c7..40ac8a3c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/controller/MsWarnRuleBController.java @@ -3,15 +3,13 @@ package com.yfd.platform.qgc_sys.warnRule.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_base.service.IMsWarnRuleBService; +import com.yfd.platform.qgc_sys.warnRule.vo.MsWarnRuleBVo; 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.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 告警规则控制器 @@ -42,6 +40,74 @@ public class MsWarnRuleBController { return ResponseResult.successData(msWarnRuleBService.getAllYs(ruleType)); } + @PostMapping("/addOrUpdate") + @Operation(summary = "新增或修改规则") + public ResponseResult addOrUpdate(@RequestBody MsWarnRuleBVo vo) { + return ResponseResult.successData(msWarnRuleBService.addOrUpdate(vo)); + } + + @GetMapping("/check") + @Operation(summary = "校验规则是否被测站引用") + public ResponseResult check(@RequestParam("id") String id) { + return ResponseResult.successData(msWarnRuleBService.check(id)); + } + + @GetMapping("/bind/delete") + @Operation(summary = "删除规则绑定") + public ResponseResult deleteBind(@RequestParam("id") String id) { + if (id == null || id.isEmpty()) { + return ResponseResult.error("id不能为空"); + } + msWarnRuleBService.deleteBind(id); + return ResponseResult.success(); + } + + @GetMapping("/delete") + @Operation(summary = "删除规则") + public ResponseResult deleteRule(@RequestParam("id") String id) { + if (id == null || id.isEmpty()) { + return ResponseResult.error("id不能为空"); + } + msWarnRuleBService.deleteRule(id); + return ResponseResult.success(); + } + + @PostMapping("/updateShow") + @Operation(summary = "修改规则是否展示") + public ResponseResult updateShow(@RequestParam("isShow") Integer isShow) { + msWarnRuleBService.updateShow(isShow); + return ResponseResult.success(); + } + + @PostMapping("/limit") + @Operation(summary = "获取水位和生态流量限值") + public ResponseResult getLimit(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(msWarnRuleBService.getLimit(dataSourceRequest)); + } + + @PostMapping("/bind/GetKendoList") + @Operation(summary = "查询测站和预警规则绑定列表") + public ResponseResult getWarnRuleBindingList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(msWarnRuleBService.getRuleBindList(dataSourceRequest)); + } + + @GetMapping("/getDetailById") + @Operation(summary = "根据id查询规则配置详情") + public ResponseResult getWarnRuleBindingDetail( + @RequestParam(value = "ruleId", required = false) String ruleId, + @RequestParam(value = "bindId", required = false) String bindId) { + return ResponseResult.successData(msWarnRuleBService.getRuleBindDetail(ruleId, bindId)); + } + + @GetMapping("/getRuleListByStcd") + @Operation(summary = "根据stcd查询可绑定的规则") + public ResponseResult getRuleListByStcd( + @RequestParam("stcd") String stcd, + @RequestParam("ruleType") String ruleType, + @RequestParam(value = "lvl", required = false) String lvl) { + return ResponseResult.successData(msWarnRuleBService.getRuleListByStcd(stcd, ruleType, lvl)); + } + /** * 从 DataSourceRequest 过滤条件中提取指定字段的值 */ diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleBVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleBVo.java new file mode 100644 index 00000000..428d37f0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleBVo.java @@ -0,0 +1,69 @@ +package com.yfd.platform.qgc_sys.warnRule.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 预警规则配置VO + */ +@Data +public class MsWarnRuleBVo { + + /** 告警规则id */ + private String id; + + /** 设施与规则绑定id */ + private String bindId; + + /** 告警规则名称 */ + private String ruleName; + + /** 告警规则类型 */ + private String ruleType; + + /** 告警规则类型名称 */ + private String ruleTypeName; + + /** 告警编码 */ + private String ruleCode; + + /** 测站编码 */ + private String stcd; + + /** 测站名称 */ + private String stnm; + + /** 关联测站编码 */ + private String rstcd; + + /** 工程名称 */ + private String ennm; + + /** 测站类型编码 */ + private String sttpId; + + /** 测站类型编码 */ + private String sttpCode; + + /** 是否展示告警等级 */ + private Integer isShow; + + /** 备注 */ + private String description; + + /** 告警规则详情数据 */ + private List detail; + + /** 创建人 */ + private String recordUser; + + /** 创建人名称 */ + private String recordUserName; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date modifyTime; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleDetailVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleDetailVo.java new file mode 100644 index 00000000..8b35343d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/MsWarnRuleDetailVo.java @@ -0,0 +1,24 @@ +package com.yfd.platform.qgc_sys.warnRule.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 预警规则详情VO + */ +@Data +public class MsWarnRuleDetailVo { + + /** 水质等级 */ + private String lvl; + + /** 水质等级名称 */ + private String lvlName; + + /** 告警等级 */ + private Integer warnLevel; + + /** 要素列表 */ + private List ysList; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnRuleVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnRuleVo.java new file mode 100644 index 00000000..5da79a5d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/warnRule/vo/WarnRuleVo.java @@ -0,0 +1,18 @@ +package com.yfd.platform.qgc_sys.warnRule.vo; + +import lombok.Data; + +/** + * 可绑定的规则VO + */ +@Data +public class WarnRuleVo { + + private String id; + + private String ruleName; + + private String ruleCode; + + private String lvl; +} diff --git a/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java b/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java index a9a101ee..25b78886 100644 --- a/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java +++ b/backend/src/main/java/com/yfd/platform/utils/DataSourceRequestUtil.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceRequest; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -240,17 +241,29 @@ public class DataSourceRequestUtil { case "isempty" -> wrapper.eq(columnName, ""); case "isnotempty" -> wrapper.ne(columnName, ""); case "in" -> { - if (value instanceof Iterable) { - wrapper.in(columnName, (Iterable) value); + if (value instanceof Collection) { + if (!((Collection) value).isEmpty()) { + wrapper.in(columnName, (Collection) value); + } } else if (value instanceof Object[]) { - wrapper.in(columnName, (Object[]) value); + if (((Object[]) value).length > 0) { + wrapper.in(columnName, (Object[]) value); + } + } else { + wrapper.eq(columnName, value); // 单个值转为 eq } } case "ni", "notin" -> { - if (value instanceof Iterable) { - wrapper.notIn(columnName, (Iterable) value); + if (value instanceof Collection) { + if (!((Collection) value).isEmpty()) { + wrapper.notIn(columnName, (Collection) value); + } } else if (value instanceof Object[]) { - wrapper.notIn(columnName, (Object[]) value); + if (((Object[]) value).length > 0) { + wrapper.notIn(columnName, (Object[]) value); + } + } else { + wrapper.ne(columnName, value); } } default -> wrapper.eq(columnName, value); From c96d572ae6062dc8dfaa1d649078c2396d07ea5a Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 16:05:39 +0800 Subject: [PATCH 15/17] =?UTF-8?q?feat:=20=E7=94=B5=E7=AB=99=E4=B8=8E?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E7=BB=84=E4=BB=B6=E9=85=8D=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/domain/MsPpbclB.java | 82 ++++++ .../platform/qgc_base/domain/MsPplayoutB.java | 72 ++++++ .../qgc_base/domain/MsPsbmodulelbB.java | 87 +++++++ .../qgc_base/domain/MsTagConfigB.java | 72 ++++++ .../platform/qgc_base/domain/MsTemplateB.java | 78 ++++++ .../platform/qgc_base/domain/PpbclCodeVo.java | 15 ++ .../platform/qgc_base/domain/TagConfigVo.java | 18 ++ .../qgc_base/mapper/MsPpbclBMapper.java | 9 + .../qgc_base/mapper/MsPplayoutBMapper.java | 9 + .../qgc_base/mapper/MsPsbmodulelbBMapper.java | 21 ++ .../qgc_base/mapper/MsTagConfigBMapper.java | 9 + .../qgc_base/mapper/MsTemplateBMapper.java | 9 + .../service/IMsPsbmodulelbBService.java | 33 +++ .../impl/MsPsbmodulelbBServiceImpl.java | 242 ++++++++++++++++++ .../controller/MsPsbmodulelbBController.java | 104 ++++++++ .../psbmodulelbb/vo/MsPsbmodulelbBVo.java | 51 ++++ .../qgc_sys/psbmodulelbb/vo/TagConfigVo.java | 14 + 17 files changed, 925 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPpbclB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPplayoutB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsPsbmodulelbB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTagConfigB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/MsTemplateB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/PpbclCodeVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/domain/TagConfigVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPpbclBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPplayoutBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsPsbmodulelbBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTagConfigBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/mapper/MsTemplateBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsPsbmodulelbBServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/MsPsbmodulelbBVo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/TagConfigVo.java 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/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/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/service/IMsPsbmodulelbBService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java new file mode 100644 index 00000000..0e646524 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/IMsPsbmodulelbBService.java @@ -0,0 +1,33 @@ +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 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); +} 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..2a137164 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsPsbmodulelbBServiceImpl.java @@ -0,0 +1,242 @@ +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.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.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; + + @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; + } + + // ==================== 私有辅助方法 ==================== + + /** + * 从 DataSourceRequest 过滤条件中提取指定字段的值 + */ + private String getFilterFieldValue(DataSourceRequest request, String fieldName) { + if (request == null || request.getFilter() == null) { + return null; + } + return findFilterValue(request.getFilter(), fieldName); + } + + private String findFilterValue(DataSourceRequest.FilterDescriptor filter, String fieldName) { + if (filter == null) { + return null; + } + if (fieldName.equals(filter.getField()) && filter.getValue() != null) { + return filter.getValue().toString(); + } + if (filter.getFilters() != null) { + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String value = findFilterValue(child, fieldName); + if (value != null) { + return value; + } + } + } + return null; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java new file mode 100644 index 00000000..8f00dbda --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java @@ -0,0 +1,104 @@ +package com.yfd.platform.qgc_sys.psbmodulelbb.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.MsPplayoutB; +import com.yfd.platform.qgc_base.domain.MsPsbmodulelbB; +import com.yfd.platform.qgc_base.mapper.MsPplayoutBMapper; +import com.yfd.platform.qgc_base.service.IMsPsbmodulelbBService; +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.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 平台产品化-电站与布局组件配置表控制器 + */ +@Slf4j +@RestController +@RequestMapping("/sys/psbmodulelbb") +@Tag(name = "电站与布局组件配置管理") +public class MsPsbmodulelbBController { + + @Resource + private IMsPsbmodulelbBService msPsbmodulelbBService; + + @Resource + private MsPplayoutBMapper msPplayoutBMapper; + + @PostMapping("/GetKendoListCust") + @Operation(summary = "条件过滤数据列表(含标签信息)") + public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + List list = msPsbmodulelbBService.queryPageList(dataSourceRequest); + return ResponseResult.successData(list); + } + + @GetMapping("/getPsbmoduleByMidAndLt") + @Operation(summary = "根据电站和布局类型获取配置列表") + public ResponseResult getPsbmoduleByMidAndLt( + @RequestParam("stcd") String stcd, + @RequestParam("layoutType") String layoutType) { + if (StringUtils.isBlank(stcd)) { + return ResponseResult.error("stcd 不能为空"); + } + if (StringUtils.isBlank(layoutType)) { + return ResponseResult.error("layoutType 不能为空"); + } + List list = msPsbmodulelbBService.getPsbmoduleByMidAndLt(stcd, layoutType); + return ResponseResult.successData(list); + } + + @PostMapping("/save") + @Operation(summary = "保存或更新电站与布局组件配置") + public ResponseResult save(@RequestBody MsPsbmodulelbB msPsbmodulelbB) { + // 校验必填字段 + if (StringUtils.isBlank(msPsbmodulelbB.getStcd()) + || StringUtils.isBlank(msPsbmodulelbB.getLayoutId()) + || StringUtils.isBlank(msPsbmodulelbB.getBclData())) { + return ResponseResult.error("电站编码、布局ID、组件配置数据不能为空"); + } + + // 验证布局是否存在 + LambdaQueryWrapper layoutWrapper = new LambdaQueryWrapper<>(); + layoutWrapper.eq(MsPplayoutB::getCode, msPsbmodulelbB.getLayoutId()); + layoutWrapper.eq(MsPplayoutB::getIsDeleted, 0); + MsPplayoutB pplayoutB = msPplayoutBMapper.selectOne(layoutWrapper); + if (pplayoutB == null) { + return ResponseResult.error("布局不存在"); + } + + // 修改时验证记录是否存在 + if (StringUtils.isNotBlank(msPsbmodulelbB.getId())) { + MsPsbmodulelbB existing = msPsbmodulelbBService.getById(msPsbmodulelbB.getId()); + if (existing == null) { + return ResponseResult.error("要修改的记录不存在"); + } + } + + boolean result = msPsbmodulelbBService.saveOrUpdateData(msPsbmodulelbB); + if (result) { + return ResponseResult.success(); + } else { + return ResponseResult.error("数据保存失败"); + } + } + + @DeleteMapping("/{id}") + @Operation(summary = "逻辑删除电站与布局组件配置") + public ResponseResult delete(@PathVariable("id") String id) { + if (StringUtils.isBlank(id)) { + return ResponseResult.error("id 不能为空"); + } + boolean result = msPsbmodulelbBService.deleteData(id); + if (result) { + return ResponseResult.success(); + } else { + return ResponseResult.error("删除失败,记录不存在"); + } + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/MsPsbmodulelbBVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/MsPsbmodulelbBVo.java new file mode 100644 index 00000000..5413dcee --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/MsPsbmodulelbBVo.java @@ -0,0 +1,51 @@ +package com.yfd.platform.qgc_sys.psbmodulelbb.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 电站与布局组件配置VO + */ +@Data +public class MsPsbmodulelbBVo { + + private String id; + + /** 所属电站 */ + private String stcd; + + /** 布局ID */ + private String layoutId; + + /** 布局各组件配置 */ + private String bclData; + + /** 模板id */ + private String templateId; + + /** 是否布局 */ + private Integer isLayout; + + /** 主控件标签配置 */ + private List mainTagList; + + /** 组件标签配置 */ + private List ppbclTagList; + + /** 有配置标签的组件集合 */ + private List codeList; + + /** 创建人 */ + private String recordUser; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date recordTime; + + /** 修改时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date modifyTime; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/TagConfigVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/TagConfigVo.java new file mode 100644 index 00000000..a8c903c3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/TagConfigVo.java @@ -0,0 +1,14 @@ +package com.yfd.platform.qgc_sys.psbmodulelbb.vo; + +import lombok.Data; + +/** + * 标签配置VO + */ +@Data +public class TagConfigVo { + private String code; + private String tagId; + private String tagValue; + private Integer isShow; +} From e18ec366530394c81a9ebf0b6b889083a07f57ad Mon Sep 17 00:00:00 2001 From: tangwei Date: Thu, 23 Jul 2026 16:08:02 +0800 Subject: [PATCH 16/17] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/qgc_base/mapper/MsWarnRuleBMapper.java | 2 +- .../service/impl/MsWarnRuleBServiceImpl.java | 2 +- .../qgc_env/wt/mapper/AlongDetailMapper.java | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) 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 242f0f4d..eec1a3de 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 @@ -32,7 +32,7 @@ public interface MsWarnRuleBMapper extends BaseMapper { @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 MS_STBPRP_T t1 INNER JOIN SD_STTP_B t2 ON t1.STTP = t2.ID WHERE t1.STCD = #{stcd}") + @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 " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java index 800651e4..c921e1eb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/MsWarnRuleBServiceImpl.java @@ -385,7 +385,7 @@ public class MsWarnRuleBServiceImpl extends ServiceImpl voList = microservicDynamicSQLMapper.pageAllListWithResultType(null, sql, null, MsWarnRuleBVo.class); if (!CollectionUtils.isEmpty(voList)) { MsWarnRuleBVo stationVo = voList.get(0); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/mapper/AlongDetailMapper.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/mapper/AlongDetailMapper.java index 3592d50e..0911b081 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/mapper/AlongDetailMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/mapper/AlongDetailMapper.java @@ -87,7 +87,7 @@ public interface AlongDetailMapper extends BaseMapper { //降雨量 @Select("SELECT a.TM, AVG(a.DRP) AS DRP " + "FROM SD_PPTN_R a " + - "INNER JOIN MS_STBPRP_T b ON a.STCD = b.STCD " + + "INNER JOIN V_MS_STBPRP_T b ON a.STCD = b.STCD " + "WHERE b.STTP_CODE = 'MM' " + "AND a.IS_DELETED = 0 AND b.IS_DELETED = 0 " + "AND b.RSTCD = (SELECT RSTCD FROM SD_WT_B_H WHERE STCD = #{stcd} AND IS_DELETED = 0) " + @@ -97,7 +97,7 @@ public interface AlongDetailMapper extends BaseMapper { //气象站数据 @Select("SELECT a.TM, AVG(a.AT) AS AT " + "FROM SD_TMP_R a " + - "INNER JOIN MS_STBPRP_T b ON a.STCD = b.STCD " + + "INNER JOIN V_MS_STBPRP_T b ON a.STCD = b.STCD " + "WHERE b.STTP_CODE = 'MM' AND a.IS_DELETED = 0 AND b.IS_DELETED = 0 " + "AND b.RSTCD = (SELECT RSTCD FROM SD_WT_B_H WHERE STCD = #{stcd} AND IS_DELETED = 0) " + "AND a.TM BETWEEN #{startTime} AND #{endTime} " + @@ -124,10 +124,10 @@ public interface AlongDetailMapper extends BaseMapper { "REGEXP_REPLACE(LISTAGG(TO_CHAR(c.STNM), ',') WITHIN GROUP (ORDER BY c.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS vtStnm, " + "REGEXP_REPLACE(LISTAGG(TO_CHAR(d.STCD), ',') WITHIN GROUP (ORDER BY d.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS dwStcd, " + "REGEXP_REPLACE(LISTAGG(TO_CHAR(d.STNM), ',') WITHIN GROUP (ORDER BY d.STCD), '([^,]+)(,\\1)*(,|$)', '\\1\\3') AS dwStnm " + - "FROM MS_STBPRP_T a " + - "LEFT JOIN MS_STBPRP_T b ON a.STCD = b.RSTCD AND b.STTP_CODE = 'WTRV' AND b.IS_DELETED = 0 AND b.MWAY = 2 AND b.DTIN_TYPE = 0 " + - "LEFT JOIN MS_STBPRP_T c ON a.STCD = c.RSTCD AND c.STTP_CODE = 'WTVT' AND c.IS_DELETED = 0 AND c.MWAY = 2 " + - "LEFT JOIN MS_STBPRP_T d ON a.STCD = d.RSTCD AND d.STTP_CODE LIKE 'DW_%' AND d.IS_DELETED = 0 " + + "FROM V_MS_STBPRP_T a " + + "LEFT JOIN V_MS_STBPRP_T b ON a.STCD = b.RSTCD AND b.STTP_CODE = 'WTRV' AND b.IS_DELETED = 0 AND b.MWAY = 2 AND b.DTIN_TYPE = 0 " + + "LEFT JOIN V_MS_STBPRP_T c ON a.STCD = c.RSTCD AND c.STTP_CODE = 'WTVT' AND c.IS_DELETED = 0 AND c.MWAY = 2 " + + "LEFT JOIN V_MS_STBPRP_T d ON a.STCD = d.RSTCD AND d.STTP_CODE LIKE 'DW_%' AND d.IS_DELETED = 0 " + "WHERE a.STTP_CODE = 'ENG' AND a.IS_DELETED = 0 " + "AND b.STCD IS NOT NULL AND c.STCD IS NOT NULL AND d.STCD IS NOT NULL AND b.ENG_DWT_CODE IS NOT NULL " + "AND (d.STCD = #{stcd} OR b.STCD = #{stcd} OR c.STCD = #{stcd} OR a.STCD = #{stcd}) " + From 282c2ccdd06a968e6f2496c586f2f844577f6d79 Mon Sep 17 00:00:00 2001 From: tangwei Date: Fri, 24 Jul 2026 09:00:34 +0800 Subject: [PATCH 17/17] =?UTF-8?q?feat:=20=E8=8E=B7=E5=8F=96=E5=B7=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=94=B5=E7=AB=99=E5=8F=8A=E6=B5=81=E5=9F=9F?= =?UTF-8?q?=E6=A0=91=E5=BD=A2=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SwaggerConfig.java | 10 +++ .../qgc_base/mapper/MsWarnRuleBMapper.java | 18 ++++- .../service/IMsPsbmodulelbBService.java | 6 ++ .../impl/MsPsbmodulelbBServiceImpl.java | 65 +++++++++++++++++++ .../controller/MsPsbmodulelbBController.java | 12 +++- .../qgc_sys/psbmodulelbb/vo/WbsBPpVo.java | 33 ++++++++++ 6 files changed, 140 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/WbsBPpVo.java 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 00088d47..13328298 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -274,6 +274,16 @@ public class SwaggerConfig { } + @Bean + public GroupedOpenApi groupPsbmodulelbbApi() { + return GroupedOpenApi.builder() + .group("5.6 电站与布局组件配置管理") + .packagesToScan("com.yfd.platform.qgc_sys.psbmodulelbb.controller") + .build(); + } + + + @Bean public GroupedOpenApi groupLygkApi() { return GroupedOpenApi.builder() 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 eec1a3de..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 @@ -16,15 +16,29 @@ 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 RULE_CODE = 'custom' AND STCD = #{stcd} AND IS_DELETED = 0 AND RECORD_TIME IS NOT NULL " + + "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 (t1.RULE_CODE = 'common' OR (t1.RULE_CODE = 'custom' AND t1.STCD = #{stcd})) " + + "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); 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 index 0e646524..1647056f 100644 --- 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 @@ -3,6 +3,7 @@ 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; @@ -30,4 +31,9 @@ public interface IMsPsbmodulelbBService extends IService { * 逻辑删除 */ boolean deleteData(String id); + + /** + * 获取已配置电站及流域树形数据 + */ + List getTreeConfiguredps(DataSourceRequest dataSourceRequest); } 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 index 2a137164..8dfd2ad4 100644 --- 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 @@ -9,10 +9,12 @@ 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; @@ -46,6 +48,9 @@ public class MsPsbmodulelbBServiceImpl extends ServiceImpl queryPageList(DataSourceRequest request) { String templateId = getFilterFieldValue(request, "templateId"); @@ -210,6 +215,66 @@ public class MsPsbmodulelbBServiceImpl extends ServiceImpl 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> ppList = microservicDynamicSQLMapper.getAllList(ppsql.toString(), null); + + List list = new ArrayList<>(); + if (ppList != null && !ppList.isEmpty()) { + StringBuilder stcdBuilder = new StringBuilder(); + for (Map pp : ppList) { + stcdBuilder.append("'").append(pp.get("STCD")).append("',"); + } + String stcdIn = stcdBuilder.substring(0, stcdBuilder.length() - 1); + + // 第二步:从 SD_ENGINFO_B_H 获取电站及基地信息(替代 V_MS_STBPRP_T) + // HBRVCD → BASE_ID,HBRVCD_NAME → BASE_NAME + StringBuilder basinSql = new StringBuilder(); + basinSql.append("SELECT STCD AS wbsCode, ENNM AS wbsName, LGTD AS lgtd, LTTD AS lttd, ") + .append("CASE WHEN BASE_ID IS NULL THEN 'QT' ELSE BASE_ID END AS rvcd, ") + .append("CASE WHEN BASE_NAME IS NULL THEN '其他' ELSE BASE_NAME END AS rvcdName ") + .append("FROM SD_ENGINFO_B_H WHERE IS_DELETED = 0 AND STCD IN (").append(stcdIn).append(") "); + if (StringUtils.isNotBlank(wbsCode)) { + basinSql.append("AND BASE_ID = '").append(wbsCode).append("' "); + } + basinSql.append("ORDER BY ORDER_INDEX ASC"); + + List baseVoList = microservicDynamicSQLMapper.getAllListWithResultType( + basinSql.toString(), null, WbsBPpVo.class); + + // 第三步:按基地编码(BASE_ID)分组构建树形结构 + Map> map = new LinkedHashMap<>(); + for (WbsBPpVo vo : baseVoList) { + String rvcd = vo.getRvcd(); + if (rvcd == null || map.get(rvcd) == null || map.get(rvcd).isEmpty()) { + List children = new ArrayList<>(); + children.add(vo); + map.put(rvcd, children); + } else { + map.get(rvcd).add(vo); + } + } + + for (Map.Entry> entry : map.entrySet()) { + WbsBPpVo group = new WbsBPpVo(); + group.setWbsCode(entry.getKey()); + List children = entry.getValue(); + if (!children.isEmpty()) { + group.setWbsName(children.get(0).getRvcdName()); + } + group.setChildren(children); + list.add(group); + } + } + + return list; + } + // ==================== 私有辅助方法 ==================== /** diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java index 8f00dbda..80c85efc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/controller/MsPsbmodulelbBController.java @@ -7,6 +7,7 @@ import com.yfd.platform.qgc_base.domain.MsPplayoutB; import com.yfd.platform.qgc_base.domain.MsPsbmodulelbB; import com.yfd.platform.qgc_base.mapper.MsPplayoutBMapper; import com.yfd.platform.qgc_base.service.IMsPsbmodulelbBService; +import com.yfd.platform.qgc_sys.psbmodulelbb.vo.WbsBPpVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; @@ -88,9 +89,9 @@ public class MsPsbmodulelbBController { } } - @DeleteMapping("/{id}") + @PostMapping("/delete") @Operation(summary = "逻辑删除电站与布局组件配置") - public ResponseResult delete(@PathVariable("id") String id) { + public ResponseResult delete(@RequestParam String id) { if (StringUtils.isBlank(id)) { return ResponseResult.error("id 不能为空"); } @@ -101,4 +102,11 @@ public class MsPsbmodulelbBController { return ResponseResult.error("删除失败,记录不存在"); } } + + @PostMapping("/getTreeConfiguredps") + @Operation(summary = "获取已配置电站及流域树形数据") + public ResponseResult getTreeConfiguredps(@RequestBody DataSourceRequest dataSourceRequest) { + List list = msPsbmodulelbBService.getTreeConfiguredps(dataSourceRequest); + return ResponseResult.successData(list); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/WbsBPpVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/WbsBPpVo.java new file mode 100644 index 00000000..df045fc9 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/psbmodulelbb/vo/WbsBPpVo.java @@ -0,0 +1,33 @@ +package com.yfd.platform.qgc_sys.psbmodulelbb.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 流域及电站VO(树形结构) + */ +@Data +public class WbsBPpVo { + + /** 节点编码(电站STCD / 基地BASE_ID) */ + private String wbsCode; + + /** 节点名称(电站名称 / 基地名称) */ + private String wbsName; + + /** 子节点 */ + private List children; + + /** 经度 */ + private String lgtd; + + /** 纬度 */ + private String lttd; + + /** 基地编码 */ + private String rvcd; + + /** 基地名称 */ + private String rvcdName; +}