diff --git a/backend/src/main/java/com/yfd/platform/PlatformApplication.java b/backend/src/main/java/com/yfd/platform/PlatformApplication.java
index 94785cf1..9d7f55ed 100644
--- a/backend/src/main/java/com/yfd/platform/PlatformApplication.java
+++ b/backend/src/main/java/com/yfd/platform/PlatformApplication.java
@@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
@ServletComponentScan("com.yfd.platform.config")
@MapperScan(basePackages = {"com.yfd.platform.*.mapper","com.yfd.platform.*.*.mapper", "com.yfd.platform.common"})
//@ComponentScan("com.zny.dec")
-@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class, DataRedisAutoConfiguration.class})
+@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
//@SpringBootApplication
@Import({DynamicDataSourceConfig.class})
@EnableCaching
diff --git a/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java b/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java
index 59e435bd..319f2ffd 100644
--- a/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java
+++ b/backend/src/main/java/com/yfd/platform/common/MicroservicDynamicSQLMapper.java
@@ -5,6 +5,8 @@ import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
@@ -49,6 +51,20 @@ public interface MicroservicDynamicSQLMapper {
return convertList(allList, resultType);
}
+ default List getSingleColumnList(String sql, Map paramMap) {
+ List
+ *
+ *
+ * 使用示例:
+ * // 在查询方法末尾调用:
+ * 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("grd").modifyProperty("grdName").dictType("STATIC").dictSource("TEST").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());
+// }
+
+
@Override
public Page queryPageList(Page page, String hbrvnm, String baseid) {
return this.page(page, this.lambdaQuery()
@@ -110,7 +145,7 @@ public class SdHbrvDicServiceImpl extends ServiceImpl authorizedStations = getUserAuthorizedStationCodes();
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java
index 8d2fa828..5a5f3397 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.qgc_base.domain.SdHycdDic;
import com.yfd.platform.qgc_base.mapper.SdHycdDicMapper;
import com.yfd.platform.qgc_base.service.ISdHycdDicService;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -27,6 +29,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl getByPhycd(String phycd) {
return this.lambdaQuery()
.eq(SdHycdDic::getPhycd, phycd)
@@ -35,6 +38,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl getRootList() {
return this.lambdaQuery()
.eq(SdHycdDic::getPhycd, "0")
@@ -43,21 +47,25 @@ public class SdHycdDicServiceImpl extends ServiceImpl selectForDropdown(String hynm, Integer grd, Integer lx,String phycd) {
return this.lambdaQuery()
.like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm)
@@ -69,6 +77,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl regDropdown(String hynm, Integer grd,Integer lx,String phycd) {
return this.lambdaQuery()
.like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm)
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java
index 652d5d4d..9669eba8 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHydrobaseServiceImpl.java
@@ -13,6 +13,7 @@ import com.yfd.platform.qgc_base.entity.vo.HydrobaseWbsVo;
import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper;
import com.yfd.platform.qgc_base.mapper.SdHydrobaseMapper;
import com.yfd.platform.qgc_base.service.ISdHydrobaseService;
+import com.yfd.platform.system.service.IAdminAuthService;
import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -39,6 +40,9 @@ public class SdHydrobaseServiceImpl extends ServiceImpl queryPageList(Page page, String basename, String pbaseid) {
return this.page(page, this.lambdaQuery()
@@ -91,7 +95,7 @@ public class SdHydrobaseServiceImpl extends ServiceImpl();
}
- }else if (!"admin".equals(SecurityUtils.getCurrentUsername())){
+ }else if (!adminAuthService.isCurrentManagedAdmin()){
return new ArrayList<>();
}
// else {
diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java
index 60446e27..ff89fa82 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdRvcdDicServiceImpl.java
@@ -11,6 +11,7 @@ import com.yfd.platform.qgc_base.mapper.SdRvcdDicMapper;
import com.yfd.platform.qgc_base.service.ISdRvcdDicService;
import com.yfd.platform.qgc_data.domain.SysUserDataScope;
import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper;
+import com.yfd.platform.system.service.IAdminAuthService;
import com.yfd.platform.utils.SecurityUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@@ -33,6 +34,9 @@ public class SdRvcdDicServiceImpl extends ServiceImpl queryPageList(Page page, String rvnm, String prvcd) {
return this.page(page, this.lambdaQuery()
@@ -120,7 +124,7 @@ public class SdRvcdDicServiceImpl extends ServiceImpl selectForDropdown(String rvnm, String rvcd) {
List dropdownList = this.baseMapper.selectRegDropdown(rvnm, rvcd);
- if("admin".equals(SecurityUtils.getCurrentUsername())){
+ if(adminAuthService.isCurrentManagedAdmin()){
return dropdownList;
}
Set authorizedStations = getUserAuthorizedStationCodes();
diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
index f9629141..23f1728b 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishImportServiceImpl.java
@@ -1103,17 +1103,17 @@ public class FishImportServiceImpl implements IFishImportService {
return null;
}
SdFishDictoryB exactMatch = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper()
- .select(SdFishDictoryB::getCode, SdFishDictoryB::getName)
+ .select(SdFishDictoryB::getId, SdFishDictoryB::getName)
.eq(SdFishDictoryB::getName, normalizedName)));
if (exactMatch != null) {
- return exactMatch.getCode();
+ return exactMatch.getId();
}
SdFishDictoryB fuzzyMatch = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper()
- .select(SdFishDictoryB::getCode, SdFishDictoryB::getName)
+ .select(SdFishDictoryB::getId, SdFishDictoryB::getName)
.and(wrapper -> wrapper.like(SdFishDictoryB::getName, normalizedName)
.or()
.like(SdFishDictoryB::getAlias, normalizedName))));
- return fuzzyMatch == null ? null : fuzzyMatch.getCode();
+ return fuzzyMatch == null ? null : fuzzyMatch.getId();
}
@Override
@@ -1125,11 +1125,11 @@ public class FishImportServiceImpl implements IFishImportService {
}
if (StringUtils.hasText(normalizedCode)) {
SdFishDictoryB exact = findFirst(fishDictoryBMapper.selectList(new LambdaQueryWrapper()
- .select(SdFishDictoryB::getCode, SdFishDictoryB::getName)
- .eq(SdFishDictoryB::getCode, normalizedCode)));
+ .select(SdFishDictoryB::getId, SdFishDictoryB::getName)
+ .eq(SdFishDictoryB::getId, normalizedCode)));
// .eq(SdFishDictoryB::getName, normalizedName)));
if (exact != null) {
- return exact.getCode();
+ return exact.getId();
}
}
// if (StringUtils.hasText(normalizedCode)) {
diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java
index 66190642..962d0667 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/controller/EngEqDataController.java
@@ -16,11 +16,14 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
import com.yfd.platform.qgc_eng.eq.service.EngEqDataService;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
+import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
+import cn.hutool.core.util.StrUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -162,4 +165,20 @@ public class EngEqDataController {
public ResponseResult getQecRateCount(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engEqDataService.qecRateCount(dataSourceRequest));
}
+
+ @PostMapping("/operat/default/year")
+ @Operation(summary = "环保设施点击描点默认展示有数据的年份,不包含过鱼设施描点")
+ public ResponseResult getDefaultYear(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(engEqDataService.getDefaultYear(dataSourceRequest));
+ }
+
+ @GetMapping("/eq/base/msstbprpt/getStInfoByStcd")
+ @Operation(summary = "根据stcd编码获取所有关联站点的信息")
+ public ResponseResult getStInfoByStcd(String stcd) {
+ if (StrUtil.isBlank(stcd)) {
+ return ResponseResult.error("站点编码(stcd)不能为空");
+ }
+ StcdInfoVo result = engEqDataService.getStInfoByStcd(stcd);
+ return ResponseResult.successData(result);
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StBaseInfo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StBaseInfo.java
new file mode 100644
index 00000000..dbb6c429
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StBaseInfo.java
@@ -0,0 +1,31 @@
+package com.yfd.platform.qgc_eng.eq.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class StBaseInfo {
+
+ private String stcd;
+
+ private String stnm;
+
+ private String sttpCode;
+
+ private String sttpName;
+
+ private String sttpFullPath;
+
+ private Integer sttpTreeLevel;
+
+ private String baseId;
+
+ private String baseName;
+
+ private String hbrvcd;
+
+ private String hbrvcdName;
+
+ private String rvcd;
+
+ private String rvcdName;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StcdInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StcdInfoVo.java
new file mode 100644
index 00000000..c7244eaa
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/StcdInfoVo.java
@@ -0,0 +1,13 @@
+package com.yfd.platform.qgc_eng.eq.entity.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class StcdInfoVo {
+
+ private StBaseInfo stBaseInfo;
+
+ private List relList;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java
index 7f0a0bf8..f2fbf60c 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/EngEqDataService.java
@@ -18,6 +18,8 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqRateCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqVmsstbprptVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.SdEqMonitorCountVo;
+import com.yfd.platform.qgc_eng.eq.entity.vo.StBaseInfo;
+import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
import java.util.List;
@@ -59,4 +61,8 @@ public interface EngEqDataService {
DataSourceResult getEvnmAutoMonitorList(DataSourceRequest dataSourceRequest);
DataSourceResult qecRateCount(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getDefaultYear(DataSourceRequest dataSourceRequest);
+
+ StcdInfoVo getStInfoByStcd(String stcd);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java
index 5a7a0cfc..ce231794 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/service/impl/EngEqDataServiceImpl.java
@@ -33,6 +33,8 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecStaticVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.QgcQecVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.SdEqMonitorCountVo;
import com.yfd.platform.qgc_eng.eq.entity.vo.WbsbVo;
+import com.yfd.platform.qgc_eng.eq.entity.vo.StBaseInfo;
+import com.yfd.platform.qgc_eng.eq.entity.vo.StcdInfoVo;
import com.yfd.platform.qgc_eng.eq.service.EngEqDataService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import jakarta.annotation.Resource;
@@ -1131,6 +1133,44 @@ public class EngEqDataServiceImpl implements EngEqDataService {
return result;
}
+ @Override
+ public StcdInfoVo getStInfoByStcd(String stcd) {
+ if (StrUtil.isBlank(stcd)) {
+ throw new IllegalArgumentException("站点编码(stcd)不能为空");
+ }
+ StcdInfoVo vo = new StcdInfoVo();
+ Map paramMap = new HashMap<>();
+ paramMap.put("stcd", stcd);
+
+ StBaseInfo stBaseInfo = (StBaseInfo)microservicDynamicSQLMapper.getOneBySqlWithResultType(
+ "SELECT STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " +
+ "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " +
+ "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " +
+ "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName " +
+ "FROM V_MS_STBPRP_T " +
+ "WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0",
+ paramMap,
+ StBaseInfo.class
+ );
+ vo.setStBaseInfo(stBaseInfo);
+
+ List relList = microservicDynamicSQLMapper.getAllListWithResultType(
+ "SELECT STCD AS stcd, STNM AS stnm, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " +
+ "STTP_FULL_PATH AS sttpFullPath, STTP_TREE_LEVEL AS sttpTreeLevel, " +
+ "BASE_ID AS baseId, BASE_NAME AS baseName, HBRVCD AS hbrvcd, " +
+ "HBRVCD_NAME AS hbrvcdName, RVCD AS rvcd, RVCD_NAME AS rvcdName " +
+ "FROM V_MS_STBPRP_T " +
+ "WHERE NVL(IS_DELETED, 0) = 0 " +
+ "AND STCD != #{map.stcd} " +
+ "AND STTP_FULL_PATH LIKE CONCAT(CONCAT('%', #{map.stcd}), '%')",
+ paramMap,
+ StBaseInfo.class
+ );
+ vo.setRelList(relList);
+
+ return vo;
+ }
+
@Override
public DataSourceResult qecRateCount(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
@@ -3327,6 +3367,7 @@ public class EngEqDataServiceImpl implements EngEqDataService {
"'ENG' AS sttpCode, " +
"'电站' AS sttpName, " +
"eng.STCD AS stcd, " +
+ "pbh.TTPWR AS ttpwr, " +
"eng.ENNM AS stnm, " +
"eng.ENNM AS ennm, " +
"eng.BASE_ID AS baseId, " +
@@ -3346,6 +3387,7 @@ public class EngEqDataServiceImpl implements EngEqDataService {
"NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
"NVL(eng.ORDER_INDEX, 999999) AS siteStepSort " +
"FROM SD_ENGINFO_B_H eng " +
+ "INNER JOIN SD_PWR_B_H pbh ON pbh.STCD= eng.STCD " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " +
" AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " +
@@ -5440,6 +5482,7 @@ public class EngEqDataServiceImpl implements EngEqDataService {
case "sttpCode" -> "t.sttpCode";
case "sttpName" -> "t.sttpName";
case "stcd" -> "t.stcd";
+ case "ttpwr" -> "t.ttpwr";
case "stnm" -> "t.stnm";
case "ennm" -> "t.ennm";
case "baseId" -> "t.baseId";
@@ -5746,7 +5789,8 @@ public class EngEqDataServiceImpl implements EngEqDataService {
}
return switch (field) {
case "id" -> "t.id";
- case "stcd" -> "t.stcd";
+ case "rstcd" -> "t.stcd";
+// case "rstcd" -> "t.rstcd";
case "stnm", "ennm" -> "t.ennm";
case "baseId" -> "t.baseId";
case "baseName" -> "t.baseName";
@@ -5801,4 +5845,48 @@ public class EngEqDataServiceImpl implements EngEqDataService {
default -> null;
};
}
+
+ @Override
+ public DataSourceResult getDefaultYear(DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+ List resultList = new ArrayList<>();
+ dataSourceResult.setData(resultList);
+ dataSourceResult.setTotal(resultList.size());
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ String stcd = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd");
+ String sttpCode = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode");
+ if (StrUtil.isBlank(stcd) || StrUtil.isBlank(sttpCode)) {
+ return dataSourceResult;
+ }
+
+ Map paramMap = new HashMap<>();
+ paramMap.put("stcd", stcd);
+
+ String sql = switch (sttpCode) {
+ case "DW" -> "SELECT MAX(TM) AS TM FROM SD_DW_R WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0";
+ case "EQ" -> "SELECT MAX(TM) AS TM FROM SD_EQ_R WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0";
+ case "FB" -> "SELECT MAX(TM) AS TM FROM SD_ENGFR_R WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0";
+ case "VA" -> "SELECT MAX(TM) AS TM FROM SD_VA_R WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0";
+ case "VP" -> "SELECT MAX(TM) AS TM FROM SD_VP_R WHERE STCD = #{map.stcd} AND NVL(IS_DELETED, 0) = 0";
+ default -> "";
+ };
+
+ if (StrUtil.isBlank(sql)) {
+ return dataSourceResult;
+ }
+
+ List> allList = microservicDynamicSQLMapper.getAllList(sql, paramMap);
+ if (CollUtil.isEmpty(allList)) {
+ return dataSourceResult;
+ }
+ Map map = allList.get(0);
+ if (map == null) {
+ return dataSourceResult;
+ }
+ Object tm = map.getOrDefault("TM", "");
+ if (tm != null && StrUtil.isNotBlank(tm.toString())) {
+ resultList.add(tm.toString());
+ }
+ return dataSourceResult;
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java
index 9d05bd9f..7fa6c42f 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/controller/FbStationController.java
@@ -132,4 +132,18 @@ public class FbStationController {
public ResponseResult getResearchKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getResearchKendoList(dataSourceRequest));
}
+
+ @PostMapping("/fishhatchrecr/fish/GetKendoListCust")
+ @Operation(summary = "(全过程)增殖站二级页面: 过程图-产卵和孵化")
+ public ResponseResult getFishhatchrecrFishKendoListCust(
+ @Parameter(description = "类型:1-鱼卵数量,2-出苗数量") @RequestParam("type") Integer type,
+ @RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(fbStationService.getFishhatchrecrFishKendoListCust(type, dataSourceRequest));
+ }
+
+ @PostMapping("/fishbreedr/fish/GetKendoListCust")
+ @Operation(summary = "(全过程)增殖站二级页面: 过程图-鱼苗")
+ public ResponseResult getFishbreedrFishKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(fbStationService.getFishbreedrFishKendoListCust(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishbreedRVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishbreedRVo.java
new file mode 100644
index 00000000..1d184777
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishbreedRVo.java
@@ -0,0 +1,15 @@
+package com.yfd.platform.qgc_env.fb.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class FishbreedRVo {
+
+ private String tm;
+
+ private String ftp;
+
+ private String ftpName;
+
+ private String counts;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishhatchrecRVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishhatchrecRVo.java
new file mode 100644
index 00000000..9e767b51
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/FishhatchrecRVo.java
@@ -0,0 +1,17 @@
+package com.yfd.platform.qgc_env.fb.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class FishhatchrecRVo {
+
+ private String tm;
+
+ private String ftp;
+
+ private String ftpName;
+
+ private String eggcount;
+
+ private String outcount;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/HeadColunmsVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/HeadColunmsVo.java
new file mode 100644
index 00000000..9093d280
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/HeadColunmsVo.java
@@ -0,0 +1,52 @@
+package com.yfd.platform.qgc_env.fb.entity.vo;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class HeadColunmsVo {
+
+ private String dataIndex;
+
+ private String title;
+
+ private Boolean visible = true;
+
+ private String key;
+
+ private String unit;
+
+ private boolean merge;
+
+ private String dataType;
+
+ private String dataFormat;
+
+ private List children;
+
+ public HeadColunmsVo(String title, String dataIndex) {
+ this.title = title;
+ this.dataIndex = dataIndex;
+ }
+
+ public HeadColunmsVo(String dataIndex, String title, Boolean visible, String key, boolean merge, List children) {
+ this.dataIndex = dataIndex;
+ this.title = title;
+ this.visible = visible;
+ this.key = key;
+ this.merge = merge;
+ this.children = children;
+ }
+
+ public HeadColunmsVo setDataType(String dataType) {
+ this.dataType = dataType;
+ return this;
+ }
+
+ public HeadColunmsVo setDataFormat(String dataFormat) {
+ this.dataFormat = dataFormat;
+ return this;
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/TableVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/TableVo.java
new file mode 100644
index 00000000..5bd4141b
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/entity/vo/TableVo.java
@@ -0,0 +1,27 @@
+package com.yfd.platform.qgc_env.fb.entity.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TableVo {
+
+ private List columns;
+
+ private Object dataSource;
+
+ private Long total;
+
+ private Integer wtDeviceType;
+
+ public TableVo() {
+ }
+
+ public TableVo(List dataSource, Long total) {
+ this.dataSource = dataSource;
+ if (total != null) {
+ this.total = total;
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java
index 1bada486..77cd39aa 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/FbStationService.java
@@ -16,6 +16,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo;
+import com.yfd.platform.qgc_env.fb.entity.vo.TableVo;
import java.util.List;
import java.util.Map;
@@ -57,4 +58,8 @@ public interface FbStationService {
DataSourceResult getOverviewSecond(DataSourceRequest dataSourceRequest);
DataSourceResult getQgcOverviewSecond(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getFishhatchrecrFishKendoListCust(Integer type, DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getFishbreedrFishKendoListCust(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java
index a3e50842..d3df7885 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java
@@ -30,6 +30,10 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationOverviewSecondVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsRawVo;
+import com.yfd.platform.qgc_env.fb.entity.vo.FishbreedRVo;
+import com.yfd.platform.qgc_env.fb.entity.vo.FishhatchrecRVo;
+import com.yfd.platform.qgc_env.fb.entity.vo.HeadColunmsVo;
+import com.yfd.platform.qgc_env.fb.entity.vo.TableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.YearRpStatisticsVo;
import com.yfd.platform.qgc_env.fb.service.FbStationService;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
@@ -4103,4 +4107,469 @@ public class FbStationServiceImpl implements FbStationService {
}
values.add(text);
}
+
+ @Override
+ public DataSourceResult getFishhatchrecrFishKendoListCust(Integer type, DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+ String unit = type == 1 ? "(万粒)" : "(万尾)";
+
+ Map paramMap = new HashMap<>();
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT tm, ")
+ .append("LISTAGG(TO_CHAR(ftp), ',') WITHIN GROUP (ORDER BY ftp) AS ftp, ")
+ .append("LISTAGG(TO_CHAR(NAME), ',') WITHIN GROUP (ORDER BY ftp) AS ftpName, ")
+ .append("LISTAGG(eggcount, ',') WITHIN GROUP (ORDER BY ftp) AS eggcount, ")
+ .append("LISTAGG(outcount, ',') WITHIN GROUP (ORDER BY ftp) AS outcount ")
+ .append("FROM (")
+ .append("SELECT ")
+ .append("TO_CHAR(tm, 'YYYY-MM') AS tm, ftp, ")
+ .append("CASE WHEN NAME IS NULL THEN TO_NCHAR(ftp) ELSE NAME END AS NAME, ")
+ .append("CASE WHEN SUM(eggcount) IS NULL THEN '-' ELSE RTRIM(TO_CHAR(SUM(eggcount), 'FM999999999999990.99'), '.') END AS eggcount, ")
+ .append("CASE WHEN SUM(outcount) IS NULL THEN '-' ELSE RTRIM(TO_CHAR(SUM(outcount), 'FM999999999999990.99'), '.') END AS outcount ")
+ .append("FROM (")
+ .append("SELECT ")
+ .append("t.tm, ")
+ .append("CASE WHEN fishViewZy.ZY_FISH_ID IS NULL THEN t.ftp ELSE fishViewZy.ZY_FISH_ID END AS ftp, ")
+ .append("CASE WHEN fishViewZy.NAME IS NULL THEN fishViewRv.NAME ELSE fishViewZy.NAME END AS NAME, ")
+ .append("t.eggcount, ")
+ .append("t.outcount ")
+ .append("FROM SD_FBFISHHATCHREC_R t ")
+ .append("LEFT JOIN SD_FBRD_B_H fb ON t.stcd = fb.STCD ")
+ .append("LEFT JOIN V_SD_FISHDICTORY_B fishViewRv ON t.FTP = fishViewRv.FISH_ID AND fb.HBRVCD = fishViewRv.RVCD ")
+ .append("LEFT JOIN V_SD_FISHDICTORY_B fishViewZy ON t.FTP = fishViewZy.FISH_ID AND fishViewZy.RVCD = 'ZY' ")
+ .append("WHERE NVL(t.IS_DELETED, 0) = 0 ");
+
+ appendFishhatchrecrFishFilterConditions(sql, dataSourceRequest, paramMap);
+
+ sql.append(") GROUP BY TO_CHAR(tm, 'YYYY-MM'), ftp, NAME ")
+ .append(") GROUP BY tm ")
+ .append("ORDER BY tm DESC ");
+
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page, sql.toString(), paramMap, FishhatchrecRVo.class
+ );
+
+ long total = page != null ? page.getTotal() : list.size();
+ TableVo tableVo = buildFishhatchrecrFishTableVo(list, total, type, unit);
+ dataSourceResult.setData(Collections.singletonList(tableVo));
+ dataSourceResult.setTotal(total);
+ dataSourceResult.setAggregates(new HashMap<>());
+ return dataSourceResult;
+ }
+
+ private void appendFishhatchrecrFishFilterConditions(StringBuilder sql,
+ DataSourceRequest dataSourceRequest,
+ Map paramMap) {
+ if (dataSourceRequest == null || dataSourceRequest.getFilter() == null) {
+ return;
+ }
+ String filterSql = buildFishhatchrecrFishFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql).append(" ");
+ }
+ }
+
+ private String buildFishhatchrecrFishFilterCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ if (filter == null) {
+ return "";
+ }
+ if (StrUtil.isNotBlank(filter.getField())) {
+ return buildFishhatchrecrFishLeafCondition(filter, paramMap, indexHolder);
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return "";
+ }
+ List conditions = new ArrayList<>();
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ String childSql = buildFishhatchrecrFishFilterCondition(child, paramMap, indexHolder);
+ if (StrUtil.isNotBlank(childSql)) {
+ conditions.add("(" + childSql + ")");
+ }
+ }
+ if (conditions.isEmpty()) {
+ return "";
+ }
+ String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
+ return String.join(logic, conditions);
+ }
+
+ private String buildFishhatchrecrFishLeafCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ String field = filter.getField();
+ String column = mapFishhatchrecrFishColumn(field);
+ if (StrUtil.isBlank(column)) {
+ return "";
+ }
+ String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
+ Object value = filter.getValue();
+ if ("isnull".equals(operator)) {
+ return column + " IS NULL";
+ }
+ if ("isnotnull".equals(operator)) {
+ return column + " IS NOT NULL";
+ }
+ if ("in".equals(operator)) {
+ List values = normalizeQgcBsmfRValues(value);
+ if (values.isEmpty()) {
+ return "";
+ }
+ List placeholders = new ArrayList<>();
+ for (Object item : values) {
+ String key = "hatchFishP" + indexHolder[0]++;
+ paramMap.put(key, item);
+ placeholders.add("#{map." + key + "}");
+ }
+ return column + " IN (" + String.join(", ", placeholders) + ")";
+ }
+ if (value == null) {
+ return "";
+ }
+ String key = "hatchFishP" + indexHolder[0]++;
+ Object normalizedValue = normalizeFishhatchrecrFishValue(field, value);
+ return switch (operator) {
+ case "eq" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " = #{map." + key + "}";
+ }
+ case "neq" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " <> #{map." + key + "}";
+ }
+ case "contains" -> {
+ paramMap.put(key, "%" + normalizedValue + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "startswith" -> {
+ paramMap.put(key, normalizedValue + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "endswith" -> {
+ paramMap.put(key, "%" + normalizedValue);
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "gt" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " > #{map." + key + "}";
+ }
+ case "gte" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " >= #{map." + key + "}";
+ }
+ case "lt" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " < #{map." + key + "}";
+ }
+ case "lte" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " <= #{map." + key + "}";
+ }
+ default -> "";
+ };
+ }
+
+ private String mapFishhatchrecrFishColumn(String field) {
+ return switch (field) {
+ case "stcd" -> "t.STCD";
+ case "ftp" -> "t.FTP";
+ case "fishsrc" -> "t.FISHSRC";
+ case "tm" -> "t.TM";
+ case "rstcd" -> "fb.RSTCD";
+ case "baseId" -> "fb.BASE_ID";
+ case "hbrvcd" -> "fb.HBRVCD";
+ default -> "";
+ };
+ }
+
+ private Object normalizeFishhatchrecrFishValue(String field, Object value) {
+ if (value == null) {
+ return null;
+ }
+ if ("tm".equalsIgnoreCase(field) && value instanceof String text) {
+ return parseDateTimeSafely(text);
+ }
+ return value;
+ }
+
+ private TableVo buildFishhatchrecrFishTableVo(List list, long total, Integer type, String unit) {
+ TableVo tableVo = new TableVo();
+ List> resultData = new ArrayList<>();
+ List columns = new ArrayList<>();
+ Map fishMap = new LinkedHashMap<>();
+
+ if (CollUtil.isNotEmpty(list)) {
+ for (FishhatchrecRVo vo : list) {
+ Map rowMap = new LinkedHashMap<>();
+ rowMap.put("tm", vo.getTm());
+
+ List ftpList = splitCsv(vo.getFtp());
+ List ftpNameList = splitCsv(vo.getFtpName());
+ List eggCountList = splitCsv(vo.getEggcount());
+ List outCountList = splitCsv(vo.getOutcount());
+
+ int size = Math.min(ftpList.size(), Math.min(ftpNameList.size(),
+ Math.min(eggCountList.size(), outCountList.size())));
+
+ for (int i = 0; i < size; i++) {
+ String ftp = ftpList.get(i);
+ String ftpName = ftpNameList.get(i);
+ String value = type == 1 ? eggCountList.get(i) : outCountList.get(i);
+ rowMap.put(ftp, "-".equals(value) ? null : value);
+ fishMap.putIfAbsent(ftp, ftpName);
+ }
+ resultData.add(rowMap);
+ }
+ }
+
+ columns.add(new HeadColunmsVo("tm", "时间", true, "tm", false, new ArrayList<>())
+ .setDataType("date")
+ .setDataFormat("yyyy-MM"));
+ for (Map.Entry entry : fishMap.entrySet()) {
+ columns.add(new HeadColunmsVo(entry.getKey(), entry.getValue() + unit, true, entry.getKey(), false, new ArrayList<>()));
+ }
+
+ tableVo.setColumns(columns);
+ tableVo.setDataSource(resultData);
+ tableVo.setTotal(total);
+ return tableVo;
+ }
+
+ @Override
+ public DataSourceResult getFishbreedrFishKendoListCust(DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+
+ Map paramMap = new HashMap<>();
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT tm,\n")
+ .append("LISTAGG(TO_CHAR(ftp), ',') WITHIN GROUP (ORDER BY ftp) AS ftp,\n")
+ .append("LISTAGG(TO_CHAR(NAME), ',') WITHIN GROUP (ORDER BY ftp) AS ftpName,\n")
+ .append("LISTAGG(counts, ',') WITHIN GROUP (ORDER BY ftp) AS counts\n")
+ .append("FROM (\n")
+ .append("SELECT \n")
+ .append("to_CHAR(tm,'YYYY-MM') AS tm, ftp, CASE WHEN NAME IS NULL THEN TO_NCHAR(ftp) ELSE NAME END AS NAME, CASE WHEN SUM(counts) IS NULL THEN '-' ELSE TO_CHAR(SUM(counts)) END AS counts\n")
+ .append("FROM (\n")
+ .append("SELECT\n")
+ .append("\tt.tm,\n")
+ .append("\tCASE WHEN f.ZY_FISH_ID IS NULL THEN t.ftp ELSE f.ZY_FISH_ID END AS ftp,\n")
+ .append("\tCASE WHEN f.NAME IS NULL THEN TO_NCHAR(t.ftp) ELSE f.NAME END AS NAME,\n")
+ .append("\tt.counts\n")
+ .append("FROM\n")
+ .append("\t(\n")
+ .append("\tSELECT\n")
+ .append("\t\tstcd,\n")
+ .append("\t\tftp AS ftp,\n")
+ .append("\t\tcounts AS counts,\n")
+ .append("\t\ttm AS tm\n")
+ .append("\tFROM\n")
+ .append("\t\tSD_FBFISHBREED_R\n")
+ .append("\tWHERE\n")
+ .append("\t\tNVL(is_deleted, 0) = 0 ");
+
+ appendFishbreedrFishFilterConditions(sql, dataSourceRequest, paramMap);
+
+ sql.append(") t\n")
+ .append("LEFT JOIN SD_FBRD_B_H s ON\n")
+ .append("\tt.stcd = s.STCD\n")
+ .append("LEFT JOIN V_SD_FISHDICTORY_B f ON\n")
+ .append("\tt.FTP = f.FISH_ID\n")
+ .append("\tAND (s.HBRVCD = f.RVCD\n")
+ .append("\t\tOR f.RVCD = 'ZY')\n")
+ .append(") GROUP BY to_CHAR(tm,'YYYY-MM'), ftp, NAME\n")
+ .append(") GROUP BY tm\n")
+ .append("ORDER BY TM DESC");
+
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page, sql.toString(), paramMap, FishbreedRVo.class
+ );
+
+ long total = page != null ? page.getTotal() : list.size();
+ TableVo tableVo = buildFishbreedrFishTableVo(list, total);
+ dataSourceResult.setData(Collections.singletonList(tableVo));
+ dataSourceResult.setTotal(total);
+ dataSourceResult.setAggregates(new HashMap<>());
+ return dataSourceResult;
+ }
+
+ private void appendFishbreedrFishFilterConditions(StringBuilder sql,
+ DataSourceRequest dataSourceRequest,
+ Map paramMap) {
+ if (dataSourceRequest == null || dataSourceRequest.getFilter() == null) {
+ return;
+ }
+ String filterSql = buildFishbreedrFishFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql).append(" ");
+ }
+ }
+
+ private String buildFishbreedrFishFilterCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ if (filter == null) {
+ return "";
+ }
+ if (StrUtil.isNotBlank(filter.getField())) {
+ return buildFishbreedrFishLeafCondition(filter, paramMap, indexHolder);
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return "";
+ }
+ List conditions = new ArrayList<>();
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ String childSql = buildFishbreedrFishFilterCondition(child, paramMap, indexHolder);
+ if (StrUtil.isNotBlank(childSql)) {
+ conditions.add("(" + childSql + ")");
+ }
+ }
+ if (conditions.isEmpty()) {
+ return "";
+ }
+ String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
+ return String.join(logic, conditions);
+ }
+
+ private String buildFishbreedrFishLeafCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ String field = filter.getField();
+ String column = mapFishbreedrFishColumn(field);
+ if (StrUtil.isBlank(column)) {
+ return "";
+ }
+ String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
+ Object value = filter.getValue();
+ if ("isnull".equals(operator)) {
+ return column + " IS NULL";
+ }
+ if ("isnotnull".equals(operator)) {
+ return column + " IS NOT NULL";
+ }
+ if ("in".equals(operator)) {
+ List values = normalizeQgcBsmfRValues(value);
+ if (values.isEmpty()) {
+ return "";
+ }
+ List placeholders = new ArrayList<>();
+ for (Object item : values) {
+ String key = "breedFishP" + indexHolder[0]++;
+ paramMap.put(key, item);
+ placeholders.add("#{map." + key + "}");
+ }
+ return column + " IN (" + String.join(", ", placeholders) + ")";
+ }
+ if (value == null) {
+ return "";
+ }
+ String key = "breedFishP" + indexHolder[0]++;
+ Object normalizedValue = normalizeFishbreedrFishValue(field, value);
+ return switch (operator) {
+ case "eq" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " = #{map." + key + "}";
+ }
+ case "neq" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " <> #{map." + key + "}";
+ }
+ case "contains" -> {
+ paramMap.put(key, "%" + normalizedValue + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "startswith" -> {
+ paramMap.put(key, normalizedValue + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "endswith" -> {
+ paramMap.put(key, "%" + normalizedValue);
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "gt" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " > #{map." + key + "}";
+ }
+ case "gte" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " >= #{map." + key + "}";
+ }
+ case "lt" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " < #{map." + key + "}";
+ }
+ case "lte" -> {
+ paramMap.put(key, normalizedValue);
+ yield column + " <= #{map." + key + "}";
+ }
+ default -> "";
+ };
+ }
+
+ private String mapFishbreedrFishColumn(String field) {
+ return switch (field) {
+ case "stcd" -> "STCD";
+ case "ftp" -> "t.FTP";
+ case "counts" -> "t.COUNTS";
+ case "tm" -> "TM";
+ case "rstcd" -> "s.RSTCD";
+ case "baseId" -> "s.BASE_ID";
+ case "hbrvcd" -> "s.HBRVCD";
+ default -> "";
+ };
+ }
+
+ private Object normalizeFishbreedrFishValue(String field, Object value) {
+ if (value == null) {
+ return null;
+ }
+ if ("tm".equalsIgnoreCase(field) && value instanceof String text) {
+ return parseDateTimeSafely(text);
+ }
+ return value;
+ }
+
+ private TableVo buildFishbreedrFishTableVo(List list, long total) {
+ TableVo tableVo = new TableVo();
+ List> resultData = new ArrayList<>();
+ List columns = new ArrayList<>();
+ Map fishMap = new LinkedHashMap<>();
+
+ if (CollUtil.isNotEmpty(list)) {
+ for (FishbreedRVo vo : list) {
+ Map rowMap = new LinkedHashMap<>();
+ rowMap.put("tm", vo.getTm());
+
+ List ftpList = splitCsv(vo.getFtp());
+ List ftpNameList = splitCsv(vo.getFtpName());
+ List countsList = splitCsv(vo.getCounts());
+
+ int size = Math.min(ftpList.size(), Math.min(ftpNameList.size(), countsList.size()));
+
+ for (int i = 0; i < size; i++) {
+ String ftp = ftpList.get(i);
+ String ftpName = ftpNameList.get(i);
+ String countStr = countsList.get(i);
+ rowMap.put(ftp, "-".equals(countStr) ? null : countStr);
+ fishMap.putIfAbsent(ftp, ftpName);
+ }
+ resultData.add(rowMap);
+ }
+ }
+
+ columns.add(new HeadColunmsVo("tm", "时间", true, "tm", false, new ArrayList<>())
+ .setDataType("date")
+ .setDataFormat("yyyy-MM"));
+ for (Map.Entry entry : fishMap.entrySet()) {
+ columns.add(new HeadColunmsVo(entry.getKey(), entry.getValue() + "(尾)", true, entry.getKey(), false, new ArrayList<>()));
+ }
+
+ tableVo.setColumns(columns);
+ tableVo.setDataSource(resultData);
+ tableVo.setTotal(total);
+ return tableVo;
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java
new file mode 100644
index 00000000..a3ed0a61
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/controller/OverviewController.java
@@ -0,0 +1,35 @@
+package com.yfd.platform.qgc_env.overview.controller;
+
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.qgc_env.overview.service.OverviewService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/overview")
+@Tag(name = "首页概览")
+@Validated
+public class OverviewController {
+
+ @Resource
+ private OverviewService overviewService;
+
+ @PostMapping("/msstbprpt/GetKendoList")
+ @Operation(summary = "首页基础设施概览列表")
+ public ResponseResult getMsstbprptList(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(overviewService.getMsstbprptList(dataSourceRequest));
+ }
+
+ @PostMapping("/oped/GetKendoListCust")
+ @Operation(summary = "首页环保设施运行状况明细")
+ public ResponseResult getOpedList(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(overviewService.getOpedList(dataSourceRequest));
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewMsstbprptVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewMsstbprptVo.java
new file mode 100644
index 00000000..effa1e33
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewMsstbprptVo.java
@@ -0,0 +1,72 @@
+package com.yfd.platform.qgc_env.overview.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@Schema(description = "首页基础设施概览列表")
+public class OverviewMsstbprptVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String id;
+ private String stcd;
+ private String stnm;
+ private String sttp;
+ private String sttpCode;
+ private String sttpName;
+ private String sttpFullPath;
+ private Integer sttpTreeLevel;
+ private String blprdId;
+ private Double lgtd;
+ private Double lttd;
+ private Double dtmel;
+ private String stlc;
+ private Integer usfl;
+ private String rstcd;
+ private String ennm;
+ private String baseId;
+ private String baseName;
+ private String hbrvcd;
+ private String hbrvcdName;
+ private String rvcd;
+ private String rvcdName;
+ private String addvcd;
+ private String addvcdName;
+ private String country;
+ private String countryName;
+ private String stCode;
+ private String stName;
+ private Date stdsdt;
+ private Date pststdt;
+ private Date pesstdt;
+ private Date ststdt;
+ private Date jcdt;
+ private Date stwddt;
+ private String introduce;
+ private String precis;
+ private String logo;
+ private String inffile;
+ private Integer dtin;
+ private String dtinName;
+ private Date dtinTm;
+ private Integer bldsttCode;
+ private String bldsttCcode;
+ private String bldsttCcodeName;
+ private Double inv;
+ private Integer invinmn;
+ private String dsun;
+ private String jbtxcs;
+ private Integer dtfrqcy;
+ private String remark;
+ private String vlsr;
+ private Date vlsrTm;
+ private Integer orderIndex;
+ private Integer baseStepSort;
+ private Integer rvcdStepSort;
+ private Integer rstcdStepSort;
+ private Integer siteStepSort;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java
new file mode 100644
index 00000000..67a71e8a
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/entity/vo/OverviewOpedVo.java
@@ -0,0 +1,65 @@
+package com.yfd.platform.qgc_env.overview.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Schema(description = "首页环保设施运行状况明细")
+public class OverviewOpedVo implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Map _tls = new HashMap<>();
+
+ private String id;
+ private String recordUser;
+ private Date recordTime;
+ private Date modifyTime;
+ private String displayRecordUser;
+ private String repCode;
+ private String pcode;
+ private String pname;
+ private String psttpName;
+ private String sttpName;
+ private String baseId;
+ private String stcd;
+ private String stnm;
+ private String sttpCode;
+ private String baseName;
+ private String rstcd;
+ private String ennm;
+ private String bldsttCcode;
+ private String bldsttCcodeName;
+ private Date dtinTm;
+ private Integer dtin;
+ private String dtinName;
+ private Integer runState;
+ private String runStateName;
+ private Integer stdState;
+ private String stdStateName;
+ private Integer stdSstate;
+ private String stdSstateName;
+ private Integer runSstate;
+ private String runSstateName;
+ private Integer mway;
+ private String mwayName;
+ private String hbrvcd;
+ private String hbrvcdName;
+ private String addvcdName;
+ private String rvcdName;
+ private Integer baseStepSort;
+ private Integer baseStepsort;
+ private Integer rvcdStepSort;
+ private Integer rstcdStepSort;
+ private Integer rstcdStepsort;
+ private Integer siteStepSort;
+ private Integer count;
+ private Date jcdt;
+ private String departmentId;
+ private String displayDepartment;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java
new file mode 100644
index 00000000..481e665f
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/OverviewService.java
@@ -0,0 +1,13 @@
+package com.yfd.platform.qgc_env.overview.service;
+
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.common.DataSourceResult;
+import com.yfd.platform.qgc_env.overview.entity.vo.OverviewMsstbprptVo;
+import com.yfd.platform.qgc_env.overview.entity.vo.OverviewOpedVo;
+
+public interface OverviewService {
+
+ DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getOpedList(DataSourceRequest dataSourceRequest);
+}
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
new file mode 100644
index 00000000..79ec09ab
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/overview/service/impl/OverviewServiceImpl.java
@@ -0,0 +1,1343 @@
+package com.yfd.platform.qgc_env.overview.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.common.DataSourceLoadOptionsBase;
+import com.yfd.platform.common.DataSourceRequest;
+import com.yfd.platform.common.DataSourceResult;
+import com.yfd.platform.common.GroupHelper;
+import com.yfd.platform.common.GroupingInfo;
+import com.yfd.platform.common.MicroservicDynamicSQLMapper;
+import com.yfd.platform.qgc_env.overview.entity.vo.OverviewMsstbprptVo;
+import com.yfd.platform.qgc_env.overview.entity.vo.OverviewOpedVo;
+import com.yfd.platform.qgc_env.overview.service.OverviewService;
+import com.yfd.platform.utils.QgcQueryWrapperUtil;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.time.Year;
+
+@Service
+public class OverviewServiceImpl implements OverviewService {
+
+ @Resource
+ private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
+
+ @Override
+ public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) {
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ List selectFields = resolveSelectFields(dataSourceRequest == null ? null : dataSourceRequest.getSelect());
+
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append(buildSelectSql(selectFields))
+ .append(" FROM (")
+ .append(buildBaseSql())
+ .append(") t WHERE 1 = 1 ");
+
+ Map paramMap = new HashMap<>();
+ String filterSql = buildFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql);
+ }
+ sql.append(buildOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
+
+ Page> page = loadOptions == null ? null
+ : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page, sql.toString(), paramMap, OverviewMsstbprptVo.class
+ );
+
+ DataSourceResult result = new DataSourceResult<>();
+ result.setData(list);
+ result.setTotal(page == null ? list.size() : page.getTotal());
+ result.setAggregates(new HashMap<>());
+ return result;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public DataSourceResult getOpedList(DataSourceRequest dataSourceRequest) {
+ DataSourceResult result = new DataSourceResult<>();
+ result.setAggregates(new HashMap<>());
+ if (dataSourceRequest == null) {
+ result.setData(new ArrayList<>());
+ result.setTotal(0L);
+ return result;
+ }
+
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
+ Map paramMap = new HashMap<>();
+ paramMap.put("stateYear", resolveOpedStateYear());
+ if (shouldQueryOpedSummary(dataSourceRequest)) {
+ return queryOpedSummaryList(dataSourceRequest, loadOptions, paramMap);
+ }
+
+ String filterSql = buildOpedFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
+ if (CollUtil.isNotEmpty(dataSourceRequest.getGroup())) {
+ GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup();
+ String groupSql = buildOpedGroupSql(buildOpedDetailSql(null, filterSql), groupInfos);
+ Page> page = loadOptions == null ? null
+ : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List> rows = microservicDynamicSQLMapper.pageAllList(page, groupSql, paramMap);
+ if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
+ result.setData((List) (List>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
+ } else {
+ result.setData((List) (List>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
+ }
+ result.setTotal(0L);
+ return result;
+ }
+
+ String sql = buildOpedDetailSql(dataSourceRequest.getSelect(), filterSql)
+ + buildOpedOrderBySql(dataSourceRequest.getSort());
+ Page> page = loadOptions == null ? null
+ : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page, sql, paramMap, OverviewOpedVo.class
+ );
+ result.setData(list);
+ result.setTotal(page == null ? list.size() : page.getTotal());
+ return result;
+ }
+
+ private DataSourceResult queryOpedSummaryList(DataSourceRequest dataSourceRequest,
+ DataSourceLoadOptionsBase loadOptions,
+ Map paramMap) {
+ String effectiveFilterSql = buildOpedEffectiveFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0});
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append(buildOpedSummarySelectSql(dataSourceRequest.getSelect()))
+ .append(" FROM (")
+ .append(buildOpedCategorySql())
+ .append(") cat ")
+ .append("LEFT JOIN (SELECT * FROM (")
+ .append(buildOpedBaseSql())
+ .append(") t WHERE 1 = 1 ");
+ if (StrUtil.isNotBlank(effectiveFilterSql)) {
+ sql.append(" AND ").append(effectiveFilterSql);
+ }
+ sql.append(") src ON cat.repCode = src.repCode ")
+ .append("GROUP BY cat.repCode, cat.sttpName, cat.orderIndex ")
+ .append(buildOpedSummaryOrderBySql(dataSourceRequest.getSort()));
+
+ Page> page = loadOptions == null ? null
+ : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page, sql.toString(), paramMap, OverviewOpedVo.class
+ );
+
+ DataSourceResult result = new DataSourceResult<>();
+ result.setData(list);
+ result.setTotal(page == null ? list.size() : page.getTotal());
+ result.setAggregates(new HashMap<>());
+ return result;
+ }
+
+ private String buildBaseSql() {
+ return buildFbSql() + " UNION ALL " + buildDwSql() + " UNION ALL " + buildFpSql();
+ }
+
+ private String buildFbSql() {
+ return "SELECT " +
+ "fb.STCD AS id, " +
+ "fb.STCD AS stcd, " +
+ "fb.STNM AS stnm, " +
+ "fb.STTP AS sttp, " +
+ "fb.STTP AS sttpCode, " +
+ "sttp.STTP_NAME AS sttpName, " +
+ "sttp.FULL_PATH AS sttpFullPath, " +
+ "sttp.TREE_LEVEL AS sttpTreeLevel, " +
+ "CAST(fb.BLPRD AS VARCHAR2(64)) AS blprdId, " +
+ "fb.LGTD AS lgtd, " +
+ "fb.LTTD AS lttd, " +
+ "fb.ELEV AS dtmel, " +
+ "fb.STLC AS stlc, " +
+ "fb.USFL AS usfl, " +
+ "fb.RSTCD AS rstcd, " +
+ "eng.ENNM AS ennm, " +
+ "NVL(fb.BASE_ID, eng.BASE_ID) AS baseId, " +
+ "hb.BASENAME AS baseName, " +
+ "NVL(fb.HBRVCD, eng.HBRVCD) AS hbrvcd, " +
+ "hbrv.HBRVNM AS hbrvcdName, " +
+ "eng.RVCD AS rvcd, " +
+ "rv.RVNM AS rvcdName, " +
+ "eng.ADDVCD AS addvcd, " +
+ "addv.ADDVNM AS addvcdName, " +
+ "eng.COUNTRY AS country, " +
+ "country.COUNTRY_NAME AS countryName, " +
+ "CAST(NULL AS VARCHAR2(64)) AS stCode, " +
+ "CAST(NULL AS VARCHAR2(200)) AS stName, " +
+ "fb.STDSDT AS stdsdt, " +
+ "fb.PSTSTDT AS pststdt, " +
+ "fb.PESSTDT AS pesstdt, " +
+ "fb.SWDT AS ststdt, " +
+ "fb.JCDT AS jcdt, " +
+ "fb.WDDT AS stwddt, " +
+ "fb.INTRODUCE AS introduce, " +
+ "fb.INTRODUCE AS precis, " +
+ "fb.LOGO AS logo, " +
+ "fb.INFFILE AS inffile, " +
+ "fb.DTIN AS dtin, " +
+ "CASE WHEN NVL(fb.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " +
+ "fb.DTIN_TM AS dtinTm, " +
+ "fb.BLDSTT_CODE AS bldsttCode, " +
+ "CASE fb.BLDSTT_CODE WHEN 0 THEN '0' WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE NULL END AS bldsttCcode, " +
+ "CASE fb.BLDSTT_CODE WHEN 0 THEN '未建/规划' WHEN 1 THEN '在建' WHEN 2 THEN '已建' ELSE NULL END AS bldsttCcodeName, " +
+ "fb.INV AS inv, " +
+ "fb.INVINMN AS invinmn, " +
+ "fb.DSUN AS dsun, " +
+ "fb.JBTXCS AS jbtxcs, " +
+ "fb.DTFRQCY AS dtfrqcy, " +
+ "fb.REMARK AS remark, " +
+ "fb.VLSR AS vlsr, " +
+ "fb.VLSR_TM AS vlsrTm, " +
+ "fb.ORDER_INDEX AS orderIndex, " +
+ "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
+ "NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, " +
+ "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
+ "NVL(fb.ORDER_INDEX, 999999) AS siteStepSort " +
+ "FROM SD_FBRD_B_H fb " +
+ "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = fb.STTP AND NVL(sttp.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fb.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) " +
+ " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " +
+ "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
+ "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
+ "LEFT JOIN SD_COUNTRY_B country ON country.COUNTRY_ID = eng.COUNTRY AND NVL(country.ENABLED, 1) = 1 ";
+ }
+
+ private String buildDwSql() {
+ return "SELECT " +
+ "dw.STCD AS id, " +
+ "dw.STCD AS stcd, " +
+ "dw.STNM AS stnm, " +
+ "dw.STTP AS sttp, " +
+ "dw.STTP AS sttpCode, " +
+ "sttp.STTP_NAME AS sttpName, " +
+ "sttp.FULL_PATH AS sttpFullPath, " +
+ "sttp.TREE_LEVEL AS sttpTreeLevel, " +
+ "CAST(NULL AS VARCHAR2(64)) AS blprdId, " +
+ "dw.LGTD AS lgtd, " +
+ "dw.LTTD AS lttd, " +
+ "dw.ELEV AS dtmel, " +
+ "dw.STLC AS stlc, " +
+ "dw.USFL AS usfl, " +
+ "dw.RSTCD AS rstcd, " +
+ "eng.ENNM AS ennm, " +
+ "NVL(dw.BASE_ID, eng.BASE_ID) AS baseId, " +
+ "hb.BASENAME AS baseName, " +
+ "NVL(dw.HBRVCD, eng.HBRVCD) AS hbrvcd, " +
+ "hbrv.HBRVNM AS hbrvcdName, " +
+ "eng.RVCD AS rvcd, " +
+ "rv.RVNM AS rvcdName, " +
+ "eng.ADDVCD AS addvcd, " +
+ "addv.ADDVNM AS addvcdName, " +
+ "eng.COUNTRY AS country, " +
+ "country.COUNTRY_NAME AS countryName, " +
+ "CAST(NULL AS VARCHAR2(64)) AS stCode, " +
+ "CAST(NULL AS VARCHAR2(200)) AS stName, " +
+ "dw.STDSDT AS stdsdt, " +
+ "dw.PSTSTDT AS pststdt, " +
+ "dw.PESSTDT AS pesstdt, " +
+ "dw.SWDT AS ststdt, " +
+ "dw.JCDT AS jcdt, " +
+ "dw.WDDT AS stwddt, " +
+ "dw.INTRODUCE AS introduce, " +
+ "dw.INTRODUCE AS precis, " +
+ "dw.LOGO AS logo, " +
+ "dw.INFFILE AS inffile, " +
+ "dw.DTIN AS dtin, " +
+ "CASE WHEN NVL(dw.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " +
+ "dw.DTIN_TM AS dtinTm, " +
+ "dw.BLDSTT_CODE AS bldsttCode, " +
+ "CASE dw.BLDSTT_CODE WHEN 0 THEN '0' WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE NULL END AS bldsttCcode, " +
+ "CASE dw.BLDSTT_CODE WHEN 0 THEN '未建/规划' WHEN 1 THEN '在建' WHEN 2 THEN '已建' ELSE NULL END AS bldsttCcodeName, " +
+ "dw.INV AS inv, " +
+ "dw.INVINMN AS invinmn, " +
+ "CAST(NULL AS VARCHAR2(500)) AS dsun, " +
+ "dw.QTSSJBTX AS jbtxcs, " +
+ "dw.DTFRQCY AS dtfrqcy, " +
+ "dw.REMARK AS remark, " +
+ "dw.VLSR AS vlsr, " +
+ "dw.VLSR_TM AS vlsrTm, " +
+ "dw.ORDER_INDEX AS orderIndex, " +
+ "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
+ "NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, " +
+ "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
+ "NVL(dw.ORDER_INDEX, 999999) AS siteStepSort " +
+ "FROM SD_DW_B_H dw " +
+ "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = dw.STTP AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = dw.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(dw.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) " +
+ " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " +
+ "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
+ "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
+ "LEFT JOIN SD_COUNTRY_B country ON country.COUNTRY_ID = eng.COUNTRY AND NVL(country.ENABLED, 1) = 1 " +
+ "WHERE NVL(dw.IS_DELETED, 0) = 0 ";
+ }
+
+ private String buildFpSql() {
+ return "SELECT " +
+ "fp.STCD AS id, " +
+ "fp.STCD AS stcd, " +
+ "fp.STNM AS stnm, " +
+ "fp.STTP AS sttp, " +
+ "fp.STTP AS sttpCode, " +
+ "sttp.STTP_NAME AS sttpName, " +
+ "sttp.FULL_PATH AS sttpFullPath, " +
+ "sttp.TREE_LEVEL AS sttpTreeLevel, " +
+ "CAST(fp.BLPRD AS VARCHAR2(64)) AS blprdId, " +
+ "fp.LGTD AS lgtd, " +
+ "fp.LTTD AS lttd, " +
+ "fp.ELEV AS dtmel, " +
+ "fp.STLC AS stlc, " +
+ "fp.USFL AS usfl, " +
+ "fp.RSTCD AS rstcd, " +
+ "eng.ENNM AS ennm, " +
+ "eng.BASE_ID AS baseId, " +
+ "hb.BASENAME AS baseName, " +
+ "eng.HBRVCD AS hbrvcd, " +
+ "hbrv.HBRVNM AS hbrvcdName, " +
+ "eng.RVCD AS rvcd, " +
+ "rv.RVNM AS rvcdName, " +
+ "eng.ADDVCD AS addvcd, " +
+ "addv.ADDVNM AS addvcdName, " +
+ "eng.COUNTRY AS country, " +
+ "country.COUNTRY_NAME AS countryName, " +
+ "CAST(NULL AS VARCHAR2(64)) AS stCode, " +
+ "CAST(NULL AS VARCHAR2(200)) AS stName, " +
+ "fp.STDSDT AS stdsdt, " +
+ "fp.PSTSTDT AS pststdt, " +
+ "fp.PESSTDT AS pesstdt, " +
+ "fp.SWDT AS ststdt, " +
+ "fp.JCDT AS jcdt, " +
+ "fp.WDDT AS stwddt, " +
+ "fp.INTRODUCE AS introduce, " +
+ "fp.INTRODUCE AS precis, " +
+ "fp.LOGO AS logo, " +
+ "fp.INFFILE AS inffile, " +
+ "fp.DTIN AS dtin, " +
+ "CASE WHEN NVL(fp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " +
+ "fp.DTIN_TM AS dtinTm, " +
+ "fp.BLDSTT_CODE AS bldsttCode, " +
+ "CASE fp.BLDSTT_CODE WHEN 0 THEN '0' WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE NULL END AS bldsttCcode, " +
+ "CASE fp.BLDSTT_CODE WHEN 0 THEN '未建/规划' WHEN 1 THEN '在建' WHEN 2 THEN '已建' ELSE NULL END AS bldsttCcodeName, " +
+ "fp.INV AS inv, " +
+ "fp.INVINMN AS invinmn, " +
+ "CAST(NULL AS VARCHAR2(500)) AS dsun, " +
+ "fp.JBTXCS AS jbtxcs, " +
+ "fp.DTFRQCY AS dtfrqcy, " +
+ "fp.REMARK AS remark, " +
+ "fp.VLSR AS vlsr, " +
+ "fp.VLSR_TM AS vlsrTm, " +
+ "fp.ORDER_INDEX AS orderIndex, " +
+ "NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
+ "NVL(hbrv.ORDER_INDEX, 999999) AS rvcdStepSort, " +
+ "NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
+ "NVL(fp.ORDER_INDEX, 999999) AS siteStepSort " +
+ "FROM SD_FPSS_B_H fp " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " +
+ " AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1 " +
+ "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = fp.STTP AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
+ "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
+ "LEFT JOIN SD_COUNTRY_B country ON country.COUNTRY_ID = eng.COUNTRY AND NVL(country.ENABLED, 1) = 1 ";
+ }
+
+ private List resolveSelectFields(List select) {
+ List fields = CollUtil.isEmpty(select)
+ ? new ArrayList<>(buildSelectMap().keySet())
+ : new ArrayList<>(select);
+ LinkedHashSet uniqueFields = new LinkedHashSet<>();
+ for (String field : fields) {
+ if (StrUtil.isNotBlank(field)) {
+ uniqueFields.add(field.trim());
+ }
+ }
+ if (uniqueFields.isEmpty()) {
+ uniqueFields.add("stcd");
+ }
+ return new ArrayList<>(uniqueFields);
+ }
+
+ private String buildSelectSql(List selectFields) {
+ Map columnMap = buildSelectMap();
+ List selectParts = new ArrayList<>();
+ for (String field : selectFields) {
+ String column = columnMap.get(field);
+ if (StrUtil.isNotBlank(column)) {
+ selectParts.add(column);
+ } else {
+ selectParts.add("NULL AS \"" + field + "\"");
+ }
+ }
+ if (selectParts.isEmpty()) {
+ selectParts.add("t.stcd AS \"stcd\"");
+ }
+ return String.join(", ", selectParts);
+ }
+
+ private Map buildSelectMap() {
+ Map columnMap = new LinkedHashMap<>();
+ columnMap.put("id", "t.id AS \"id\"");
+ columnMap.put("stcd", "t.stcd AS \"stcd\"");
+ columnMap.put("stnm", "t.stnm AS \"stnm\"");
+ columnMap.put("sttp", "t.sttp AS \"sttp\"");
+ columnMap.put("sttpCode", "t.sttpCode AS \"sttpCode\"");
+ columnMap.put("sttpName", "t.sttpName AS \"sttpName\"");
+ columnMap.put("sttpFullPath", "t.sttpFullPath AS \"sttpFullPath\"");
+ columnMap.put("sttpTreeLevel", "t.sttpTreeLevel AS \"sttpTreeLevel\"");
+ columnMap.put("blprdId", "t.blprdId AS \"blprdId\"");
+ columnMap.put("lgtd", "t.lgtd AS \"lgtd\"");
+ columnMap.put("lttd", "t.lttd AS \"lttd\"");
+ columnMap.put("dtmel", "t.dtmel AS \"dtmel\"");
+ columnMap.put("stlc", "t.stlc AS \"stlc\"");
+ columnMap.put("usfl", "t.usfl AS \"usfl\"");
+ columnMap.put("rstcd", "t.rstcd AS \"rstcd\"");
+ columnMap.put("ennm", "t.ennm AS \"ennm\"");
+ columnMap.put("baseId", "t.baseId AS \"baseId\"");
+ columnMap.put("baseName", "t.baseName AS \"baseName\"");
+ columnMap.put("hbrvcd", "t.hbrvcd AS \"hbrvcd\"");
+ columnMap.put("hbrvcdName", "t.hbrvcdName AS \"hbrvcdName\"");
+ columnMap.put("rvcd", "t.rvcd AS \"rvcd\"");
+ columnMap.put("rvcdName", "t.rvcdName AS \"rvcdName\"");
+ columnMap.put("addvcd", "t.addvcd AS \"addvcd\"");
+ columnMap.put("addvcdName", "t.addvcdName AS \"addvcdName\"");
+ columnMap.put("country", "t.country AS \"country\"");
+ columnMap.put("countryName", "t.countryName AS \"countryName\"");
+ columnMap.put("stCode", "t.stCode AS \"stCode\"");
+ columnMap.put("stName", "t.stName AS \"stName\"");
+ columnMap.put("stdsdt", "t.stdsdt AS \"stdsdt\"");
+ columnMap.put("pststdt", "t.pststdt AS \"pststdt\"");
+ columnMap.put("pesstdt", "t.pesstdt AS \"pesstdt\"");
+ columnMap.put("ststdt", "t.ststdt AS \"ststdt\"");
+ columnMap.put("jcdt", "t.jcdt AS \"jcdt\"");
+ columnMap.put("stwddt", "t.stwddt AS \"stwddt\"");
+ columnMap.put("introduce", "t.introduce AS \"introduce\"");
+ columnMap.put("precis", "t.precis AS \"precis\"");
+ columnMap.put("logo", "t.logo AS \"logo\"");
+ columnMap.put("inffile", "t.inffile AS \"inffile\"");
+ columnMap.put("dtin", "t.dtin AS \"dtin\"");
+ columnMap.put("dtinName", "t.dtinName AS \"dtinName\"");
+ columnMap.put("dtinTm", "t.dtinTm AS \"dtinTm\"");
+ columnMap.put("bldsttCode", "t.bldsttCode AS \"bldsttCode\"");
+ columnMap.put("bldsttCcode", "t.bldsttCcode AS \"bldsttCcode\"");
+ columnMap.put("bldsttCcodeName", "t.bldsttCcodeName AS \"bldsttCcodeName\"");
+ columnMap.put("inv", "t.inv AS \"inv\"");
+ columnMap.put("invinmn", "t.invinmn AS \"invinmn\"");
+ columnMap.put("dsun", "t.dsun AS \"dsun\"");
+ columnMap.put("jbtxcs", "t.jbtxcs AS \"jbtxcs\"");
+ columnMap.put("dtfrqcy", "t.dtfrqcy AS \"dtfrqcy\"");
+ columnMap.put("remark", "t.remark AS \"remark\"");
+ columnMap.put("vlsr", "t.vlsr AS \"vlsr\"");
+ columnMap.put("vlsrTm", "t.vlsrTm AS \"vlsrTm\"");
+ columnMap.put("orderIndex", "t.orderIndex AS \"orderIndex\"");
+ columnMap.put("baseStepSort", "t.baseStepSort AS \"baseStepSort\"");
+ columnMap.put("rvcdStepSort", "t.rvcdStepSort AS \"rvcdStepSort\"");
+ columnMap.put("rstcdStepSort", "t.rstcdStepSort AS \"rstcdStepSort\"");
+ columnMap.put("siteStepSort", "t.siteStepSort AS \"siteStepSort\"");
+ return columnMap;
+ }
+
+ private String buildFilterCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ if (filter == null) {
+ return "";
+ }
+ if (StrUtil.isNotBlank(filter.getField())) {
+ return buildLeafCondition(filter, paramMap, indexHolder);
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return "";
+ }
+ List conditions = new ArrayList<>();
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ String childSql = buildFilterCondition(child, paramMap, indexHolder);
+ if (StrUtil.isNotBlank(childSql)) {
+ conditions.add("(" + childSql + ")");
+ }
+ }
+ if (conditions.isEmpty()) {
+ return "";
+ }
+ String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
+ return String.join(logic, conditions);
+ }
+
+ private String buildLeafCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ String field = filter.getField();
+ if (StrUtil.isBlank(field)) {
+ return "";
+ }
+ String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
+ String column = mapFilterColumn(field);
+ if (StrUtil.isBlank(column)) {
+ return "";
+ }
+ if ("isnull".equals(operator)) {
+ return column + " IS NULL";
+ }
+ if ("isnotnull".equals(operator)) {
+ return column + " IS NOT NULL";
+ }
+ if ("isempty".equals(operator)) {
+ return "(" + column + " IS NULL OR " + column + " = '')";
+ }
+ if ("isnotempty".equals(operator)) {
+ return "(" + column + " IS NOT NULL AND " + column + " <> '')";
+ }
+ if ("in".equals(operator) || "ni".equals(operator)) {
+ List values = normalizeValues(filter.getValue());
+ if (values.isEmpty()) {
+ return "";
+ }
+ List placeholders = new ArrayList<>();
+ for (Object item : values) {
+ String key = "overviewP" + indexHolder[0]++;
+ paramMap.put(key, item);
+ placeholders.add("#{map." + key + "}");
+ }
+ if (placeholders.isEmpty()) {
+ return "";
+ }
+ return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")";
+ }
+ Object value = filter.getValue();
+ if (value == null) {
+ return "";
+ }
+ String key = "overviewP" + indexHolder[0]++;
+ return switch (operator) {
+ case "eq" -> {
+ paramMap.put(key, value);
+ yield column + " = #{map." + key + "}";
+ }
+ case "neq" -> {
+ paramMap.put(key, value);
+ yield column + " <> #{map." + key + "}";
+ }
+ case "contains" -> {
+ paramMap.put(key, "%" + value + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "doesnotcontain" -> {
+ paramMap.put(key, "%" + value + "%");
+ yield column + " NOT LIKE #{map." + key + "}";
+ }
+ case "startswith" -> {
+ paramMap.put(key, value + "%");
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "endswith" -> {
+ paramMap.put(key, "%" + value);
+ yield column + " LIKE #{map." + key + "}";
+ }
+ case "gt" -> {
+ paramMap.put(key, value);
+ yield column + " > #{map." + key + "}";
+ }
+ case "gte" -> {
+ paramMap.put(key, value);
+ yield column + " >= #{map." + key + "}";
+ }
+ case "lt" -> {
+ paramMap.put(key, value);
+ yield column + " < #{map." + key + "}";
+ }
+ case "lte" -> {
+ paramMap.put(key, value);
+ yield column + " <= #{map." + key + "}";
+ }
+ default -> "";
+ };
+ }
+
+ private String mapFilterColumn(String field) {
+ if (StrUtil.isBlank(field)) {
+ return null;
+ }
+ return switch (field) {
+ case "id" -> "t.id";
+ case "stcd" -> "t.stcd";
+ case "stnm" -> "t.stnm";
+ case "sttp" -> "t.sttp";
+ case "sttpCode" -> "t.sttpCode";
+ case "sttpName" -> "t.sttpName";
+ case "sttpFullPath" -> "t.sttpFullPath";
+ case "sttpTreeLevel" -> "t.sttpTreeLevel";
+ case "blprdId" -> "t.blprdId";
+ case "lgtd" -> "t.lgtd";
+ case "lttd" -> "t.lttd";
+ case "dtmel" -> "t.dtmel";
+ case "stlc" -> "t.stlc";
+ case "usfl" -> "t.usfl";
+ case "rstcd" -> "t.rstcd";
+ case "ennm" -> "t.ennm";
+ case "baseId" -> "t.baseId";
+ case "baseName" -> "t.baseName";
+ case "hbrvcd" -> "t.hbrvcd";
+ case "hbrvcdName" -> "t.hbrvcdName";
+ case "rvcd" -> "t.rvcd";
+ case "rvcdName" -> "t.rvcdName";
+ case "addvcd" -> "t.addvcd";
+ case "addvcdName" -> "t.addvcdName";
+ case "country" -> "t.country";
+ case "countryName" -> "t.countryName";
+ case "stCode" -> "t.stCode";
+ case "stName" -> "t.stName";
+ case "introduce" -> "t.introduce";
+ case "precis" -> "t.precis";
+ case "logo" -> "t.logo";
+ case "inffile" -> "t.inffile";
+ case "dtin" -> "t.dtin";
+ case "dtinName" -> "t.dtinName";
+ case "dtinTm" -> "t.dtinTm";
+ case "bldsttCode" -> "t.bldsttCode";
+ case "bldsttCcode" -> "t.bldsttCcode";
+ case "bldsttCcodeName" -> "t.bldsttCcodeName";
+ case "inv" -> "t.inv";
+ case "invinmn" -> "t.invinmn";
+ case "dsun" -> "t.dsun";
+ case "jbtxcs" -> "t.jbtxcs";
+ case "dtfrqcy" -> "t.dtfrqcy";
+ case "remark" -> "t.remark";
+ case "vlsr" -> "t.vlsr";
+ case "vlsrTm" -> "t.vlsrTm";
+ case "orderIndex" -> "t.orderIndex";
+ case "baseStepSort" -> "t.baseStepSort";
+ case "rvcdStepSort" -> "t.rvcdStepSort";
+ case "rstcdStepSort" -> "t.rstcdStepSort";
+ case "siteStepSort" -> "t.siteStepSort";
+ case "stdsdt" -> "t.stdsdt";
+ case "pststdt" -> "t.pststdt";
+ case "pesstdt" -> "t.pesstdt";
+ case "ststdt" -> "t.ststdt";
+ case "jcdt" -> "t.jcdt";
+ case "stwddt" -> "t.stwddt";
+ default -> null;
+ };
+ }
+
+ private String buildOrderBySql(List sortList) {
+ if (CollUtil.isEmpty(sortList)) {
+ return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stnm ASC";
+ }
+ List orderItems = new ArrayList<>();
+ for (DataSourceRequest.SortDescriptor sort : sortList) {
+ if (sort == null || StrUtil.isBlank(sort.getField())) {
+ continue;
+ }
+ String column = mapFilterColumn(sort.getField());
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
+ orderItems.add(column + " " + dir + " NULLS LAST");
+ }
+ if (orderItems.isEmpty()) {
+ return " ORDER BY t.baseStepSort ASC, t.rvcdStepSort ASC, t.rstcdStepSort ASC, t.siteStepSort ASC, t.stnm ASC";
+ }
+ return " ORDER BY " + String.join(", ", orderItems);
+ }
+
+ private Integer resolveOpedStateYear() {
+ return Year.now().getValue();
+ }
+
+ private String buildOpedDetailSql(List selectFields, String filterSql) {
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append(buildOpedSelectSql(selectFields))
+ .append(" FROM (")
+ .append(buildOpedBaseSql())
+ .append(") t WHERE 1 = 1 ");
+ if (StrUtil.isNotBlank(filterSql)) {
+ sql.append(" AND ").append(filterSql);
+ }
+ return sql.toString();
+ }
+
+ private String buildOpedBaseSql() {
+ return "SELECT " +
+ "src.sttpCode AS repCode, " +
+ "src.sttpName AS sttpName, " +
+ "src.baseId AS baseId, " +
+ "src.stcd AS stcd, " +
+ "src.stnm AS stnm, " +
+ "src.sttpCode AS sttpCode, " +
+ "src.baseName AS baseName, " +
+ "src.rstcd AS rstcd, " +
+ "src.ennm AS ennm, " +
+ "CAST(NULL AS VARCHAR2(255)) AS addvcdName, " +
+ "CAST(NULL AS VARCHAR2(255)) AS rvcdName, " +
+ "src.bldsttCcode AS bldsttCcode, " +
+ "src.bldsttCcodeName AS bldsttCcodeName, " +
+ "src.dtinTm AS dtinTm, " +
+ "src.dtin AS dtin, " +
+ "src.dtinName AS dtinName, " +
+ "state.RUN_STATE AS runState, " +
+ "CASE WHEN state.RUN_STATE = 1 THEN '运行中' " +
+ "WHEN state.RUN_STATE IN (0, 2) THEN '未运行' ELSE NULL END AS runStateName, " +
+ "state.STD_STATE AS stdState, " +
+ "CASE WHEN state.STD_STATE = 1 THEN '达标' " +
+ "WHEN state.STD_STATE = 2 THEN '无数据' " +
+ "WHEN state.STD_STATE IN (0, 3) THEN '未达标' ELSE NULL END AS stdStateName, " +
+ "state.STD_SSTATE AS stdSstate, " +
+ "CASE WHEN state.STD_SSTATE = 1 THEN '正常运行' " +
+ "WHEN state.STD_SSTATE IN (0, 2) THEN '暂无数据' " +
+ "WHEN state.STD_SSTATE = 3 THEN '未正常运行' ELSE NULL END AS stdSstateName, " +
+ "state.STD_SSTATE AS runSstate, " +
+ "CASE WHEN state.STD_SSTATE = 1 THEN '正常运行' " +
+ "WHEN state.STD_SSTATE IN (0, 2) THEN '暂无数据' " +
+ "WHEN state.STD_SSTATE = 3 THEN '未正常运行' ELSE NULL END AS runSstateName, " +
+ "CAST(NULL AS NUMBER(10)) AS mway, " +
+ "CAST(NULL AS VARCHAR2(32)) AS mwayName, " +
+ "src.hbrvcd AS hbrvcd, " +
+ "src.hbrvcdName AS hbrvcdName, " +
+ "src.baseStepSort AS baseStepSort, " +
+// "src.baseStepSort AS baseStepsort, " +
+ "src.rvcdStepSort AS rvcdStepSort, " +
+ "src.rstcdStepSort AS rstcdStepSort, " +
+// "src.rstcdStepSort AS rstcdStepsort, " +
+ "src.siteStepSort AS siteStepSort " +
+// "#{map.stateYear} AS yr " +
+ "FROM (" + buildOpedUnionSql() + ") src " +
+ "LEFT JOIN MS_STSTATE_T state ON state.STCD = src.stcd " +
+ "AND NVL(state.IS_DELETED, 0) = 0 " +
+ "AND state.YR = #{map.stateYear}";
+ }
+
+ private String buildOpedUnionSql() {
+ return buildOpedBranchSql(
+ "fb.STCD", "fb.STNM", "'FB'", "child.STTP_NAME", "NVL(fb.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "fb.RSTCD", "eng.ENNM", "NVL(fb.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(fb.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("fb.BLDSTT_CODE"), "fb.DTIN_TM", "fb.DTIN",
+ "CASE WHEN NVL(fb.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fb.ORDER_INDEX, 999999)",
+ "SD_FBRD_B_H fb",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = fb.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fb.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(fb.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "1 = 1"
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "vp.STCD", "vp.STNM", "'VP'", "child.STTP_NAME", "NVL(vp.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "vp.RSTCD", "eng.ENNM", "NVL(vp.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(vp.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("vp.BLDSTT_CODE"), "vp.DTIN_TM", "vp.DTIN",
+ "CASE WHEN NVL(vp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(vp.ORDER_INDEX, 999999)",
+ "SD_VP_B_H vp",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = vp.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = vp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(vp.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(vp.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(vp.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "NVL(vp.IS_DELETED, 0) = 0"
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "va.STCD", "va.STNM", "'VA'", "child.STTP_NAME", "NVL(va.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "va.RSTCD", "eng.ENNM", "NVL(va.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(va.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("va.BLDSTT_CODE"), "va.DTIN_TM", "va.DTIN",
+ "CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(va.ORDER_INDEX, 999999)",
+ "SD_VA_B_H va",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = va.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = va.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(va.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(va.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(va.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "NVL(va.IS_DELETED, 0) = 0"
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "fh.STCD", "fh.STNM", "'FH'", "child.STTP_NAME", "NVL(fh.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "fh.RSTCD", "eng.ENNM", "NVL(fh.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(NULL AS VARCHAR2(10))", "CAST(NULL AS VARCHAR2(32))", "fh.DTIN_TM", "fh.DTIN",
+ "CASE WHEN NVL(fh.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fh.ORDER_INDEX, 999999)",
+ "SD_FHBT_B_H fh",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = 'FH' AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fh.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(fh.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(fh.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "NVL(fh.IS_DELETED, 0) = 0"
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "dw.STCD", "dw.STNM", "'DW'", "child.STTP_NAME", "NVL(dw.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "dw.RSTCD", "eng.ENNM", "NVL(dw.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(dw.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("dw.BLDSTT_CODE"), "dw.DTIN_TM", "dw.DTIN",
+ "CASE WHEN NVL(dw.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(dw.ORDER_INDEX, 999999)",
+ "SD_DW_B_H dw",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = dw.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = dw.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(dw.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(dw.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "NVL(dw.IS_DELETED, 0) = 0"
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "fp.STCD", "fp.STNM", "'FP'", "child.STTP_NAME", "eng.BASE_ID",
+ "hb.BASENAME", "fp.RSTCD", "eng.ENNM", "eng.HBRVCD", "hbrv.HBRVNM",
+ "CAST(fp.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("fp.BLDSTT_CODE"), "fp.DTIN_TM", "fp.DTIN",
+ "CASE WHEN NVL(fp.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(fp.ORDER_INDEX, 999999)",
+ "SD_FPSS_B_H fp",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = fp.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "1 = 1 AND fp.STTP LIKE 'FP\\_%' ESCAPE '\\' "
+ ) + " UNION ALL " +
+ buildOpedBranchSql(
+ "eq.STCD", "eq.STNM", "'EQ'", "child.STTP_NAME", "NVL(eq.BASE_ID, eng.BASE_ID)",
+ "hb.BASENAME", "eq.RSTCD", "eng.ENNM", "NVL(eq.HBRVCD, eng.HBRVCD)", "hbrv.HBRVNM",
+ "CAST(eq.BLDSTT_CODE AS VARCHAR2(10))", buildBldsttNameExpr("eq.BLDSTT_CODE"), "eq.DTIN_TM", "eq.DTIN",
+ "CASE WHEN NVL(eq.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END",
+ "NVL(hb.ORDER_INDEX, 999999)", "NVL(hbrv.ORDER_INDEX, 999999)", "NVL(eng.ORDER_INDEX, 999999)", "NVL(eq.ORDER_INDEX, 999999)",
+ "SD_EQ_B_H eq",
+ "LEFT JOIN SD_STTP_B child ON child.STTP_CODE = eq.STTP AND NVL(child.IS_DELETED, 0) = 0 AND NVL(child.ENABLE, 1) = 1 " +
+ "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = eq.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = NVL(eq.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 " +
+ "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = NVL(eq.HBRVCD, eng.HBRVCD) AND hbrv.BASEID = NVL(eq.BASE_ID, eng.BASE_ID) " +
+ "AND NVL(hbrv.IS_DELETED, 0) = 0 AND NVL(hbrv.ENABLED, 1) = 1",
+ "NVL(eq.IS_DELETED, 0) = 0"
+ );
+ }
+
+ private String buildOpedBranchSql(String stcdExpr,
+ String stnmExpr,
+ String sttpCodeExpr,
+ String sttpNameExpr,
+ String baseIdExpr,
+ String baseNameExpr,
+ String rstcdExpr,
+ String ennmExpr,
+ String hbrvcdExpr,
+ String hbrvcdNameExpr,
+ String bldsttExpr,
+ String bldsttNameExpr,
+ String dtinTmExpr,
+ String dtinExpr,
+ String dtinNameExpr,
+ String baseStepSortExpr,
+ String rvcdStepSortExpr,
+ String rstcdStepSortExpr,
+ String siteStepSortExpr,
+ String fromSql,
+ String joinSql,
+ String whereSql) {
+ return "SELECT " +
+ sttpNameExpr + " AS sttpName, " +
+ baseIdExpr + " AS baseId, " +
+ stcdExpr + " AS stcd, " +
+ stnmExpr + " AS stnm, " +
+ sttpCodeExpr + " AS sttpCode, " +
+ baseNameExpr + " AS baseName, " +
+ rstcdExpr + " AS rstcd, " +
+ ennmExpr + " AS ennm, " +
+ bldsttExpr + " AS bldsttCcode, " +
+ bldsttNameExpr + " AS bldsttCcodeName, " +
+ dtinTmExpr + " AS dtinTm, " +
+ dtinExpr + " AS dtin, " +
+ dtinNameExpr + " AS dtinName, " +
+ hbrvcdExpr + " AS hbrvcd, " +
+ hbrvcdNameExpr + " AS hbrvcdName, " +
+ baseStepSortExpr + " AS baseStepSort, " +
+ rvcdStepSortExpr + " AS rvcdStepSort, " +
+ rstcdStepSortExpr + " AS rstcdStepSort, " +
+ siteStepSortExpr + " AS siteStepSort " +
+ "FROM " + fromSql + " " + joinSql + " WHERE " + whereSql;
+ }
+
+ private String buildBldsttNameExpr(String column) {
+ return "CASE " + column + " WHEN 0 THEN '未建/规划' WHEN 1 THEN '在建' WHEN 2 THEN '已建' ELSE NULL END";
+ }
+
+ private List resolveOpedSelectFields(List select) {
+ List fields = CollUtil.isEmpty(select)
+ ? new ArrayList<>(buildOpedSelectMap().keySet())
+ : new ArrayList<>(select);
+ LinkedHashSet uniqueFields = new LinkedHashSet<>();
+ for (String field : fields) {
+ if (StrUtil.isNotBlank(field)) {
+ uniqueFields.add(field.trim());
+ }
+ }
+ if (uniqueFields.isEmpty()) {
+ uniqueFields.add("stcd");
+ }
+ return new ArrayList<>(uniqueFields);
+ }
+
+ private String buildOpedSelectSql(List selectFields) {
+ Map columnMap = buildOpedSelectMap();
+ List selectParts = new ArrayList<>();
+ for (String field : resolveOpedSelectFields(selectFields)) {
+ String column = columnMap.get(field);
+ if (StrUtil.isNotBlank(column)) {
+ selectParts.add(column);
+ } else {
+ selectParts.add("NULL AS \"" + field + "\"");
+ }
+ }
+ return String.join(", ", selectParts);
+ }
+
+ private Map buildOpedSelectMap() {
+ Map columnMap = new LinkedHashMap<>();
+ columnMap.put("repCode", "t.repCode AS \"repCode\"");
+ columnMap.put("sttpName", "t.sttpName AS \"sttpName\"");
+ columnMap.put("baseId", "t.baseId AS \"baseId\"");
+ columnMap.put("stcd", "t.stcd AS \"stcd\"");
+ columnMap.put("stnm", "t.stnm AS \"stnm\"");
+ columnMap.put("sttpCode", "t.sttpCode AS \"sttpCode\"");
+ columnMap.put("baseName", "t.baseName AS \"baseName\"");
+ columnMap.put("rstcd", "t.rstcd AS \"rstcd\"");
+ columnMap.put("ennm", "t.ennm AS \"ennm\"");
+ columnMap.put("addvcdName", "t.addvcdName AS \"addvcdName\"");
+ columnMap.put("rvcdName", "t.rvcdName AS \"rvcdName\"");
+ columnMap.put("bldsttCcode", "t.bldsttCcode AS \"bldsttCcode\"");
+ columnMap.put("bldsttCcodeName", "t.bldsttCcodeName AS \"bldsttCcodeName\"");
+ columnMap.put("dtinTm", "t.dtinTm AS \"dtinTm\"");
+ columnMap.put("dtin", "t.dtin AS \"dtin\"");
+ columnMap.put("dtinName", "t.dtinName AS \"dtinName\"");
+ columnMap.put("runState", "t.runState AS \"runState\"");
+ columnMap.put("runStateName", "t.runStateName AS \"runStateName\"");
+ columnMap.put("stdState", "t.stdState AS \"stdState\"");
+ columnMap.put("stdStateName", "t.stdStateName AS \"stdStateName\"");
+ columnMap.put("stdSstate", "t.stdSstate AS \"stdSstate\"");
+ columnMap.put("stdSstateName", "t.stdSstateName AS \"stdSstateName\"");
+ columnMap.put("runSstate", "t.runSstate AS \"runSstate\"");
+ columnMap.put("runSstateName", "t.runSstateName AS \"runSstateName\"");
+ columnMap.put("mway", "t.mway AS \"mway\"");
+ columnMap.put("mwayName", "t.mwayName AS \"mwayName\"");
+ columnMap.put("hbrvcd", "t.hbrvcd AS \"hbrvcd\"");
+ columnMap.put("hbrvcdName", "t.hbrvcdName AS \"hbrvcdName\"");
+ columnMap.put("baseStepSort", "t.baseStepSort AS \"baseStepSort\"");
+// columnMap.put("baseStepsort", "t.baseStepsort AS \"baseStepsort\"");
+ columnMap.put("rvcdStepSort", "t.rvcdStepSort AS \"rvcdStepSort\"");
+ columnMap.put("rstcdStepSort", "t.rstcdStepSort AS \"rstcdStepSort\"");
+// columnMap.put("rstcdStepsort", "t.rstcdStepsort AS \"rstcdStepsort\"");
+ columnMap.put("siteStepSort", "t.siteStepSort AS \"siteStepSort\"");
+// columnMap.put("yr", "t.yr AS \"yr\"");
+ return columnMap;
+ }
+
+ private String buildOpedFilterCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ if (filter == null) {
+ return "";
+ }
+ if (StrUtil.isNotBlank(filter.getField())) {
+ return buildOpedLeafCondition(filter, paramMap, indexHolder);
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return "";
+ }
+ List conditions = new ArrayList<>();
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ String childSql = buildOpedFilterCondition(child, paramMap, indexHolder);
+ if (StrUtil.isNotBlank(childSql)) {
+ conditions.add("(" + childSql + ")");
+ }
+ }
+ if (conditions.isEmpty()) {
+ return "";
+ }
+ String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
+ return String.join(logic, conditions);
+ }
+
+ private String buildOpedEffectiveFilterCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ if (filter == null) {
+ return "";
+ }
+ if (StrUtil.isNotBlank(filter.getField())) {
+ if ("1".equals(StrUtil.trim(filter.getField()))) {
+ return "";
+ }
+ return buildOpedLeafCondition(filter, paramMap, indexHolder);
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return "";
+ }
+ List conditions = new ArrayList<>();
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ String childSql = buildOpedEffectiveFilterCondition(child, paramMap, indexHolder);
+ if (StrUtil.isNotBlank(childSql)) {
+ conditions.add("(" + childSql + ")");
+ }
+ }
+ if (conditions.isEmpty()) {
+ return "";
+ }
+ String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
+ return String.join(logic, conditions);
+ }
+
+ private String buildOpedLeafCondition(DataSourceRequest.FilterDescriptor filter,
+ Map paramMap,
+ int[] indexHolder) {
+ String field = filter.getField();
+ if (StrUtil.isBlank(field) || "yr".equals(field)) {
+ return "";
+ }
+ String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
+ String column = mapOpedColumn(field);
+ if (StrUtil.isBlank(column)) {
+ return "";
+ }
+ if ("isnull".equals(operator)) {
+ return column + " IS NULL";
+ }
+ if ("isnotnull".equals(operator)) {
+ return column + " IS NOT NULL";
+ }
+ if ("isempty".equals(operator)) {
+ return "(" + column + " IS NULL OR " + column + " = '')";
+ }
+ if ("isnotempty".equals(operator)) {
+ return "(" + column + " IS NOT NULL AND " + column + " <> '')";
+ }
+ if ("in".equals(operator) || "ni".equals(operator)) {
+ List values = normalizeValues(filter.getValue());
+ if (values.isEmpty()) {
+ return "";
+ }
+ List placeholders = new ArrayList<>();
+ for (Object item : values) {
+ String key = "opedP" + indexHolder[0]++;
+ paramMap.put(key, item);
+ placeholders.add("#{map." + key + "}");
+ }
+ return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")";
+ }
+
+ Object value = filter.getValue();
+ if (value == null) {
+ return "";
+ }
+ String key = "opedP" + indexHolder[0]++;
+ boolean dateField = isOpedDateField(field);
+ String placeholder = dateField
+ ? "TO_DATE(#{map." + key + "}, 'YYYY-MM-DD HH24:MI:SS')"
+ : "#{map." + key + "}";
+ paramMap.put(key, value);
+ return switch (operator) {
+ case "eq" -> column + " = " + placeholder;
+ case "neq" -> column + " <> " + placeholder;
+ case "contains" -> {
+ paramMap.put(key, "%" + value + "%");
+ yield dateField
+ ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}"
+ : column + " LIKE #{map." + key + "}";
+ }
+ case "doesnotcontain" -> {
+ paramMap.put(key, "%" + value + "%");
+ yield dateField
+ ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') NOT LIKE #{map." + key + "}"
+ : column + " NOT LIKE #{map." + key + "}";
+ }
+ case "startswith" -> {
+ paramMap.put(key, value + "%");
+ yield dateField
+ ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}"
+ : column + " LIKE #{map." + key + "}";
+ }
+ case "endswith" -> {
+ paramMap.put(key, "%" + value);
+ yield dateField
+ ? "TO_CHAR(" + column + ", 'YYYY-MM-DD HH24:MI:SS') LIKE #{map." + key + "}"
+ : column + " LIKE #{map." + key + "}";
+ }
+ case "gt" -> column + " > " + placeholder;
+ case "gte" -> column + " >= " + placeholder;
+ case "lt" -> column + " < " + placeholder;
+ case "lte" -> column + " <= " + placeholder;
+ default -> "";
+ };
+ }
+
+ private boolean isOpedDateField(String field) {
+ return "dtinTm".equals(field);
+ }
+
+ private String mapOpedColumn(String field) {
+ if (StrUtil.isBlank(field)) {
+ return null;
+ }
+ return switch (field) {
+ case "sttpName" -> "t.sttpName";
+ case "baseId" -> "t.baseId";
+ case "stcd" -> "t.stcd";
+ case "stnm" -> "t.stnm";
+ case "sttpCode" -> "t.sttpCode";
+ case "baseName" -> "t.baseName";
+ case "rstcd" -> "t.rstcd";
+ case "ennm" -> "t.ennm";
+ case "bldsttCcode" -> "t.bldsttCcode";
+ case "bldsttCcodeName" -> "t.bldsttCcodeName";
+ case "dtinTm" -> "t.dtinTm";
+ case "dtin" -> "t.dtin";
+ case "dtinName" -> "t.dtinName";
+ case "runState" -> "t.runState";
+ case "runStateName" -> "t.runStateName";
+ case "stdState" -> "t.stdState";
+ case "stdStateName" -> "t.stdStateName";
+ case "stdSstate" -> "t.stdSstate";
+ case "stdSstateName" -> "t.stdSstateName";
+ case "mway" -> "t.mway";
+ case "mwayName" -> "t.mwayName";
+ case "hbrvcd" -> "t.hbrvcd";
+ case "hbrvcdName" -> "t.hbrvcdName";
+ case "baseStepSort", "baseStepsort" -> "t.baseStepSort";
+ case "rvcdStepSort" -> "t.rvcdStepSort";
+ case "rstcdStepSort", "rstcdStepsort" -> "t.rstcdStepSort";
+ case "siteStepSort" -> "t.siteStepSort";
+ case "yr" -> "t.yr";
+ default -> null;
+ };
+ }
+
+ private String buildOpedOrderBySql(List sortList) {
+ if (CollUtil.isEmpty(sortList)) {
+ return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " +
+ "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stnm ASC";
+ }
+ List orderItems = new ArrayList<>();
+ for (DataSourceRequest.SortDescriptor sort : sortList) {
+ if (sort == null || StrUtil.isBlank(sort.getField())) {
+ continue;
+ }
+ String column = mapOpedColumn(sort.getField());
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
+ orderItems.add(column + " " + dir + " NULLS LAST");
+ }
+ if (orderItems.isEmpty()) {
+ return " ORDER BY t.baseStepSort ASC NULLS LAST, t.rvcdStepSort ASC NULLS LAST, " +
+ "t.rstcdStepSort ASC NULLS LAST, t.siteStepSort ASC NULLS LAST, t.stnm ASC";
+ }
+ return " ORDER BY " + String.join(", ", orderItems);
+ }
+
+ private String buildOpedGroupSql(String detailSql, GroupingInfo[] groupInfos) {
+ if (groupInfos == null || groupInfos.length == 0) {
+ return detailSql;
+ }
+ List groupFields = new ArrayList<>();
+ List selectItems = new ArrayList<>();
+ List orderItems = new ArrayList<>();
+ for (GroupingInfo item : groupInfos) {
+ if (item == null || StrUtil.isBlank(item.getSelector())) {
+ continue;
+ }
+ String selector = item.getSelector();
+ String column = mapOpedColumn(selector);
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ groupFields.add(column);
+ selectItems.add(column + " AS " + selector);
+ selectItems.add("COUNT(*) AS count_" + selector);
+ orderItems.add(column + (item.getDesc() ? " DESC" : " ASC"));
+ }
+ if (groupFields.isEmpty()) {
+ return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0";
+ }
+ return "SELECT " + String.join(", ", selectItems) +
+ " FROM (" + detailSql + ") t GROUP BY " + String.join(", ", groupFields) +
+ " ORDER BY " + String.join(", ", orderItems);
+ }
+
+ private boolean shouldQueryOpedSummary(DataSourceRequest dataSourceRequest) {
+ return dataSourceRequest != null
+ && CollUtil.isEmpty(dataSourceRequest.getGroup())
+ && hasOnlyDummyFilter(dataSourceRequest.getFilter());
+ }
+
+ private boolean hasOnlyDummyFilter(DataSourceRequest.FilterDescriptor filter) {
+ return hasDummyField(filter) && !hasRealField(filter);
+ }
+
+ private boolean hasDummyField(DataSourceRequest.FilterDescriptor filter) {
+ if (filter == null) {
+ return false;
+ }
+ if ("1".equals(StrUtil.trim(filter.getField()))) {
+ return true;
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return false;
+ }
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ if (hasDummyField(child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean hasRealField(DataSourceRequest.FilterDescriptor filter) {
+ if (filter == null) {
+ return false;
+ }
+ String field = StrUtil.trim(filter.getField());
+ if (StrUtil.isNotBlank(field) && !"1".equals(field)) {
+ return true;
+ }
+ if (CollUtil.isEmpty(filter.getFilters())) {
+ return false;
+ }
+ for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
+ if (hasRealField(child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private String buildOpedCategorySql() {
+ return "SELECT 'VA' AS repCode, '动物救助站' AS sttpName, 1 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'FP' AS repCode, '过鱼设施' AS sttpName, 2 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'FB' AS repCode, '鱼类增殖站' AS sttpName, 3 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'DW' AS repCode, '低温水减缓设施' AS sttpName, 4 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'VP' AS repCode, '珍稀植物园' AS sttpName, 5 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'FH' AS repCode, '鱼类栖息地' AS sttpName, 6 AS orderIndex FROM dual " +
+ "UNION ALL SELECT 'EQ' AS repCode, '生态流量泄放设施' AS sttpName, 7 AS orderIndex FROM dual";
+ }
+
+ private String buildOpedSummarySelectSql(List selectFields) {
+ Map columnMap = buildOpedSummarySelectMap();
+ List fields = CollUtil.isEmpty(selectFields)
+ ? new ArrayList<>(columnMap.keySet())
+ : new ArrayList<>(selectFields);
+ List selectItems = new ArrayList<>();
+ for (String field : fields) {
+ if (StrUtil.isBlank(field)) {
+ continue;
+ }
+ String column = columnMap.get(field.trim());
+ if (StrUtil.isNotBlank(column)) {
+ selectItems.add(column);
+ }
+ }
+ if (selectItems.isEmpty()) {
+ selectItems.addAll(columnMap.values());
+ }
+ return String.join(", ", selectItems);
+ }
+
+ private Map buildOpedSummarySelectMap() {
+ Map columnMap = new LinkedHashMap<>();
+ columnMap.put("id", "CAST(NULL AS VARCHAR2(64)) AS \"id\"");
+ columnMap.put("recordUser", "CAST(NULL AS VARCHAR2(64)) AS \"recordUser\"");
+ columnMap.put("recordTime", "CAST(NULL AS DATE) AS \"recordTime\"");
+ columnMap.put("modifyTime", "CAST(NULL AS DATE) AS \"modifyTime\"");
+ columnMap.put("displayRecordUser", "CAST(NULL AS VARCHAR2(128)) AS \"displayRecordUser\"");
+ columnMap.put("repCode", "cat.repCode AS \"repCode\"");
+ columnMap.put("sttpCode", "CAST(NULL AS VARCHAR2(64)) AS \"sttpCode\"");
+ columnMap.put("pcode", "CAST(NULL AS VARCHAR2(64)) AS \"pcode\"");
+ columnMap.put("pname", "CAST(NULL AS VARCHAR2(128)) AS \"pname\"");
+ columnMap.put("psttpName", "CAST(NULL AS VARCHAR2(128)) AS \"psttpName\"");
+ columnMap.put("stcd", "CAST(NULL AS VARCHAR2(64)) AS \"stcd\"");
+ columnMap.put("ennm", "CAST(NULL AS VARCHAR2(255)) AS \"ennm\"");
+ columnMap.put("stnm", "CAST(NULL AS VARCHAR2(255)) AS \"stnm\"");
+ columnMap.put("addvcdName", "CAST(NULL AS VARCHAR2(255)) AS \"addvcdName\"");
+ columnMap.put("rvcdName", "CAST(NULL AS VARCHAR2(255)) AS \"rvcdName\"");
+ columnMap.put("sttpName", "cat.sttpName AS \"sttpName\"");
+ columnMap.put("baseId", "CAST(NULL AS VARCHAR2(64)) AS \"baseId\"");
+ columnMap.put("dtin", "CAST(NULL AS NUMBER(10)) AS \"dtin\"");
+ columnMap.put("dtinName", "CAST(NULL AS VARCHAR2(32)) AS \"dtinName\"");
+ columnMap.put("runState", "CAST(NULL AS NUMBER(10)) AS \"runState\"");
+ columnMap.put("runStateName", "CAST(NULL AS VARCHAR2(32)) AS \"runStateName\"");
+ columnMap.put("stdState", "CAST(NULL AS NUMBER(10)) AS \"stdState\"");
+ columnMap.put("stdStateName", "CAST(NULL AS VARCHAR2(32)) AS \"stdStateName\"");
+ columnMap.put("bldsttCcode", "CAST(NULL AS VARCHAR2(10)) AS \"bldsttCcode\"");
+ columnMap.put("bldsttCcodeName", "CAST(NULL AS VARCHAR2(32)) AS \"bldsttCcodeName\"");
+ columnMap.put("count", "COUNT(src.repCode) AS \"count\"");
+ columnMap.put("jcdt", "CAST(NULL AS DATE) AS \"jcdt\"");
+ columnMap.put("runSstate", "CAST(NULL AS NUMBER(10)) AS \"runSstate\"");
+ columnMap.put("runSstateName", "CAST(NULL AS VARCHAR2(32)) AS \"runSstateName\"");
+ columnMap.put("departmentId", "CAST(NULL AS VARCHAR2(64)) AS \"departmentId\"");
+ columnMap.put("displayDepartment", "CAST(NULL AS VARCHAR2(255)) AS \"displayDepartment\"");
+ return columnMap;
+ }
+
+ private String buildOpedSummaryOrderBySql(List sortList) {
+ if (CollUtil.isEmpty(sortList)) {
+ return " ORDER BY cat.orderIndex ASC, cat.repCode ASC";
+ }
+ List orderItems = new ArrayList<>();
+ for (DataSourceRequest.SortDescriptor sort : sortList) {
+ if (sort == null || StrUtil.isBlank(sort.getField())) {
+ continue;
+ }
+ String column = switch (sort.getField()) {
+ case "repCode" -> "cat.repCode";
+ case "sttpName" -> "cat.sttpName";
+ case "count" -> "COUNT(src.repCode)";
+ default -> null;
+ };
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ String dir = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
+ orderItems.add(column + " " + dir);
+ }
+ if (orderItems.isEmpty()) {
+ return " ORDER BY cat.orderIndex ASC, cat.repCode ASC";
+ }
+ return " ORDER BY " + String.join(", ", orderItems);
+ }
+
+ private List normalizeValues(Object value) {
+ List values = new ArrayList<>();
+ collectValues(value, values);
+ return values;
+ }
+
+ private void collectValues(Object value, List values) {
+ if (value == null) {
+ return;
+ }
+ if (value instanceof List> list) {
+ for (Object item : list) {
+ collectValues(item, values);
+ }
+ return;
+ }
+ if (value instanceof Object[] array) {
+ for (Object item : array) {
+ collectValues(item, values);
+ }
+ return;
+ }
+ values.add(value);
+ }
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java
index ffa9a01e..ef34b630 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/controller/VapConstructionController.java
@@ -64,4 +64,16 @@ public class VapConstructionController {
public ResponseResult getVarKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vpConstructionService.processVarKendoList(dataSourceRequest));
}
+
+ @PostMapping("/var/year/GetKendoListCust")
+ @Operation(summary = "动物救助站数据年份列表")
+ public ResponseResult getVarYearKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(vpConstructionService.getVarYearList(dataSourceRequest));
+ }
+
+ @PostMapping("/vpr/year/GetKendoListCust")
+ @Operation(summary = "珍稀植物园数据年份列表")
+ public ResponseResult getVprYearKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(vpConstructionService.getVprYearList(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java
index 28de636f..0a362f81 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/VpConstructionService.java
@@ -23,4 +23,8 @@ public interface VpConstructionService {
DataSourceResult processVacKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult processVarKendoList(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getVarYearList(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java
index fe46774a..e0bc4ccf 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/service/impl/VpConstructionServiceImpl.java
@@ -1814,4 +1814,98 @@ public class VpConstructionServiceImpl implements VpConstructionService {
}
return " ORDER BY " + String.join(", ", orderItems);
}
+
+ @Override
+ public DataSourceResult getVarYearList(DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+ DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest();
+ String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "baseId");
+ String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "stcd");
+ String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "rstcd");
+
+ StringBuilder sql = new StringBuilder("SELECT TO_CHAR(r.TM, 'YYYY') year FROM SD_VA_R r " +
+ "LEFT JOIN SD_VABASIC_B svb ON r.TETP = svb.ID " +
+ "LEFT JOIN SD_VA_B_H a ON a.STCD = r.STCD WHERE NVL(r.IS_DELETED, 0) = 0 ");
+
+ if (StrUtil.isNotBlank(baseId)) {
+ sql.append(" AND a.BASE_ID = #{map.baseId} ");
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ sql.append(" AND a.STCD = #{map.stcd} ");
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ sql.append(" AND a.RSTCD = #{map.rstcd} ");
+ }
+ sql.append(" GROUP BY TO_CHAR(r.TM, 'YYYY') ORDER BY TO_CHAR(r.TM, 'YYYY') DESC ");
+
+ Map paramMap = new HashMap<>();
+ if (StrUtil.isNotBlank(baseId)) {
+ paramMap.put("baseId", baseId);
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ paramMap.put("stcd", stcd);
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ paramMap.put("rstcd", rstcd);
+ }
+
+ Page> page = KendoUtil.getPage(dataSourceRequest);
+ List> list = microservicDynamicSQLMapper.pageAllList(page, sql.toString(), paramMap);
+ List yList = new ArrayList<>();
+ for (Map it : list) {
+ if (it.get("YEAR") != null && StrUtil.isNotBlank(it.get("YEAR").toString())) {
+ yList.add(it.get("YEAR").toString());
+ }
+ }
+ dataSourceResult.setData(yList);
+ dataSourceResult.setTotal(page != null ? page.getTotal() : (long) yList.size());
+ return dataSourceResult;
+ }
+
+ @Override
+ public DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+ DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest();
+ String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "baseId");
+ String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "stcd");
+ String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "rstcd");
+
+ StringBuilder sql = new StringBuilder("SELECT TO_CHAR(r.TM, 'YYYY') year FROM SD_VP_R r " +
+ "LEFT JOIN SD_VPBASIC_B svb ON r.PLANT_ID = svb.ID " +
+ "LEFT JOIN SD_VP_B_H a ON a.STCD = r.STCD WHERE NVL(r.IS_DELETED, 0) = 0 ");
+
+ if (StrUtil.isNotBlank(baseId)) {
+ sql.append(" AND a.BASE_ID = #{map.baseId} ");
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ sql.append(" AND a.STCD = #{map.stcd} ");
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ sql.append(" AND a.RSTCD = #{map.rstcd} ");
+ }
+ sql.append(" GROUP BY TO_CHAR(r.TM, 'YYYY') ORDER BY TO_CHAR(r.TM, 'YYYY') DESC ");
+
+ Map paramMap = new HashMap<>();
+ if (StrUtil.isNotBlank(baseId)) {
+ paramMap.put("baseId", baseId);
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ paramMap.put("stcd", stcd);
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ paramMap.put("rstcd", rstcd);
+ }
+
+ Page> page = KendoUtil.getPage(dataSourceRequest);
+ List> list = microservicDynamicSQLMapper.pageAllList(page, sql.toString(), paramMap);
+ List yList = new ArrayList<>();
+ for (Map it : list) {
+ if (it.get("YEAR") != null && StrUtil.isNotBlank(it.get("YEAR").toString())) {
+ yList.add(it.get("YEAR").toString());
+ }
+ }
+ dataSourceResult.setData(yList);
+ dataSourceResult.setTotal(page != null ? page.getTotal() : (long) yList.size());
+ return dataSourceResult;
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java
index 00421006..ebb0f33c 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/controller/WarnDataController.java
@@ -74,4 +74,10 @@ public class WarnDataController {
public ResponseResult getWarnStcdKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(warnDataService.getWarnStcdKendoListCust(dataSourceRequest));
}
+
+ @PostMapping("/ai/com/qgc/aiFile/GetKendoListCust")
+ @Operation(summary = "全过程AI识别监测日历表(文件)")
+ public ResponseResult getAiFileKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(warnDataService.getAiFileKendoListCust(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiFileVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiFileVo.java
new file mode 100644
index 00000000..c4d2abce
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/entity/vo/AiFileVo.java
@@ -0,0 +1,43 @@
+package com.yfd.platform.qgc_env.warn.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * AI文件列表VO - 全过程AI识别监测日历表(文件)
+ *
+ * @author Generated
+ * @since 2025-07-01
+ */
+@Data
+public class AiFileVo {
+
+ private String stcd;
+
+ private String stnm;
+
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ private Date tm;
+
+ private String fid;
+
+ private String rstcd;
+
+ private String ennm;
+
+ private String stCode;
+
+ private String stName;
+
+ private Integer baseStepSort;
+
+ private Integer rvcdStepSort;
+
+ private Integer rstcdStepSort;
+
+ private Integer siteStepSort;
+
+ private Integer dataType;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java
index eccdcb72..66f942ff 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/WarnDataService.java
@@ -8,6 +8,7 @@ import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo;
+import com.yfd.platform.qgc_env.warn.entity.vo.AiFileVo;
import com.yfd.platform.qgc_env.warn.entity.vo.EngWarnCountVo;
import com.yfd.platform.qgc_env.warn.entity.vo.StcdWarnStateVo;
@@ -32,4 +33,6 @@ public interface WarnDataService {
DataSourceResult getAlarmPointKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult getWarnStcdKendoListCust(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java
index efd22964..ac9bf4e7 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/warn/service/impl/WarnDataServiceImpl.java
@@ -13,6 +13,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.qgc_env.warn.entity.vo.AlarmPointVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiComListVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiDmRunVo;
+import com.yfd.platform.qgc_env.warn.entity.vo.AiFileVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiProtectVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRecordVo;
import com.yfd.platform.qgc_env.warn.entity.vo.AiRstcdVo;
@@ -157,6 +158,7 @@ public class WarnDataServiceImpl implements WarnDataService {
.append("ai.RSTCD AS rstcd, ")
.append("eng.ENNM AS ennm, ")
.append("ai.BASE_ID AS baseId, ")
+ .append("hb.BASENAME AS baseName, ")
.append("ai.HBRVCD AS hbrvcd, ")
.append("ai.RVCD AS rvcd, ")
.append("rec.TM AS tm, ")
@@ -172,6 +174,7 @@ public class WarnDataServiceImpl implements WarnDataService {
.append("FROM SD_AICOM_R rec ")
.append("LEFT JOIN SD_AIMONITOR_B_H ai ON ai.STCD = rec.STCD AND NVL(ai.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = ai.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = ai.BASE_ID AND hb.IS_DELETED = 0 ")
.append("WHERE NVL(rec.IS_DELETED, 0) = 0 ");
String filterSql = buildAiComFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0});
@@ -356,6 +359,254 @@ public class WarnDataServiceImpl implements WarnDataService {
return result;
}
+ @Override
+ public DataSourceResult getAiFileKendoListCust(DataSourceRequest dataSourceRequest) {
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
+ String baseId = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "baseId");
+ String tm = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "tm");
+ String rstcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "rstcd");
+ String stcd = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "stcd");
+ String type = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "type");
+ String dataType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "dataType");
+
+ Date startTime = null, endTime = null;
+ if (StrUtil.isNotBlank(tm)) {
+ String[] ll = tm.split(",");
+ if (ll.length == 2) {
+ startTime = DateUtil.parse(ll[0]);
+ endTime = DateUtil.parse(ll[1]);
+ if (startTime.after(endTime)) {
+ Date tmp = startTime;
+ startTime = endTime;
+ endTime = tmp;
+ }
+ }
+ }
+
+ if (StrUtil.isNotBlank(rstcd)) {
+ rstcd = rstcd.replace("[", "").replace("]", "").replaceAll("\"", "'");
+ }
+
+ Map paramMap = new HashMap<>();
+
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT * FROM (");
+ sql.append(buildAiFileHeartbeatSql(baseId, type, rstcd, stcd, startTime, endTime, paramMap, "hb"));
+ sql.append(" UNION ");
+ sql.append(buildAiFileComSql(baseId, type, rstcd, stcd, startTime, endTime, paramMap, "ac"));
+ sql.append(") WHERE 1=1 ");
+
+ if (StrUtil.isNotBlank(dataType)) {
+ paramMap.put("dataType", Integer.parseInt(dataType));
+ sql.append("AND DATA_TYPE = #{map.dataType} ");
+ }
+
+ sql.append(buildAiFileOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
+
+ Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List list = microservicDynamicSQLMapper.pageAllListWithResultType(
+ page,
+ sql.toString(),
+ paramMap,
+ AiFileVo.class
+ );
+
+ DataSourceResult result = new DataSourceResult<>();
+ result.setData(list);
+ result.setTotal(page == null ? list.size() : page.getTotal());
+ result.setAggregates(new HashMap<>());
+ return result;
+ }
+
+ private String buildAiFileHeartbeatSql(String baseId, String type, String rstcd, String stcd,
+ Date startTime, Date endTime, Map paramMap, String keyPrefix) {
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append("a.STCD AS STCD, ")
+ .append("b.RSTCD AS RSTCD, ")
+ .append("eng.ENNM AS ENNM, ")
+ .append("b.STCD AS STCODE, ")
+ .append("b.STNM AS STNAME, ")
+ .append("hb.ORDER_INDEX AS BASESTEPSORT, ")
+ .append("along.ORDER_INDEX AS RVCDSTEPSORT, ")
+ .append("rstSort.SORT AS RSTCDSTEPSORT, ")
+ .append("siteSort.SORT AS SITESTEPSORT, ")
+ .append("b.STNM AS STNM, ")
+ .append("a.TM AS TM, ");
+
+ if (StrUtil.isNotBlank(type)) {
+ if ("AI_5001".equals(type) || "AI_50011".equals(type)) {
+ sql.append("3 AS DATA_TYPE, ");
+ } else {
+ sql.append("1 AS DATA_TYPE, ");
+ }
+ } else {
+ sql.append("1 AS DATA_TYPE, ");
+ }
+
+ sql.append("REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) AS FID ");
+ sql.append("FROM SD_AIHEARTBEAT_R a ");
+ sql.append("INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD AND NVL(b.IS_DELETED, 0) = 0 AND b.STTP LIKE 'AI_%' ");
+ sql.append("LEFT JOIN SD_ENGINFO_B_H eng ON b.RSTCD = eng.STCD AND NVL(eng.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN SD_HYDROBASE hb ON b.BASE_ID = hb.BASEID AND NVL(hb.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN MS_ALONG_B along ON b.HBRVCD = along.RVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') rstSort ON rstSort.RVCD = b.HBRVCD AND rstSort.STCD = b.RSTCD ");
+ sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort ON siteSort.RVCD = b.HBRVCD AND siteSort.STCD = b.STCD ");
+ sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 ");
+ sql.append("AND a.FID NOT LIKE '%ORA-%' AND a.FID NOT LIKE '%Out%' ");
+
+ if (StrUtil.isNotBlank(type)) {
+ if ("AI_50011".equals(type)) {
+ sql.append("AND b.STTP = 'AI_5001' ");
+ } else {
+ sql.append("AND b.STTP = '").append(type).append("' ");
+ }
+ }
+ if (StrUtil.isNotBlank(baseId)) {
+ paramMap.put(keyPrefix + "BaseId", baseId);
+ sql.append("AND b.BASE_ID = #{map.").append(keyPrefix).append("BaseId} ");
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ paramMap.put(keyPrefix + "Stcd", stcd);
+ sql.append("AND b.STCD = #{map.").append(keyPrefix).append("Stcd} ");
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ sql.append("AND b.RSTCD IN (").append(rstcd).append(") ");
+ }
+ if (startTime != null) {
+ paramMap.put(keyPrefix + "StartTime", startTime);
+ sql.append("AND a.TM >= #{map.").append(keyPrefix).append("StartTime} ");
+ }
+ if (endTime != null) {
+ paramMap.put(keyPrefix + "EndTime", endTime);
+ sql.append("AND a.TM <= #{map.").append(keyPrefix).append("EndTime} ");
+ }
+
+ sql.append("CONNECT BY REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) IS NOT NULL ");
+ sql.append("AND PRIOR a.ID = a.ID ");
+ sql.append("AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL");
+
+ return sql.toString();
+ }
+
+ private String buildAiFileComSql(String baseId, String type, String rstcd, String stcd,
+ Date startTime, Date endTime, Map paramMap, String keyPrefix) {
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append("a.STCD AS STCD, ")
+ .append("b.RSTCD AS RSTCD, ")
+ .append("eng.ENNM AS ENNM, ")
+ .append("b.STCD AS STCODE, ")
+ .append("b.STNM AS STNAME, ")
+ .append("hb.ORDER_INDEX AS BASESTEPSORT, ")
+ .append("along.ORDER_INDEX AS RVCDSTEPSORT, ")
+ .append("rstSort.SORT AS RSTCDSTEPSORT, ")
+ .append("siteSort.SORT AS SITESTEPSORT, ")
+ .append("b.STNM AS STNM, ")
+ .append("a.TM AS TM, ");
+
+ if (StrUtil.isNotBlank(type)) {
+ if ("AI_5001".equals(type) || "AI_50011".equals(type)) {
+ sql.append("(CASE WHEN a.TYPE = 'AI_5001' AND (a.IS_BIG_DEBRIS_AREA IS NULL OR a.IS_BIG_DEBRIS_AREA = 0) THEN 4 WHEN a.TYPE = 'AI_5001' AND a.IS_BIG_DEBRIS_AREA > 0 THEN 5 END) AS DATA_TYPE, ");
+ } else {
+ sql.append("2 AS DATA_TYPE, ");
+ }
+ } else {
+ sql.append("2 AS DATA_TYPE, ");
+ }
+
+ sql.append("REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) AS FID ");
+ sql.append("FROM SD_AICOM_R a ");
+ sql.append("INNER JOIN SD_AIMONITOR_B_H b ON a.STCD = b.STCD AND NVL(b.IS_DELETED, 0) = 0 AND b.STTP LIKE 'AI_%' ");
+ sql.append("LEFT JOIN SD_ENGINFO_B_H eng ON b.RSTCD = eng.STCD AND NVL(eng.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN SD_HYDROBASE hb ON b.BASE_ID = hb.BASEID AND NVL(hb.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN MS_ALONG_B along ON b.HBRVCD = along.RVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ");
+ sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') rstSort ON rstSort.RVCD = b.HBRVCD AND rstSort.STCD = b.RSTCD ");
+ sql.append("LEFT JOIN (SELECT det.SORT, cfg.RVCD, det.STCD FROM MS_ALONGDET_B det INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common') siteSort ON siteSort.RVCD = b.HBRVCD AND siteSort.STCD = b.STCD ");
+ sql.append("WHERE NVL(a.IS_DELETED, 0) = 0 ");
+ sql.append("AND (a.TASK_STATUS IS NULL OR a.TASK_STATUS = 'Approved') ");
+ sql.append("AND a.FID NOT LIKE '%ORA-%' AND a.FID NOT LIKE '%Out%' ");
+
+ if (StrUtil.isNotBlank(type)) {
+ if ("AI_50011".equals(type)) {
+ paramMap.put(keyPrefix + "Type", "AI_5001");
+ sql.append("AND a.TYPE = #{map.").append(keyPrefix).append("Type} ");
+ } else {
+ paramMap.put(keyPrefix + "Type", type);
+ sql.append("AND a.TYPE = #{map.").append(keyPrefix).append("Type} ");
+ }
+ }
+ if (StrUtil.isNotBlank(baseId)) {
+ paramMap.put(keyPrefix + "BaseId", baseId);
+ sql.append("AND b.BASE_ID = #{map.").append(keyPrefix).append("BaseId} ");
+ }
+ if (StrUtil.isNotBlank(stcd)) {
+ paramMap.put(keyPrefix + "Stcd", stcd);
+ sql.append("AND b.STCD = #{map.").append(keyPrefix).append("Stcd} ");
+ }
+ if (StrUtil.isNotBlank(rstcd)) {
+ sql.append("AND b.RSTCD IN (").append(rstcd).append(") ");
+ }
+ if (startTime != null) {
+ paramMap.put(keyPrefix + "StartTime", startTime);
+ sql.append("AND a.TM >= #{map.").append(keyPrefix).append("StartTime} ");
+ }
+ if (endTime != null) {
+ paramMap.put(keyPrefix + "EndTime", endTime);
+ sql.append("AND a.TM <= #{map.").append(keyPrefix).append("EndTime} ");
+ }
+
+ sql.append("CONNECT BY REGEXP_SUBSTR(a.FID, '[^,]+', 1, LEVEL) IS NOT NULL ");
+ sql.append("AND PRIOR a.ID = a.ID ");
+ sql.append("AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL");
+
+ return sql.toString();
+ }
+
+ private String buildAiFileOrderBySql(List sortList) {
+ if (CollUtil.isEmpty(sortList)) {
+ return " ORDER BY STCD, TM DESC ";
+ }
+ List orderItems = new ArrayList<>();
+ for (DataSourceRequest.SortDescriptor item : sortList) {
+ if (item == null || StrUtil.isBlank(item.getField())) {
+ continue;
+ }
+ String column = mapAiFileColumn(item.getField());
+ if (StrUtil.isBlank(column)) {
+ continue;
+ }
+ String dir = "desc".equalsIgnoreCase(item.getDir()) ? "DESC" : "ASC";
+ orderItems.add(column + " " + dir);
+ }
+ if (orderItems.isEmpty()) {
+ return " ORDER BY STCD, TM DESC ";
+ }
+ return " ORDER BY " + String.join(", ", orderItems);
+ }
+
+ private String mapAiFileColumn(String field) {
+ if (StrUtil.isBlank(field)) {
+ return null;
+ }
+ return switch (field) {
+ case "stcd" -> "STCD";
+ case "stnm" -> "STNM";
+ case "tm" -> "TM";
+ case "fid" -> "FID";
+ case "rstcd" -> "RSTCD";
+ case "ennm" -> "ENNM";
+ case "stCode" -> "STCODE";
+ case "stName" -> "STNAME";
+ case "baseStepSort" -> "BASESTEPSORT";
+ case "rvcdStepSort" -> "RVCDSTEPSORT";
+ case "rstcdStepSort" -> "RSTCDSTEPSORT";
+ case "siteStepSort" -> "SITESTEPSORT";
+ case "dataType" -> "DATA_TYPE";
+ default -> null;
+ };
+ }
+
private AiDmRunVo buildAiDmRunVo(Map row) {
if (row == null || row.isEmpty()) {
return null;
@@ -1624,6 +1875,7 @@ public class WarnDataServiceImpl implements WarnDataService {
case "rstcd" -> "ai.RSTCD";
case "ennm", "stnmEng" -> "eng.ENNM";
case "baseId" -> "ai.BASE_ID";
+ case "baseName" -> "hb.BASENAME";
case "hbrvcd" -> "ai.HBRVCD";
case "rvcd" -> "ai.RVCD";
case "tm" -> "rec.TM";
@@ -1653,6 +1905,7 @@ public class WarnDataServiceImpl implements WarnDataService {
case "rstcd" -> alias + ".rstcd";
case "ennm", "stnmEng" -> alias + ".ennm";
case "baseId" -> alias + ".baseId";
+ case "baseName" -> alias + ".baseName";
case "hbrvcd" -> alias + ".hbrvcd";
case "rvcd" -> alias + ".rvcd";
case "tm" -> alias + ".tm";
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java
index 6d0a35b7..e3f9247b 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/controller/EnvWqDataController.java
@@ -2,7 +2,9 @@ package com.yfd.platform.qgc_env.wq.controller;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.config.ResponseResult;
+import com.yfd.platform.annotation.Log;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
+import com.yfd.platform.qgc_env.wq.entity.vo.WqOperateRequest;
import com.yfd.platform.qgc_env.wq.service.EnvWqDataService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -57,13 +59,18 @@ public class EnvWqDataController {
return ResponseResult.successData(envWqDataService.getDrtpKendoListCust(dataSourceRequest));
}
+ @Log(module = "水质统计分析", value = "修改水质小时数据")
@PostMapping("/updateWqRsData")
@Operation(summary = "修改水质小时数据")
- public ResponseResult updateWqRsData(@RequestBody Map updateData) {
- envWqDataService.updateWqRsData(updateData);
+ public ResponseResult updateWqRsData(@RequestBody WqOperateRequest wqOperateRequest) {
+ envWqDataService.updateWqRsData(
+ wqOperateRequest == null ? null : wqOperateRequest.getUpdateData(),
+ wqOperateRequest == null ? null : wqOperateRequest.getSource()
+ );
return ResponseResult.success();
}
+ @Log(module = "水质统计分析", value = "删除水质小时/日/月数据")
@PostMapping("/removeKendoByIds")
@Operation(summary = "删除水质小时/日/月数据")
public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) {
@@ -149,4 +156,10 @@ public class EnvWqDataController {
public ResponseResult getRuleKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(envWqDataService.getWqWarRuleList(dataSourceRequest));
}
+
+ @PostMapping("/anchorPoint/GetKendoListCust")
+ @Operation(summary = "水质锚点")
+ public ResponseResult getAnchorPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(envWqDataService.getAnchorPointKendoListCust(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqAnchorPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqAnchorPointVo.java
new file mode 100644
index 00000000..12aa666b
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/EnvWqAnchorPointVo.java
@@ -0,0 +1,228 @@
+package com.yfd.platform.qgc_env.wq.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@Schema(description = "水质锚点VO")
+public class EnvWqAnchorPointVo {
+
+ @Schema(description = "断面")
+ private String stcd;
+
+ @Schema(description = "断面名称")
+ private String stnm;
+
+ @Schema(description = "电站名称")
+ private String ennm;
+
+ @Schema(description = "数据接入类型:0=自建 1=国家建 2=人工")
+ private Integer dtinType;
+
+ @Schema(description = "所在位置")
+ private String stlc;
+
+ @Schema(description = "水质要求")
+ private String wwqtg;
+
+ @Schema(description = "水质要求名称")
+ private String wwqtgName;
+
+ @Schema(description = "水质是否达标")
+ private Integer sfdb;
+
+ @Schema(description = "数据时间")
+ private Date tm;
+
+ @Schema(description = "水质类别:监测结果")
+ private String wqGrd;
+
+ @Schema(description = "水质类别名称")
+ private String wqGrdName;
+
+ @Schema(description = "站点类型 - 用于锚点弹框显示")
+ private String sttp;
+
+ @Schema(description = "经度")
+ private BigDecimal lgtd;
+
+ @Schema(description = "纬度")
+ private BigDecimal lttd;
+
+ @Schema(description = "高程")
+ private BigDecimal dtmel;
+
+ @Schema(description = "描点状态 - 用于图例")
+ private String anchoPointState;
+
+ @Schema(description = "锚点类型 - 用于锚点浮框显示")
+ private String sttpMap;
+
+ @Schema(description = "弹框站点名称")
+ private String titleName;
+
+ @Schema(description = "基地id")
+ private String baseId;
+
+ @Schema(description = "栖息地名称")
+ private String fhstnm;
+
+ @Schema(description = "栖息地编码")
+ private String fhstcd;
+
+ private String addvcdName;
+ private String baseName;
+ private String hbrvcd;
+ private String hbrvcdName;
+ private String rvcdName;
+ private String rstcd;
+ private Integer rstcdStepSort;
+ private Integer siteStepSort;
+ private Integer baseStepSort;
+ private Integer rvcdStepSort;
+
+ @Schema(description = "地图避让")
+ private Integer distance;
+
+ private String sttpCode;
+ private String value;
+ private String alias;
+
+ @Schema(description = "水温")
+ private BigDecimal wtmp;
+
+ @Schema(description = "PH")
+ private BigDecimal ph;
+
+ @Schema(description = "溶解氧")
+ private BigDecimal dox;
+
+ @Schema(description = "高锰酸盐指数")
+ private BigDecimal codmn;
+
+ @Schema(description = "化学需氧量")
+ private BigDecimal codcr;
+
+ @Schema(description = "五日生化需氧量")
+ private BigDecimal bod5;
+
+ @Schema(description = "氨氮")
+ private BigDecimal nh3n;
+
+ @Schema(description = "总磷")
+ private BigDecimal tp;
+
+ @Schema(description = "总氮")
+ private BigDecimal tn;
+
+ @Schema(description = "铜")
+ private BigDecimal cu;
+
+ @Schema(description = "锌")
+ private BigDecimal zn;
+
+ @Schema(description = "氟化物")
+ private BigDecimal f;
+
+ @Schema(description = "硒")
+ private BigDecimal se;
+
+ @Schema(description = "砷")
+ private BigDecimal ars;
+
+ @Schema(description = "汞")
+ private BigDecimal hg;
+
+ @Schema(description = "镉")
+ private BigDecimal cd;
+
+ @Schema(description = "铬(六价)")
+ private BigDecimal cr6;
+
+ @Schema(description = "铅")
+ private BigDecimal pb;
+
+ @Schema(description = "氰化物")
+ private BigDecimal cn;
+
+ @Schema(description = "挥发酚")
+ private BigDecimal vlph;
+
+ @Schema(description = "石油类")
+ private BigDecimal oil;
+
+ @Schema(description = "阴离子表面活性剂")
+ private BigDecimal las;
+
+ @Schema(description = "硫化物")
+ private BigDecimal s2;
+
+ @Schema(description = "粪大肠菌群")
+ private BigDecimal fcg;
+
+ @Schema(description = "氯化物")
+ private BigDecimal cl;
+
+ @Schema(description = "硫酸盐")
+ private BigDecimal so4;
+
+ @Schema(description = "硝酸盐氮")
+ private BigDecimal no3;
+
+ @Schema(description = "总硬度")
+ private BigDecimal thrd;
+
+ @Schema(description = "电导率")
+ private BigDecimal cond;
+
+ @Schema(description = "铁")
+ private BigDecimal fe;
+
+ @Schema(description = "锰")
+ private BigDecimal mn;
+
+ @Schema(description = "铝")
+ private BigDecimal al;
+
+ @Schema(description = "叶绿素a")
+ private BigDecimal chla;
+
+ @Schema(description = "透明度")
+ private BigDecimal clarity;
+
+ @Schema(description = "浊度")
+ private BigDecimal tu;
+
+ @Schema(description = "总氧/总需氧量")
+ private BigDecimal tod;
+
+ @Schema(description = "蓝绿藻")
+ private BigDecimal cyano;
+
+ @Schema(description = "水质要素最小限值集合")
+ private List> min;
+
+ @Schema(description = "水质要素最大限值集合")
+ private List> max;
+
+ @Schema(description = "排序")
+ private Integer orderIndex;
+
+ private String engLctn1Code;
+ private String engLctn3Code;
+
+ public void setWqGrd(String wqGrd) {
+ this.wqGrd = wqGrd;
+ this.value = wqGrd;
+ }
+
+ public void setWqGrdName(String wqGrdName) {
+ this.wqGrdName = wqGrdName;
+ this.alias = wqGrdName;
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/WqOperateRequest.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/WqOperateRequest.java
new file mode 100644
index 00000000..4b7d5050
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/entity/vo/WqOperateRequest.java
@@ -0,0 +1,13 @@
+package com.yfd.platform.qgc_env.wq.entity.vo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class WqOperateRequest {
+
+ private String source;
+
+ private Map updateData;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java
index f23a3931..f2ff1e22 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java
@@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_env.wq.entity.vo.WqBaseInfoVo;
+import com.yfd.platform.qgc_env.wq.entity.vo.EnvWqAnchorPointVo;
import java.util.Map;
@@ -39,7 +40,9 @@ public interface EnvWqDataService {
DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest);
- boolean updateWqRsData(Map updateData);
+ boolean updateWqRsData(Map updateData, String source);
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
+
+ DataSourceResult getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java
index 32f2c970..cbc2bb8b 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/impl/EnvWqDataServiceImpl.java
@@ -1,15 +1,22 @@
package com.yfd.platform.qgc_env.wq.service.impl;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.common.*;
import com.yfd.platform.common.exception.BizException;
+import com.yfd.platform.qgc_base.domain.MsOperationLog;
+import com.yfd.platform.qgc_base.domain.MsOperationLogDetail;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_base.entity.vo.DataParam;
+import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper;
+import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper;
import com.yfd.platform.qgc_env.wq.entity.vo.*;
import com.yfd.platform.qgc_env.wq.service.EnvWqDataService;
import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo;
+import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils;
import com.yfd.platform.utils.KendoUtil;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.RequestHolder;
@@ -31,17 +38,121 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
+import org.apache.commons.collections4.CollectionUtils;
@Service
public class EnvWqDataServiceImpl implements EnvWqDataService {
+ private static final String WQ_HOUR_TABLE_NAME = "SD_WQ_R";
+ private static final String WQ_DAY_TABLE_NAME = "SD_WQDAY_S";
+ private static final String WQ_MONTH_TABLE_NAME = "SD_WQDRTP_S";
+ private static final String WQ_STATION_TABLE_NAME = "SD_WQ_B_H";
+
+ private static final LinkedHashMap WQ_UPDATE_COLUMN_MAP = new LinkedHashMap<>();
+ private static final Map WQ_FIELD_MEANING_MAP = new LinkedHashMap<>();
+ static {
+ WQ_UPDATE_COLUMN_MAP.put("wtmp", "WTMP");
+ WQ_UPDATE_COLUMN_MAP.put("ph", "PH");
+ WQ_UPDATE_COLUMN_MAP.put("dox", "DOX");
+ WQ_UPDATE_COLUMN_MAP.put("codmn", "CODMN");
+ WQ_UPDATE_COLUMN_MAP.put("codcr", "CODCR");
+ WQ_UPDATE_COLUMN_MAP.put("bod5", "BOD5");
+ WQ_UPDATE_COLUMN_MAP.put("nh3n", "NH3N");
+ WQ_UPDATE_COLUMN_MAP.put("tp", "TP");
+ WQ_UPDATE_COLUMN_MAP.put("tn", "TN");
+ WQ_UPDATE_COLUMN_MAP.put("cu", "CU");
+ WQ_UPDATE_COLUMN_MAP.put("zn", "ZN");
+ WQ_UPDATE_COLUMN_MAP.put("f", "F");
+ WQ_UPDATE_COLUMN_MAP.put("se", "SE");
+ WQ_UPDATE_COLUMN_MAP.put("ars", "ARS");
+ WQ_UPDATE_COLUMN_MAP.put("hg", "HG");
+ WQ_UPDATE_COLUMN_MAP.put("cd", "CD");
+ WQ_UPDATE_COLUMN_MAP.put("cr6", "CR6");
+ WQ_UPDATE_COLUMN_MAP.put("pb", "PB");
+ WQ_UPDATE_COLUMN_MAP.put("cn", "CN");
+ WQ_UPDATE_COLUMN_MAP.put("vlph", "VLPH");
+ WQ_UPDATE_COLUMN_MAP.put("oil", "OIL");
+ WQ_UPDATE_COLUMN_MAP.put("las", "LAS");
+ WQ_UPDATE_COLUMN_MAP.put("s2", "S2");
+ WQ_UPDATE_COLUMN_MAP.put("fcg", "FCG");
+ WQ_UPDATE_COLUMN_MAP.put("cl", "CL");
+ WQ_UPDATE_COLUMN_MAP.put("so4", "SO4");
+ WQ_UPDATE_COLUMN_MAP.put("no3", "NO3");
+ WQ_UPDATE_COLUMN_MAP.put("thrd", "THRD");
+ WQ_UPDATE_COLUMN_MAP.put("cond", "COND");
+ WQ_UPDATE_COLUMN_MAP.put("fe", "FE");
+ WQ_UPDATE_COLUMN_MAP.put("mn", "MN");
+ WQ_UPDATE_COLUMN_MAP.put("al", "AL");
+ WQ_UPDATE_COLUMN_MAP.put("chla", "CHLA");
+ WQ_UPDATE_COLUMN_MAP.put("clarity", "CLARITY");
+ WQ_UPDATE_COLUMN_MAP.put("tu", "TU");
+ WQ_UPDATE_COLUMN_MAP.put("cyano", "CYANO");
+ WQ_UPDATE_COLUMN_MAP.put("wqgrd", "WQGRD");
+ WQ_UPDATE_COLUMN_MAP.put("sfdb", "SFDB");
+ WQ_UPDATE_COLUMN_MAP.put("wqSfdbhnYs", "WQ_SFDBHN_YS");
+
+ WQ_FIELD_MEANING_MAP.put("STCD", "站点编码");
+ WQ_FIELD_MEANING_MAP.put("TM", "监测时间");
+ WQ_FIELD_MEANING_MAP.put("DT", "统计日期");
+ WQ_FIELD_MEANING_MAP.put("DRTP", "统计类型");
+ WQ_FIELD_MEANING_MAP.put("YEAR", "年份");
+ WQ_FIELD_MEANING_MAP.put("MONTH", "月份");
+ WQ_FIELD_MEANING_MAP.put("WTMP", "水温");
+ WQ_FIELD_MEANING_MAP.put("PH", "酸碱度");
+ WQ_FIELD_MEANING_MAP.put("DOX", "溶解氧");
+ WQ_FIELD_MEANING_MAP.put("CODMN", "高锰酸盐指数");
+ WQ_FIELD_MEANING_MAP.put("CODCR", "化学需氧量");
+ WQ_FIELD_MEANING_MAP.put("BOD5", "五日生化需氧量");
+ WQ_FIELD_MEANING_MAP.put("NH3N", "氨氮");
+ WQ_FIELD_MEANING_MAP.put("TP", "总磷");
+ WQ_FIELD_MEANING_MAP.put("TN", "总氮");
+ WQ_FIELD_MEANING_MAP.put("CU", "铜");
+ WQ_FIELD_MEANING_MAP.put("ZN", "锌");
+ WQ_FIELD_MEANING_MAP.put("F", "氟化物");
+ WQ_FIELD_MEANING_MAP.put("SE", "硒");
+ WQ_FIELD_MEANING_MAP.put("ARS", "砷");
+ WQ_FIELD_MEANING_MAP.put("HG", "汞");
+ WQ_FIELD_MEANING_MAP.put("CD", "镉");
+ WQ_FIELD_MEANING_MAP.put("CR6", "六价铬");
+ WQ_FIELD_MEANING_MAP.put("PB", "铅");
+ WQ_FIELD_MEANING_MAP.put("CN", "氰化物");
+ WQ_FIELD_MEANING_MAP.put("VLPH", "挥发酚");
+ WQ_FIELD_MEANING_MAP.put("OIL", "石油类");
+ WQ_FIELD_MEANING_MAP.put("LAS", "阴离子表面活性剂");
+ WQ_FIELD_MEANING_MAP.put("S2", "硫化物");
+ WQ_FIELD_MEANING_MAP.put("FCG", "粪大肠菌群");
+ WQ_FIELD_MEANING_MAP.put("CL", "氯化物");
+ WQ_FIELD_MEANING_MAP.put("SO4", "硫酸盐");
+ WQ_FIELD_MEANING_MAP.put("NO3", "硝酸盐");
+ WQ_FIELD_MEANING_MAP.put("THRD", "总硬度");
+ WQ_FIELD_MEANING_MAP.put("COND", "电导率");
+ WQ_FIELD_MEANING_MAP.put("FE", "铁");
+ WQ_FIELD_MEANING_MAP.put("MN", "锰");
+ WQ_FIELD_MEANING_MAP.put("AL", "铝");
+ WQ_FIELD_MEANING_MAP.put("CHLA", "叶绿素a");
+ WQ_FIELD_MEANING_MAP.put("CLARITY", "透明度");
+ WQ_FIELD_MEANING_MAP.put("TU", "浊度");
+ WQ_FIELD_MEANING_MAP.put("CYANO", "蓝绿藻");
+ WQ_FIELD_MEANING_MAP.put("WQGRD", "水质类别");
+ WQ_FIELD_MEANING_MAP.put("WWQTG", "水功能区目标");
+ WQ_FIELD_MEANING_MAP.put("SFDB", "是否达标");
+ WQ_FIELD_MEANING_MAP.put("WQ_SFDBHN_YS", "是否达标湖内饮用水源");
+ }
+
@Resource
private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
@Resource
private JdbcTemplate jdbcTemplate;
+ @Resource
+ private MsOperationLogMapper msOperationLogMapper;
+
+ @Resource
+ private MsOperationLogDetailMapper msOperationLogDetailMapper;
+
@Override
public DataSourceResult processKendoList(DataSourceRequest dataSourceRequest) {
boolean calculated = CommonConstant.CALCULATE_SUCCESS.equals(
@@ -3671,15 +3782,18 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
@Override
@Transactional(rollbackFor = Exception.class)
- public boolean updateWqRsData(Map updateData) {
+ public boolean updateWqRsData(Map updateData, String source) {
if (updateData == null || updateData.isEmpty()) {
return true;
}
- updateWqHourData(updateData);
- updateWqTargetIfNeeded(updateData);
-
String stcd = asString(updateData.get("stcd"));
String tm = asString(updateData.get("tm"));
+ Map beforeHour = queryWqHourRow(stcd, tm);
+ Map beforeStation = queryWqStationRow(stcd);
+ updateWqHourData(updateData);
+ updateWqTargetIfNeeded(updateData);
+ recordWqUpdateLog(beforeHour, beforeStation, updateData, source);
+
if (StrUtil.isNotBlank(stcd) && StrUtil.isNotBlank(tm) && tm.length() >= 10) {
String dateStr = tm.substring(0, 10);
statisticsDayDataFromHour(stcd, dateStr, dateStr);
@@ -3704,17 +3818,24 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
return true;
}
String dataType = StrUtil.blankToDefault(batchDeleteAo.getDataType(), "").toUpperCase();
+ String source = batchDeleteAo == null ? null : batchDeleteAo.getSource();
int batchSize = 500;
for (int i = 0; i < dataList.size(); i += batchSize) {
List subList = dataList.subList(i, Math.min(i + batchSize, dataList.size()));
if ("MON".equals(dataType)) {
+ List> beforeRows = queryWqMonthRows(subList);
softDeleteWqMonthData(subList);
+ recordWqDeleteLog(beforeRows, WQ_MONTH_TABLE_NAME, "删除水质月数据", source);
}
if ("DATE".equals(dataType)) {
+ List> beforeRows = queryWqDayRows(subList);
softDeleteWqDayData(subList);
+ recordWqDeleteLog(beforeRows, WQ_DAY_TABLE_NAME, "删除水质日数据", source);
}
if ("TIME".equals(dataType)) {
+ List> beforeRows = queryWqHourRows(subList);
deleteWqHourData(subList);
+ recordWqDeleteLog(beforeRows, WQ_HOUR_TABLE_NAME, "删除水质小时数据", source);
Map dateRangeMap = new HashMap<>();
Map monthRangeMap = new HashMap<>();
@@ -3765,50 +3886,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
}
private void updateWqHourData(Map updateData) {
- LinkedHashMap columnMap = new LinkedHashMap<>();
- columnMap.put("wtmp", "WTMP");
- columnMap.put("ph", "PH");
- columnMap.put("dox", "DOX");
- columnMap.put("codmn", "CODMN");
- columnMap.put("codcr", "CODCR");
- columnMap.put("bod5", "BOD5");
- columnMap.put("nh3n", "NH3N");
- columnMap.put("tp", "TP");
- columnMap.put("tn", "TN");
- columnMap.put("cu", "CU");
- columnMap.put("zn", "ZN");
- columnMap.put("f", "F");
- columnMap.put("se", "SE");
- columnMap.put("ars", "ARS");
- columnMap.put("hg", "HG");
- columnMap.put("cd", "CD");
- columnMap.put("cr6", "CR6");
- columnMap.put("pb", "PB");
- columnMap.put("cn", "CN");
- columnMap.put("vlph", "VLPH");
- columnMap.put("oil", "OIL");
- columnMap.put("las", "LAS");
- columnMap.put("s2", "S2");
- columnMap.put("fcg", "FCG");
- columnMap.put("cl", "CL");
- columnMap.put("so4", "SO4");
- columnMap.put("no3", "NO3");
- columnMap.put("thrd", "THRD");
- columnMap.put("cond", "COND");
- columnMap.put("fe", "FE");
- columnMap.put("mn", "MN");
- columnMap.put("al", "AL");
- columnMap.put("chla", "CHLA");
- columnMap.put("clarity", "CLARITY");
- columnMap.put("tu", "TU");
- columnMap.put("cyano", "CYANO");
- columnMap.put("wqgrd", "WQGRD");
- columnMap.put("sfdb", "SFDB");
- columnMap.put("wqSfdbhnYs", "WQ_SFDBHN_YS");
-
List setClauses = new ArrayList<>();
List params = new ArrayList<>();
- for (Map.Entry entry : columnMap.entrySet()) {
+ for (Map.Entry entry : WQ_UPDATE_COLUMN_MAP.entrySet()) {
if (updateData.containsKey(entry.getKey())) {
setClauses.add(entry.getValue() + " = ?");
params.add(updateData.get(entry.getKey()));
@@ -3909,6 +3989,286 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
jdbcTemplate.update(sql.toString(), params.toArray());
}
+ private Map queryWqHourRow(String stcd, String tm) {
+ if (StrUtil.isBlank(stcd) || StrUtil.isBlank(tm)) {
+ return new HashMap<>();
+ }
+ String sql = "SELECT " + buildWqHourLogSelectColumns() +
+ " FROM SD_WQ_R WHERE STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')";
+ List> rows = jdbcTemplate.queryForList(sql, stcd, tm);
+ return rows.isEmpty() ? new HashMap<>() : normalizeLogRow(rows.getFirst());
+ }
+
+ private Map queryWqStationRow(String stcd) {
+ if (StrUtil.isBlank(stcd)) {
+ return new HashMap<>();
+ }
+ String sql = "SELECT STCD, WWQTG FROM SD_WQ_B_H WHERE STCD = ? AND NVL(IS_DELETED, 0) = 0";
+ List> rows = jdbcTemplate.queryForList(sql, stcd);
+ return rows.isEmpty() ? new HashMap<>() : normalizeLogRow(rows.getFirst());
+ }
+
+ private List> queryWqHourRows(List dataParamList) {
+ if (CollUtil.isEmpty(dataParamList)) {
+ return new ArrayList<>();
+ }
+ StringBuilder sql = new StringBuilder("SELECT ")
+ .append(buildWqHourLogSelectColumns())
+ .append(" FROM SD_WQ_R WHERE ");
+ List params = new ArrayList<>();
+ appendHourRowConditions(sql, params, dataParamList);
+ return normalizeLogRows(jdbcTemplate.queryForList(sql.toString(), params.toArray()));
+ }
+
+ private List> queryWqDayRows(List dataParamList) {
+ if (CollUtil.isEmpty(dataParamList)) {
+ return new ArrayList<>();
+ }
+ StringBuilder sql = new StringBuilder("SELECT ")
+ .append(buildWqDayLogSelectColumns())
+ .append(" FROM SD_WQDAY_S WHERE ");
+ List params = new ArrayList<>();
+ for (int i = 0; i < dataParamList.size(); i++) {
+ if (i > 0) {
+ sql.append(" OR ");
+ }
+ sql.append("(STCD = ? AND DT = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'))");
+ DataParam item = dataParamList.get(i);
+ params.add(item == null ? null : item.getId());
+ params.add(item == null ? null : item.getDt());
+ }
+ return normalizeLogRows(jdbcTemplate.queryForList(sql.toString(), params.toArray()));
+ }
+
+ private List> queryWqMonthRows(List dataParamList) {
+ if (CollUtil.isEmpty(dataParamList)) {
+ return new ArrayList<>();
+ }
+ StringBuilder sql = new StringBuilder("SELECT ")
+ .append(buildWqMonthLogSelectColumns())
+ .append(" FROM SD_WQDRTP_S WHERE ");
+ List params = new ArrayList<>();
+ for (int i = 0; i < dataParamList.size(); i++) {
+ if (i > 0) {
+ sql.append(" OR ");
+ }
+ sql.append("(STCD = ? AND DRTP = ? AND YEAR = ? AND MONTH = ?)");
+ DataParam item = dataParamList.get(i);
+ params.add(item == null ? null : item.getId());
+ params.add(item == null ? null : item.getDrtp());
+ params.add(item == null ? null : item.getYear());
+ params.add(item == null ? null : item.getMonth());
+ }
+ return normalizeLogRows(jdbcTemplate.queryForList(sql.toString(), params.toArray()));
+ }
+
+ private void appendHourRowConditions(StringBuilder sql, List params, List dataParamList) {
+ for (int i = 0; i < dataParamList.size(); i++) {
+ if (i > 0) {
+ sql.append(" OR ");
+ }
+ sql.append("(STCD = ? AND TM = TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'))");
+ DataParam item = dataParamList.get(i);
+ params.add(item == null ? null : item.getId());
+ params.add(item == null ? null : item.getTm());
+ }
+ }
+
+ private String buildWqHourLogSelectColumns() {
+ return "ID,STCD, TO_CHAR(TM, 'YYYY-MM-DD HH24:MI:SS') AS TM, " +
+ "WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, " +
+ "VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, " +
+ "WQGRD, SFDB, WQ_SFDBHN_YS";
+ }
+
+ private String buildWqDayLogSelectColumns() {
+ return "STCD, TO_CHAR(DT, 'YYYY-MM-DD HH24:MI:SS') AS DT, " +
+ "WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, " +
+ "VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, " +
+ "WQGRD, SFDB, IS_DELETED";
+ }
+
+ private String buildWqMonthLogSelectColumns() {
+ return "STCD, DRTP, YEAR, MONTH, " +
+ "WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, " +
+ "VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, " +
+ "WQGRD, SFDB, IS_DELETED";
+ }
+
+ private List> normalizeLogRows(List> rows) {
+ List> result = new ArrayList<>();
+ if (CollUtil.isEmpty(rows)) {
+ return result;
+ }
+ for (Map row : rows) {
+ result.add(normalizeLogRow(row));
+ }
+ return result;
+ }
+
+ private Map normalizeLogRow(Map row) {
+ Map normalized = new LinkedHashMap<>();
+ if (row == null || row.isEmpty()) {
+ return normalized;
+ }
+ for (Map.Entry entry : row.entrySet()) {
+ normalized.put(entry.getKey() == null ? null : entry.getKey().toUpperCase(), entry.getValue());
+ }
+ return normalized;
+ }
+
+ private void recordWqUpdateLog(Map beforeHour,
+ Map beforeStation,
+ Map updateData,
+ String source) {
+ if (updateData == null || updateData.isEmpty()) {
+ return;
+ }
+ String stcd = asString(updateData.get("stcd"));
+ List details = new ArrayList<>();
+ for (Map.Entry entry : WQ_UPDATE_COLUMN_MAP.entrySet()) {
+ if (!updateData.containsKey(entry.getKey())) {
+ continue;
+ }
+ String column = entry.getValue();
+ Object oldValue = beforeHour == null ? null : beforeHour.get(column);
+ Object newValue = updateData.get(entry.getKey());
+ if (StrUtil.equals(formatLogValue(oldValue), formatLogValue(newValue))) {
+ continue;
+ }
+ details.add(buildWqDetail(null, WQ_HOUR_TABLE_NAME, stcd, column,
+ oldValue, resolveWqDisplayValue(column, oldValue),
+ newValue, resolveWqDisplayValue(column, newValue), "修改字段值"));
+ }
+ if (updateData.containsKey("wwqtg")) {
+ Object oldValue = beforeStation == null ? null : beforeStation.get("WWQTG");
+ Object newValue = updateData.get("wwqtg");
+ if (!StrUtil.equals(formatLogValue(oldValue), formatLogValue(newValue))) {
+ details.add(buildWqDetail(null, WQ_STATION_TABLE_NAME, stcd, "WWQTG",
+ oldValue, resolveWqDisplayValue("WWQTG", oldValue),
+ newValue, resolveWqDisplayValue("WWQTG", newValue), "修改字段值"));
+ }
+ }
+ if (details.isEmpty()) {
+ return;
+ }
+ String recordId = ObjectUtil.isNotEmpty(beforeHour) && ObjectUtil.isNotEmpty(beforeHour.get("ID"))
+ ? beforeHour.get("ID").toString()
+ : null; MsOperationLog mainLog = buildWqMainLog(recordId,"修改水质小时数据", source);
+ msOperationLogMapper.insert(mainLog);
+ for (MsOperationLogDetail detail : details) {
+ detail.setMainId(mainLog.getId());
+ }
+ batchInsertWqLogDetails(details);
+ }
+
+ private void recordWqDeleteLog(List> rows, String tableName, String remark, String source) {
+ if (CollUtil.isEmpty(rows)) {
+ return;
+ }
+ List details = new ArrayList<>();
+ for (Map row : rows) {
+ String stcd = asString(row.get("STCD"));
+ String recordId = asString(row.get("ID"));
+ MsOperationLog mainLog = buildWqMainLog(recordId,remark, source);
+ msOperationLogMapper.insert(mainLog);
+ for (Map.Entry entry : row.entrySet()) {
+ String fieldCode = entry.getKey();
+ if (StrUtil.isBlank(fieldCode)) {
+ continue;
+ }
+ Object oldValue = entry.getValue();
+ if (oldValue == null) {
+ continue;
+ }
+ details.add(buildWqDetail(mainLog.getId(), tableName, stcd, fieldCode,
+ oldValue, resolveWqDisplayValue(fieldCode, oldValue),
+ null, null, "删除字段值"));
+ }
+ }
+ batchInsertWqLogDetails(details);
+ }
+
+ private MsOperationLog buildWqMainLog(String recordId,String remark, String source) {
+ MsOperationLog log = new MsOperationLog();
+ log.setOperator(resolveLogOperator());
+ log.setRecordId(recordId);
+ log.setOperateTime(new Date());
+ log.setTableName(WQ_HOUR_TABLE_NAME);
+ log.setSource(StrUtil.trimToNull(source));
+ log.setRemark(remark);
+ return log;
+ }
+
+ private MsOperationLogDetail buildWqDetail(String mainId,
+ String tableName,
+ String stationCode,
+ String fieldCode,
+ Object oldValueCode,
+ Object oldValueName,
+ Object newValueCode,
+ Object newValueName,
+ String remark) {
+ MsOperationLogDetail detail = new MsOperationLogDetail();
+ detail.setMainId(mainId);
+ detail.setTableName(tableName);
+ detail.setStationCode(stationCode);
+ detail.setFieldCode(fieldCode);
+ detail.setFieldMeaning(WQ_FIELD_MEANING_MAP.getOrDefault(fieldCode, fieldCode));
+ detail.setOldValueCode(formatLogValue(oldValueCode));
+ detail.setOldValueName(formatLogValue(oldValueName));
+ detail.setNewValueCode(formatLogValue(newValueCode));
+ detail.setNewValueName(formatLogValue(newValueName));
+ detail.setRemark(remark);
+ return detail;
+ }
+
+ private void batchInsertWqLogDetails(List details) {
+ if (CollUtil.isEmpty(details)) {
+ return;
+ }
+ for (MsOperationLogDetail detail : details) {
+ if (detail == null) {
+ continue;
+ }
+ msOperationLogDetailMapper.insert(detail);
+ }
+ }
+
+ private Object resolveWqDisplayValue(String fieldCode, Object rawValue) {
+ String text = formatLogValue(rawValue);
+ if (StrUtil.isBlank(text)) {
+ return rawValue;
+ }
+ return switch (fieldCode) {
+ case "WQGRD", "WWQTG" -> getWqLevelName(text);
+ case "SFDB" -> parseInteger(text) == null ? text : getSfdbName(parseInteger(text));
+ default -> text;
+ };
+ }
+
+ private String resolveLogOperator() {
+ try {
+ return SecurityUtils.getCurrentUsername();
+ } catch (Exception ignored) {
+ try {
+ return SecurityUtils.getUserId();
+ } catch (Exception ex) {
+ return null;
+ }
+ }
+ }
+
+ private String formatLogValue(Object value) {
+ if (value == null) {
+ return null;
+ }
+ if (value instanceof Date date) {
+ return DateUtil.formatDateTime(date);
+ }
+ return String.valueOf(value);
+ }
+
private String getMonthEndDate(Integer year, Integer month) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
@@ -4182,4 +4542,205 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
")";
jdbcTemplate.update(mergeSql, stcd, startDate, endDate);
}
+
+ @Override
+ public DataSourceResult getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest) {
+ DataSourceResult dataSourceResult = new DataSourceResult<>();
+ dataSourceResult.setAggregates(new HashMap<>());
+
+ if (dataSourceRequest == null) {
+ dataSourceResult.setData(new ArrayList<>());
+ dataSourceResult.setTotal(0L);
+ return dataSourceResult;
+ }
+
+ DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest();
+ String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "sttpCode");
+ String time = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "tm");
+ String fhFlag = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "fhFlag");
+
+ StringBuilder sql = new StringBuilder();
+ sql.append("SELECT ")
+ .append("t.STCD AS stcd, ")
+ .append("t.STNM AS stnm, ")
+ .append("t.STTP AS sttp, ")
+ .append("t.STTP AS sttpCode, ")
+ .append("t.LGTD AS lgtd, ")
+ .append("t.LTTD AS lttd, ")
+ .append("t.ELEV AS dtmel, ")
+ .append("t.STLC AS stlc, ")
+ .append("t.WWQTG AS wwqtg, ")
+ .append("t.DTIN_TYPE AS dtinType, ")
+ .append("t.RSTCD AS rstcd, ")
+ .append("t.FHSTCD AS fhstcd, ")
+ .append("t.ORDER_INDEX AS orderIndex, ")
+ .append("eng.ENNM AS ennm, ")
+ .append("hb.BASE_NAME AS baseName, ")
+ .append("hb.BASEID AS baseId, ")
+ .append("eng.HBRVCD AS hbrvcd, ")
+ .append("NVL(hbrv.NAME, '') AS hbrvcdName, ")
+ .append("NVL(rvcd.NAME, '') AS rvcdName, ")
+ .append("NVL(addvcd.NAME, '') AS addvcdName, ")
+ .append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ")
+ .append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ")
+ .append("NVL(siteSort.SORT, 999999) AS siteStepSort, ")
+ .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ")
+ .append("'' AS engLctn1Code, ")
+ .append("'' AS engLctn3Code ")
+ .append("FROM SD_WQ_B_H t ")
+ .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.CODE = eng.HBRVCD AND NVL(hbrv.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN SD_RVCD_DIC rvcd ON rvcd.CODE = eng.RVCD AND NVL(rvcd.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN SD_ADDVCD_DIC addvcd ON addvcd.CODE = eng.ADDVCD AND NVL(addvcd.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ")
+ .append("LEFT JOIN ( ")
+ .append(" SELECT det.SORT, cfg.RVCD, det.STCD ")
+ .append(" FROM MS_ALONGDET_B det ")
+ .append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ")
+ .append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ")
+ .append(") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = t.RSTCD ")
+ .append("LEFT JOIN ( ")
+ .append(" SELECT det.SORT, cfg.RVCD, det.STCD ")
+ .append(" FROM MS_ALONGDET_B det ")
+ .append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ")
+ .append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ")
+ .append(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = t.STCD ")
+ .append("WHERE NVL(t.IS_DELETED, 0) = 0 ")
+ .append("AND NVL(t.USFL, 1) = 1 ")
+ .append("AND t.LGTD IS NOT NULL ")
+ .append("AND t.LTTD IS NOT NULL ");
+
+ DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
+ Page> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
+ List wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EnvWqAnchorPointVo.class);
+
+ if (CollectionUtils.isNotEmpty(wqVoList)) {
+ List stcdList = wqVoList.stream()
+ .filter(w -> StrUtil.isNotBlank(w.getStcd()))
+ .map(w -> w.getStcd().trim())
+ .distinct()
+ .collect(Collectors.toList());
+
+ String wqDataSql = "SELECT STCD, TM, WQGRD, SFDB, WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, TOD " +
+ "FROM ( " +
+ " SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.STCD ORDER BY t.TM DESC) AS rn " +
+ " FROM SD_WQ_R t " +
+ " WHERE t.STCD IN (" + String.join(",", stcdList.stream().map(s -> "'" + s + "'").collect(Collectors.toList())) + ") " +
+ " AND NVL(t.IS_DELETED, 0) = 0 " +
+ ") WHERE rn = 1";
+
+ List wqDataList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class);
+ Map wqDataMap = wqDataList.stream()
+ .collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue));
+
+ for (EnvWqAnchorPointVo anchorPointVo : wqVoList) {
+ EnvWqDataVo wqData = wqDataMap.get(anchorPointVo.getStcd());
+ if (wqData != null) {
+ anchorPointVo.setTm(wqData.getTm());
+ anchorPointVo.setWqGrd(wqData.getWqgrd());
+ anchorPointVo.setSfdb(wqData.getSfdb());
+ anchorPointVo.setWtmp(wqData.getWtmp());
+ anchorPointVo.setPh(wqData.getPh());
+ anchorPointVo.setDox(wqData.getDox());
+ anchorPointVo.setCodmn(wqData.getCodmn());
+ anchorPointVo.setCodcr(wqData.getCodcr());
+ anchorPointVo.setBod5(wqData.getBod5());
+ anchorPointVo.setNh3n(wqData.getNh3n());
+ anchorPointVo.setTp(wqData.getTp());
+ anchorPointVo.setTn(wqData.getTn());
+ anchorPointVo.setCu(wqData.getCu());
+ anchorPointVo.setZn(wqData.getZn());
+ anchorPointVo.setF(wqData.getF());
+ anchorPointVo.setSe(wqData.getSe());
+ anchorPointVo.setArs(wqData.getArs());
+ anchorPointVo.setHg(wqData.getHg());
+ anchorPointVo.setCd(wqData.getCd());
+ anchorPointVo.setCr6(wqData.getCr6());
+ anchorPointVo.setPb(wqData.getPb());
+ anchorPointVo.setCn(wqData.getCn());
+ anchorPointVo.setVlph(wqData.getVlph());
+ anchorPointVo.setOil(wqData.getOil());
+ anchorPointVo.setLas(wqData.getLas());
+ anchorPointVo.setS2(wqData.getS2());
+ anchorPointVo.setFcg(wqData.getFcg());
+ anchorPointVo.setCl(wqData.getCl());
+ anchorPointVo.setSo4(wqData.getSo4());
+ anchorPointVo.setNo3(wqData.getNo3());
+ anchorPointVo.setThrd(wqData.getThrd());
+ anchorPointVo.setCond(wqData.getCond());
+ anchorPointVo.setFe(wqData.getFe());
+ anchorPointVo.setMn(wqData.getMn());
+ anchorPointVo.setAl(wqData.getAl());
+ anchorPointVo.setChla(wqData.getChla());
+ anchorPointVo.setClarity(wqData.getClarity());
+ anchorPointVo.setTu(wqData.getTu());
+ anchorPointVo.setCyano(wqData.getCyano());
+ anchorPointVo.setTod(wqData.getTod());
+ }
+ }
+ }
+
+ for (EnvWqAnchorPointVo anchorPointVo : wqVoList) {
+ anchorPointVo.setSttpMap(anchorPointVo.getSttp());
+ anchorPointVo.setTitleName(anchorPointVo.getStnm());
+ anchorPointVo.setAnchoPointState(getAnchorPoint(anchorPointVo));
+
+ if (StrUtil.isNotBlank(sttpCode) && "WQFB".equals(sttpCode)) {
+ anchorPointVo.setAnchoPointState("wqfb_legend");
+ }
+ if (StrUtil.isNotBlank(fhFlag)) {
+ anchorPointVo.setAnchoPointState("fhwq_legend");
+ }
+ }
+
+ SiteAvoidanceUtils.calcSiteMapLev(wqVoList,
+ EnvWqAnchorPointVo::getStcd,
+ EnvWqAnchorPointVo::getLgtd,
+ EnvWqAnchorPointVo::getLttd,
+ EnvWqAnchorPointVo::getAnchoPointState,
+ EnvWqAnchorPointVo::setDistance);
+
+ dataSourceResult.setData(wqVoList);
+ dataSourceResult.setTotal(page == null ? wqVoList.size() : page.getTotal());
+ return dataSourceResult;
+ }
+
+ private String getAnchorPoint(EnvWqAnchorPointVo anchorPointVo) {
+ Integer dtinType = anchorPointVo.getDtinType();
+ Integer sfdb = anchorPointVo.getSfdb();
+
+ if (dtinType == null) {
+ dtinType = 2;
+ }
+ if (sfdb == null) {
+ sfdb = 2;
+ }
+
+ if (dtinType == 0) {
+ if (sfdb == 0) {
+ return "wq_station_4";
+ } else if (sfdb == 1) {
+ return "wq_station_3";
+ } else {
+ return "wq_station_8";
+ }
+ } else if (dtinType == 1) {
+ if (sfdb == 0) {
+ return "wq_station_2";
+ } else if (sfdb == 1) {
+ return "wq_station_1";
+ } else {
+ return "wq_station_7";
+ }
+ } else {
+ if (sfdb == 0) {
+ return "wq_station_6";
+ } else if (sfdb == 1) {
+ return "wq_station_5";
+ } else {
+ return "wq_station_9";
+ }
+ }
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java
index 6dccdf94..828e4caf 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/controller/SdWTMonitorController.java
@@ -2,12 +2,14 @@ package com.yfd.platform.qgc_env.wt.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yfd.platform.annotation.Log;
import com.yfd.platform.common.DataSourceLoadOptionsBase;
import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.exception.BizException;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
+import com.yfd.platform.qgc_env.wt.entity.vo.WtOperateRequest;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo;
import com.yfd.platform.qgc_env.wt.service.*;
@@ -54,10 +56,14 @@ public class SdWTMonitorController {
return ResponseResult.successData(result);
}
+ @Log(module = "水温监测", value = "修改表层水温日数据")
@PostMapping("/alongDetail/updateWtrvRData")
@Operation(summary = "修改表层水温日数据")
- public ResponseResult updateWtrvRData(@RequestBody Map updateData) {
- alongDetailService.updateWtrvRData(updateData);
+ public ResponseResult updateWtrvRData(@RequestBody WtOperateRequest wtOperateRequest) {
+ alongDetailService.updateWtrvRData(
+ wtOperateRequest == null ? null : wtOperateRequest.getUpdateData(),
+ wtOperateRequest == null ? null : wtOperateRequest.getSource()
+ );
return ResponseResult.success();
}
@@ -75,6 +81,7 @@ public class SdWTMonitorController {
return ResponseResult.successData(result);
}
+ @Log(module = "水温监测", value = "删除出库水温周旬月季年数据")
@PostMapping("/alongDetail/drtp/removeKendoByIds")
@Operation(summary = "删除出库水温周旬月季年数据")
public ResponseResult removeKendoByIds(@RequestBody BatchDeleteAo batchDeleteAo) {
@@ -236,6 +243,7 @@ public class SdWTMonitorController {
return ResponseResult.successData(sdWtMonitorService.getCxDetailList(dataSourceRequest));
}
+ @Log(module = "水温监测", value = "删除垂向水温数据")
@PostMapping("/cxDetail/removeKendoByIds")
@Operation(summary = "删除垂向水温数据")
public ResponseResult removeCxDetailByIds(@RequestBody BatchDeleteAo batchDeleteAo) {
@@ -243,10 +251,14 @@ public class SdWTMonitorController {
return ResponseResult.success();
}
+ @Log(module = "水温监测", value = "修改垂向水温数据")
@PostMapping("/cxDetail/updateWtvtRData")
@Operation(summary = "修改垂向水温数据")
- public ResponseResult updateWtvtRData(@RequestBody Map updateData) {
- sdWtvtRService.updateWtvtRData(updateData);
+ public ResponseResult updateWtvtRData(@RequestBody WtOperateRequest wtOperateRequest) {
+ sdWtvtRService.updateWtvtRData(
+ wtOperateRequest == null ? null : wtOperateRequest.getUpdateData(),
+ wtOperateRequest == null ? null : wtOperateRequest.getSource()
+ );
return ResponseResult.success();
}
@@ -309,4 +321,10 @@ public class SdWTMonitorController {
public ResponseResult getOneLevelListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(sdDzChuiXiangListService.processKendoList(dataSourceRequest));
}
+
+ @PostMapping("/getFacilityPointList/GetKendoListCust")
+ @Operation(summary = "低温水减缓设施描点")
+ public ResponseResult getFacilityPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
+ return ResponseResult.successData(sdWtMonitorService.getFacilityPointKendoListCust(dataSourceRequest));
+ }
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/DwSlowFacilityMapVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/DwSlowFacilityMapVO.java
new file mode 100644
index 00000000..f4033274
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/DwSlowFacilityMapVO.java
@@ -0,0 +1,83 @@
+package com.yfd.platform.qgc_env.wt.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(description = "低温水减缓设施描点VO")
+public class DwSlowFacilityMapVO {
+
+ @Schema(description = "站点编码")
+ private String stcd;
+
+ @Schema(description = "关联电站编码")
+ private String rstcd;
+
+ @Schema(description = "关联电站编码(冗余)")
+ private String rstcds;
+
+ @Schema(description = "站名")
+ private String stnm;
+
+ @Schema(description = "标题名称")
+ private String titleName;
+
+ @Schema(description = "站点类型编码")
+ private String sttpCode;
+
+ @Schema(description = "站点类型映射")
+ private String sttpMap;
+
+ @Schema(description = "描点状态")
+ private String anchoPointState;
+
+ @Schema(description = "地图避让")
+ private Integer distance;
+
+ @Schema(description = "建设状态 0=规划,1=在建,2=已建")
+ private String bldstt;
+
+ @Schema(description = "经度")
+ private BigDecimal lgtd;
+
+ @Schema(description = "纬度")
+ private BigDecimal lttd;
+
+ @Schema(description = "遥测方式")
+ private String dtmel;
+
+ @Schema(description = "流域编码")
+ private String rvcd;
+
+ @Schema(description = "行政区编码")
+ private String addvcd;
+
+ @Schema(description = "基地编码")
+ private String baseId;
+
+ @Schema(description = "关联电站名称")
+ private String ennm;
+
+ @Schema(description = "运行状态")
+ private String status;
+
+ @Schema(description = "站点类型")
+ private String sttp;
+
+ @Schema(description = "设施类型")
+ private String dwtp;
+
+ @Schema(description = "设施类型名称")
+ private String dwtpName;
+
+ @Schema(description = "站点类型名称")
+ private String sttpName;
+
+ @Schema(description = "是否接入:0=未接入 1=已接入")
+ private Integer dtin;
+
+ @Schema(description = "达标状态子类型(1=正常运行,2=暂无数据,3=未正常运行)")
+ private Integer stdSstate;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtOperateRequest.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtOperateRequest.java
new file mode 100644
index 00000000..cdddcf9b
--- /dev/null
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WtOperateRequest.java
@@ -0,0 +1,13 @@
+package com.yfd.platform.qgc_env.wt.entity.vo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class WtOperateRequest {
+
+ private String source;
+
+ private Map updateData;
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/AlongDetailService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/AlongDetailService.java
index 5465ec79..a4de4324 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/AlongDetailService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/AlongDetailService.java
@@ -43,6 +43,6 @@ public interface AlongDetailService extends IService {
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
- void updateWtrvRData(Map updateData);
+ void updateWtrvRData(Map updateData, String source);
-}
\ No newline at end of file
+}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java
index c6d44008..ba092d0a 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtMonitorService.java
@@ -13,6 +13,7 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtBaseInfoVo;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendSaveVo;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvVo;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo;
+import com.yfd.platform.qgc_env.wt.entity.vo.DwSlowFacilityMapVO;
import java.util.List;
@@ -51,4 +52,6 @@ public interface SdWtMonitorService {
DataSourceResult getMonthDetailList(DataSourceRequest dataSourceRequest);
List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest);
+
+ DataSourceResult getFacilityPointKendoListCust(DataSourceRequest dataSourceRequest);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java
index 2b62f2b3..43c165a0 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/SdWtvtRService.java
@@ -24,5 +24,5 @@ public interface SdWtvtRService {
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
- void updateWtvtRData(Map updateData);
+ void updateWtvtRData(Map updateData, String source);
}
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java
index 009f7cf6..13596442 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/AlongDetailServiceImpl.java
@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.common.*;
import com.yfd.platform.common.exception.BizException;
+import com.yfd.platform.qgc_base.domain.MsOperationLog;
+import com.yfd.platform.qgc_base.domain.MsOperationLogDetail;
import com.yfd.platform.qgc_env.wt.mapper.AlongDetailMapper;
import com.yfd.platform.qgc_env.wt.mapper.SdWtrvdrtpSMapper;
import com.yfd.platform.qgc_env.wt.service.AlongDetailService;
@@ -17,6 +19,8 @@ import com.yfd.platform.qgc_env.wt.entity.vo.SdAlongDrtpDetailVO;
import com.yfd.platform.qgc_env.wt.entity.vo.WtrvInfo;
import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_base.entity.vo.DataParam;
+import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper;
+import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper;
import com.yfd.platform.utils.CollectionExtUtils;
import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.SecurityUtils;
@@ -37,6 +41,29 @@ import java.util.stream.Collectors;
*/
@Service
public class AlongDetailServiceImpl extends ServiceImpl implements AlongDetailService {
+ private static final String WT_HOUR_TABLE_NAME = "SD_WTRV_R";
+ private static final Map WT_UPDATE_COLUMN_MAP = new LinkedHashMap<>();
+ private static final Map WT_FIELD_MEANING_MAP = new LinkedHashMap<>();
+
+ static {
+ WT_UPDATE_COLUMN_MAP.put("wt", "WT");
+
+ WT_FIELD_MEANING_MAP.put("ID", "主键ID");
+ WT_FIELD_MEANING_MAP.put("STCD", "水温站编码");
+ WT_FIELD_MEANING_MAP.put("TM", "数据时间");
+ WT_FIELD_MEANING_MAP.put("WT", "水温");
+ WT_FIELD_MEANING_MAP.put("REMARK", "备注");
+ WT_FIELD_MEANING_MAP.put("FID", "附件ID");
+ WT_FIELD_MEANING_MAP.put("WER_ID", "所属水生生态调查数据表ID");
+ WT_FIELD_MEANING_MAP.put("RECORD_USER", "创建人");
+ WT_FIELD_MEANING_MAP.put("RECORD_TIME", "创建时间");
+ WT_FIELD_MEANING_MAP.put("MODIFY_USER", "更新人");
+ WT_FIELD_MEANING_MAP.put("MODIFY_TIME", "更新时间");
+ WT_FIELD_MEANING_MAP.put("IS_DELETED", "是否已删除");
+ WT_FIELD_MEANING_MAP.put("DELETE_USER", "删除人");
+ WT_FIELD_MEANING_MAP.put("DELETE_TIME", "删除时间");
+ }
+
@Resource
private DynamicSQLMapper dynamicSQLMapper;
@Resource
@@ -50,6 +77,12 @@ public class AlongDetailServiceImpl extends ServiceImpl filterResult, Page page) {
DataSourceResult dataSourceResult = new DataSourceResult();
@@ -799,6 +832,7 @@ public class AlongDetailServiceImpl extends ServiceImpl dataList = batchDeleteAo.getDataList();
+ String source = batchDeleteAo == null ? null : batchDeleteAo.getSource();
if(CollUtil.isEmpty(dataList)){
return true;
}
@@ -816,7 +850,9 @@ public class AlongDetailServiceImpl extends ServiceImpl> beforeRows = queryWtHourRows(subList);
sdWtrvdrtpSMapper.deleteWtrvRData(subList, DateUtil.now(), SecurityUtils.getCurrentUsername());
+ recordWtDeleteLog(beforeRows, "删除表层水温日数据", source);
// 删除小时数据后,需要重新统计对应的日数据和月数据
Map dateRangeMap = new HashMap<>();
Map monthRangeMap = new HashMap<>();
@@ -1048,13 +1084,14 @@ public class AlongDetailServiceImpl extends ServiceImpl