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/config/RedisConfig.java b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java new file mode 100644 index 00000000..7f32bf5d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java @@ -0,0 +1,117 @@ +package com.yfd.platform.config; + +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Configuration +@EnableCaching +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + StringRedisSerializer stringSerializer = new StringRedisSerializer(); + + redisTemplate.setKeySerializer(stringSerializer); + redisTemplate.setHashKeySerializer(stringSerializer); + redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer()); + redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer()); + + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + + @Bean + public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); + stringRedisTemplate.setConnectionFactory(redisConnectionFactory); + return stringRedisTemplate; + } + + @Bean + @Primary + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig() + .prefixCacheNameWith("qgc:") + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer())) + .entryTtl(Duration.ofMinutes(30)); + +// Map cacheConfigs = new HashMap<>(); +// cacheConfigs.put("dictCache", defaultConfig.entryTtl(Duration.ofHours(6))); +// cacheConfigs.put("dataCache", defaultConfig.entryTtl(Duration.ofMinutes(5))); +// cacheConfigs.put("engInfoCache", defaultConfig.entryTtl(Duration.ofHours(2))); + + return RedisCacheManager.builder(redisConnectionFactory) + .cacheDefaults(defaultConfig) +// .withInitialCacheConfigurations(cacheConfigs) + .build(); + } + + @Bean + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + // ✅ 关键:启用默认类型信息(必须添加) + objectMapper.activateDefaultTyping( + objectMapper.getPolymorphicTypeValidator(), + ObjectMapper.DefaultTyping.NON_FINAL, + JsonTypeInfo.As.PROPERTY + ); + + return new GenericJackson2JsonRedisSerializer(objectMapper); + } + + @Bean("customKeyGenerator") + public KeyGenerator customKeyGenerator() { + return (target, method, params) -> { + StringBuilder sb = new StringBuilder(); + sb.append(target.getClass().getSimpleName()); + sb.append(":"); + sb.append(method.getName()); + sb.append(":"); + for (Object param : params) { + sb.append(param != null ? param.toString() : "null"); + sb.append(","); + } + if (!sb.isEmpty() && sb.charAt(sb.length() - 1) == ',') { + sb.deleteCharAt(sb.length() - 1); + } + return sb.toString(); + }; + } + + @Bean("cacheKeyGenerator") + public KeyGenerator cacheKeyGenerator() { + return (target, method, params) -> target.getClass().getName() + "." + method.getName() + ":" + DigestUtil.md5Hex(JSONUtil.toJsonStr(params)); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/config/WebConfig.java b/backend/src/main/java/com/yfd/platform/config/WebConfig.java index 8356277c..1539d29b 100644 --- a/backend/src/main/java/com/yfd/platform/config/WebConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/WebConfig.java @@ -7,12 +7,15 @@ import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import java.util.concurrent.TimeUnit; + @Configuration public class WebConfig implements WebMvcConfigurer { @Resource @@ -21,11 +24,28 @@ public class WebConfig implements WebMvcConfigurer { @Value("${app.zip-import.temp-dir}") private String platformPath; - + @Resource + private StringRedisTemplate stringRedisTemplate; @Bean public Cache loginuserCache() { - return CacheUtil.newLRUCache(200);//用户登录缓存数 缺省200 + return CacheUtil.newLRUCache(200); + } + + public void putLoginCache(String key, String value, long timeoutSeconds) { + stringRedisTemplate.opsForValue().set(key, value, timeoutSeconds, TimeUnit.SECONDS); + } + + public void putLoginCache(String key, String value) { + stringRedisTemplate.opsForValue().set(key, value); + } + + public String getLoginCache(String key) { + return stringRedisTemplate.opsForValue().get(key); + } + + public void removeLoginCache(String key) { + stringRedisTemplate.delete(key); } @Bean diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java index b0bf0bcf..9395ae94 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/controller/SdEngMonitorController.java @@ -44,4 +44,10 @@ public class SdEngMonitorController { public ResponseResult getOperatKendoList(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(engInfoBHService.getOperatKendoList(dataSourceRequest)); } + + @PostMapping("/point/GetKendoListCust") + @Operation(summary = "水电站-地图锚点") + public ResponseResult getEngPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engInfoBHService.getEngPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java new file mode 100644 index 00000000..c693d44d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngPointVo.java @@ -0,0 +1,102 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "水电站描点") +public class EngPointVo { + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站点名称") + private String stnm; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "电站图片") + private String logo; + + @Schema(description = "标题名称") + private String titleName; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政区编码") + private String addvcd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "多年平均流量") + private BigDecimal avq; + + @Schema(description = "装机容量(MW)") + private BigDecimal ttpwr; + + @Schema(description = "正常蓄水位") + private BigDecimal normz; + + @Schema(description = "多年平均发电量") + private BigDecimal yrge; + + @Schema(description = "所属基地编码") + private String baseId; + + @Schema(description = "建成日期") + private Date jcdt; + + @Schema(description = "所属行政区名称") + private String addvcdName; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "站点类型映射") + private String sttpMap; + + @Schema(description = "遥测方式") + private String dtmel; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "流域沿程") + private Integer rvcdStepSort; + + @Schema(description = "电站沿程") + private Integer rstcdStepSort; + + @Schema(description = "是否电站专题电站") + private String ifEngSpecial; + + @Schema(description = "电站装机类型") + private Integer endInstalledType; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "工程规模") + private Integer prsc; + + @Schema(description = "图标旋转角度") + private Integer iconRotate; + + @Schema(description = "建设状态") + private Integer bldsttCcode; + + @Schema(description = "基地排序") + private Integer baseStepSort; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java index 7d034512..5082c0ee 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/ISdEngInfoBHService.java @@ -9,6 +9,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; +import com.yfd.platform.qgc_base.domain.vo.EngPointVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; @@ -86,4 +87,6 @@ public interface ISdEngInfoBHService extends IService { DataSourceResult getOperatKendoList(DataSourceRequest dataSourceRequest); DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit); + + DataSourceResult getEngPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java index be1aa4b8..879347e6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdEngInfoBHServiceImpl.java @@ -27,6 +27,7 @@ import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.vo.EngBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngEiaapprovalVo; import com.yfd.platform.qgc_base.domain.vo.EngOperatVo; +import com.yfd.platform.qgc_base.domain.vo.EngPointVo; import com.yfd.platform.qgc_base.domain.vo.EngStbprpDataVo; import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo; import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo; @@ -38,6 +39,8 @@ import com.yfd.platform.system.service.IAdminAuthService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -104,21 +107,25 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getByBaseId(String baseId) { return engInfoBHMapper.selectByBaseId(baseId); } @Override + @Cacheable(cacheNames = "engInfoCache#3600", keyGenerator = "cacheKeyGenerator") public List getByHycd(String hycd) { return engInfoBHMapper.selectByHycd(hycd); } @Override + @Cacheable(cacheNames = "engInfoCache#3600", keyGenerator = "cacheKeyGenerator") public List getByRvcd(String rvcd,String reachcd) { return engInfoBHMapper.selectByRvcd(rvcd,reachcd); } @Override + @Cacheable(cacheNames = "engInfoCache#3600", keyGenerator = "cacheKeyGenerator") public List selectForDropdown(SdEngInfoBHRequest sdEngInfoBHRequest) { String baseId = sdEngInfoBHRequest.getBaseId(); String hbrvcd = sdEngInfoBHRequest.getHbrvcd(); @@ -223,6 +230,7 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl ids, String source) { List stcdList = ids == null ? new ArrayList<>() : ids.stream() @@ -2664,4 +2674,258 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getEngPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + result.setData(new ArrayList<>()); + result.setTotal(0L); + return result; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.STCD AS stcd, ") + .append("t.STNM AS ennm, ") + .append("t.LOGO AS logo, ") + .append("t.STNM AS stnm, ") + .append("t.STNM AS titleName, ") + .append("t.RVCD AS rvcd, ") + .append("t.ADDVCD AS addvcd, ") + .append("t.LGTD AS lgtd, ") + .append("t.LTTD AS lttd, ") + .append("t.AVQ AS avq, ") + .append("t.YRGEB AS ttpwr, ") + .append("t.FSLTDZ AS normz, ") + .append("t.YRGEB AS yrge, ") + .append("t.BASE_ID AS baseId, ") + .append("t.JCDT AS jcdt, ") + .append("t.ADDVCD_NAME AS addvcdName, ") + .append("t.PRSC AS prsc, ") + .append("CAST(NULL AS NUMBER) AS iconRotate, ") + .append("t.BLDSTT_CODE AS bldsttCcode, ") + .append("'ENG' AS sttpMap, ") + .append("'ENG' AS sttp, ") + .append("'ENG' AS sttpCode, ") + .append("t.DTIN_ENV AS dtmel, ") + .append("NVL(siteSort.SORT, 999999) AS siteStepSort, ") + .append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ") + .append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ") + .append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ") + .append("CASE WHEN elec.configCount > 0 THEN 'true' WHEN elec.configCount IS NULL THEN 'false' ELSE 'false' END AS ifEngSpecial, ") + .append("CASE ") + .append(" WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 2 THEN 'large_eng_built' ") + .append(" WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 1 THEN 'large_eng_ubuilt' ") + .append(" WHEN t.PRSC IN ('1','2') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'large_eng_nbuilt' ") + .append(" WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 2 THEN 'mid_eng_built' ") + .append(" WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 1 THEN 'mid_eng_ubuilt' ") + .append(" WHEN t.PRSC IN ('3') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'mid_eng_nbuilt' ") + .append(" END AS anchoPointState, ") + .append("CASE ") + .append(" WHEN t.PRSC IN ('1','2') THEN 1 ") + .append(" WHEN t.PRSC IN ('3') THEN 2 ") + .append(" END AS endInstalledType ") + .append("FROM SD_ENGINFO_B_H t ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = t.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN MS_ALONG_B along ON along.RVCD = t.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 = t.HBRVCD AND rstSort.STCD = t.STCD ") + .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 = t.HBRVCD AND siteSort.STCD = t.STCD ") + .append("LEFT JOIN ( ") + .append(" SELECT STCD, COUNT(ID) AS configCount ") + .append(" FROM SD_EQ_B_H ") + .append(" WHERE NVL(IS_DELETED, 0) = 0 ") + .append(" GROUP BY STCD ") + .append(") elec ON t.STCD = elec.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 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildEngPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildEngPointOrderBySql(dataSourceRequest.getSort())); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EngPointVo.class); + + result.setData(list); + result.setTotal(page == null ? list.size() : page.getTotal()); + return result; + } + + private String buildEngPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (CollUtil.isNotEmpty(filter.getFilters())) { + List childConditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildEngPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + childConditions.add(childSql); + } + } + if (childConditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return "(" + String.join(logic, childConditions) + ")"; + } + String column = mapEngPointColumn(filter.getField()); + 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 ("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 = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "engPointParam" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + ("ni".equals(operator) ? " NOT IN (" : " IN (") + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String key = "engPointParam" + 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 mapEngPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.STCD"; + case "stnm", "ennm", "titleName" -> "t.STNM"; + case "rvcd" -> "t.RVCD"; + case "addvcd" -> "t.ADDVCD"; + case "lgtd" -> "t.LGTD"; + case "lttd" -> "t.LTTD"; + case "avq" -> "t.AVQ"; + case "ttpwr" -> "t.YRGEB"; + case "normz" -> "t.FSLTDZ"; + case "yrge" -> "t.YRGEB"; + case "baseId" -> "t.BASE_ID"; + case "jcdt" -> "t.JCDT"; + case "addvcdName" -> "t.ADDVCD_NAME"; + case "prsc" -> "t.PRSC"; + case "iconRotate" -> "t.ICON_ROTATE"; + case "bldsttCcode" -> "t.BLDSTT_CODE"; + case "sttp" -> "'ENG'"; + case "sttpCode" -> "'ENG'"; + case "sttpMap" -> "'ENG'"; + case "dtmel" -> "t.DTIN_ENV"; + case "siteStepSort" -> "siteStepSort"; + case "rvcdStepSort" -> "rvcdStepSort"; + case "rstcdStepSort" -> "rstcdStepSort"; + case "baseStepSort" -> "baseStepSort"; + case "ifEngSpecial" -> "ifEngSpecial"; + case "anchoPointState" -> "anchoPointState"; + case "endInstalledType" -> "endInstalledType"; + default -> null; + }; + } + + private String buildEngPointOrderBySql(List sortList) { + if (CollUtil.isEmpty(sortList)) { + return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || StrUtil.isBlank(sortDescriptor.getField())) { + continue; + } + String column = mapEngPointColumn(sortDescriptor.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir); + } + if (orderItems.isEmpty()) { + return " ORDER BY baseStepSort ASC, rvcdStepSort ASC, rstcdStepSort ASC, siteStepSort ASC, stnm ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } 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_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 8ff8bc00..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; @@ -168,4 +171,14 @@ public class EngEqDataController { 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 4bdafb61..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; @@ -61,4 +63,6 @@ public interface EngEqDataService { 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 e0582bb7..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(); 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 1928c9ed..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 @@ -158,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, ") @@ -173,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}); @@ -1873,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"; @@ -1902,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 9a6709aa..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 @@ -156,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/service/EnvWqDataService.java b/backend/src/main/java/com/yfd/platform/qgc_env/wq/service/EnvWqDataService.java index 6a55e1da..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; @@ -42,4 +43,6 @@ public interface EnvWqDataService { 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 e041cf54..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 @@ -16,6 +16,7 @@ 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; @@ -37,7 +38,9 @@ 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 { @@ -4539,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 8212bef8..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 @@ -321,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/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/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index fa485604..b6ce2afd 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -20,7 +20,9 @@ import com.yfd.platform.qgc_env.wt.entity.vo.WtTreeStcdVo; import com.yfd.platform.qgc_env.wt.entity.vo.WtrvAmendResultVo; 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.DwSlowFacilityMapVO; import com.yfd.platform.qgc_env.wt.mapper.SdWtMonitorMapper; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wt.service.SdWtMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -2830,4 +2832,93 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { private String ennm; } + @Override + public DataSourceResult getFacilityPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + DataSourceLoadOptionsBase devRequest = dataSourceRequest.toDevRequest(); + String bldsttCcode = QgcQueryWrapperUtil.getFilterFieldValue(devRequest, "bldsttCcode"); + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.STCD AS stcd, ") + .append("t.RSTCD AS rstcd, ") + .append("t.RSTCD AS rstcds, ") + .append("t.STNM AS stnm, ") + .append("t.STNM AS titleName, ") + .append("t.STTP AS sttpCode, ") + .append("t.STTP AS sttpMap, ") + .append("t.STTP AS anchoPointState, ") + .append("t.BLDSTT_CODE AS bldstt, ") + .append("t.LGTD AS lgtd, ") + .append("t.LTTD AS lttd, ") + .append("CAST(NULL AS NUMBER) AS dtmel, ") + .append("eng.RVCD AS rvcd, ") + .append("eng.ADDVCD AS addvcd, ") + .append("eng.BASE_ID AS baseId, ") + .append("eng.ENNM AS ennm, ") + .append("NULL AS status, ") + .append("t.STTP AS sttp, ") + .append("t.STTP AS dwtp, ") + .append("sttp.STTP_NAME AS dwtpName, ") + .append("sttp.STTP_NAME AS sttpName, ") + .append("t.DTIN AS dtin, ") + .append("NULL AS stdSstate ") + .append("FROM SD_DFLTKW_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_STTP_B sttp ON sttp.STTP_CODE = t.STTP AND NVL(sttp.IS_DELETED, 0) = 0 ") + .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 "); + + if (StrUtil.isNotEmpty(bldsttCcode)) { + sql.append(" AND t.BLDSTT_CODE = #{map.bldsttCcode} "); + } + + Map paramMap = new HashMap<>(); + if (StrUtil.isNotEmpty(bldsttCcode)) { + paramMap.put("bldsttCcode", bldsttCcode); + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, DwSlowFacilityMapVO.class); + + for (DwSlowFacilityMapVO vo : resultList) { + String sttpCode = vo.getSttpCode(); + String bldstt = vo.getBldstt(); + boolean isBuilt = "2".equals(bldstt); + + if ("DW_2".equals(sttpCode)) { + vo.setAnchoPointState(isBuilt ? "dws_1" : "dws_1_incomplete"); + } else if ("DW_5".equals(sttpCode)) { + vo.setAnchoPointState(isBuilt ? "dws_2" : "dws_2_incomplete"); + } else if ("DW_6".equals(sttpCode)) { + vo.setAnchoPointState(isBuilt ? "dws_3" : "dws_3_incomplete"); + } else { + vo.setAnchoPointState(isBuilt ? "dws_4" : "dws_4_incomplete"); + } + vo.setSttpCode("DW"); + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + DwSlowFacilityMapVO::getStcd, + DwSlowFacilityMapVO::getLgtd, + DwSlowFacilityMapVO::getLttd, + DwSlowFacilityMapVO::getAnchoPointState, + DwSlowFacilityMapVO::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/utils/SiteAvoidanceUtils.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/utils/SiteAvoidanceUtils.java new file mode 100644 index 00000000..33491f5d --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/utils/SiteAvoidanceUtils.java @@ -0,0 +1,282 @@ +package com.yfd.platform.qgc_env.wt.utils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public class SiteAvoidanceUtils { + + private final static int DEFAULT_LEVEL = 50000000; + private final static int LEVEL1 = 1500000; + private final static double LEVEL1_DISTANCE = 1.2; + private final static int LEVEL2 = 800000; + private final static double LEVEL2_DISTANCE = 0.8; + private final static int LEVEL3 = 400000; + private final static double LEVEL3_DISTANCE = 0.4; + private final static int LEVEL4 = 50000; + private final static double LEVEL4_DISTANCE = 0.1; + + public static List calcSiteMapLev(List vos, Function stcdGetter, Function lgtdGetter, + Function lttdGetter, Function anchoPointStateGetter, + BiConsumer valueSetter) { + return calcSiteMapLev(vos, null, stcdGetter, lgtdGetter, lttdGetter, anchoPointStateGetter, valueSetter); + } + + public static List calcSiteMapLev(List vos, BaseAnchoPointAo ao, Function stcdGetter, + Function lgtdGetter, Function lttdGetter, + Function anchoPointStateGetter, BiConsumer valueSetter) { + if (ao == null) { + ao = new BaseAnchoPointAo(); + } + if (ao.getDefaultLevel() == null) { + ao.setDefaultLevel(DEFAULT_LEVEL); + } + if (ao.getLevel1() == null) { + ao.setLevel1(LEVEL1); + } + if (ao.getLevel1Distance() == null) { + ao.setLevel1Distance(LEVEL1_DISTANCE); + } + if (ao.getLevel2() == null) { + ao.setLevel2(LEVEL2); + } + if (ao.getLevel2Distance() == null) { + ao.setLevel2Distance(LEVEL2_DISTANCE); + } + if (ao.getLevel3() == null) { + ao.setLevel3(LEVEL3); + } + if (ao.getLevel3Distance() == null) { + ao.setLevel3Distance(LEVEL3_DISTANCE); + } + if (ao.getLevel4() == null) { + ao.setLevel4(LEVEL4); + } + if (ao.getLevel4Distance() == null) { + ao.setLevel4Distance(LEVEL4_DISTANCE); + } + if (ao.getCategory() == null) { + ao.setCategory(true); + } + + if (ao.getMinX() != null && ao.getMinY() != null && ao.getMaxX() != null && ao.getMaxY() != null) { + List filterVos = new ArrayList<>(vos.size()); + for (T vo : vos) { + if (lgtdGetter.apply(vo) == null || lgtdGetter.apply(vo).doubleValue() < ao.getMinX() || lgtdGetter.apply(vo).doubleValue() > ao.getMaxX()) { + continue; + } + if (lttdGetter.apply(vo) == null || lttdGetter.apply(vo).doubleValue() < ao.getMinY() || lttdGetter.apply(vo).doubleValue() > ao.getMaxY()) { + continue; + } + filterVos.add(vo); + } + if (filterVos.isEmpty()) { + return new ArrayList<>(); + } + vos = filterVos; + } + + Set meterMapData = new HashSet<>(); + for (int i = 0; i < vos.size(); i++) { + fori(vos, i, meterMapData, ao, stcdGetter, lgtdGetter, lttdGetter, anchoPointStateGetter, valueSetter); + } + return vos; + } + + private static void fori(List partitionLayerMeterList, int i, Set meterMapData, BaseAnchoPointAo ao, + Function stcdGetter, Function lgtdGetter, + Function lttdGetter, Function anchoPointStateGetter, + BiConsumer valueSetter) { + T siteAvoidanceDto = partitionLayerMeterList.get(i); + + String category = anchoPointStateGetter.apply(siteAvoidanceDto); + if (!ao.getCategory()) { + category = null; + } + String stcd = stcdGetter.apply(siteAvoidanceDto); + BigDecimal x1 = lgtdGetter.apply(siteAvoidanceDto); + BigDecimal y1 = lttdGetter.apply(siteAvoidanceDto); + if (meterMapData.contains(stcd + category)) { + return; + } + valueSetter.accept(siteAvoidanceDto, ao.getDefaultLevel()); + for (int j = i + 1; j < partitionLayerMeterList.size(); j++) { + forj(j, partitionLayerMeterList, meterMapData, category, stcd, x1, y1, ao, stcdGetter, lgtdGetter, lttdGetter, anchoPointStateGetter, valueSetter); + } + } + + private static void forj(int j, List partitionLayerMeterList, Set meterMapData, String category, + String stcd, BigDecimal x1, BigDecimal y1, BaseAnchoPointAo ao, + Function stcdGetter, Function lgtdGetter, + Function lttdGetter, Function anchoPointStateGetter, + BiConsumer valueSetter) { + T baseAnchoPointVo = partitionLayerMeterList.get(j); + String category2 = anchoPointStateGetter.apply(baseAnchoPointVo); + if (!ao.getCategory()) { + category = null; + } + String stcd2 = stcdGetter.apply(baseAnchoPointVo); + BigDecimal x2 = lgtdGetter.apply(baseAnchoPointVo); + BigDecimal y2 = lttdGetter.apply(baseAnchoPointVo); + if (!ao.getCategory()) { + category = null; + } + if (meterMapData.contains(stcd2 + category2)) { + return; + } + if (x1 == null || x2 == null || y1 == null || y2 == null) { + return; + } + if (!(stcd + category).equals(stcd2 + category2)) { + double dx = Math.abs(x1.doubleValue() - x2.doubleValue()); + double dy = Math.abs(y1.doubleValue() - y2.doubleValue()); + double distance = Math.sqrt(dx * dx + dy * dy); + if (distance < ao.getLevel4Distance()) { + valueSetter.accept(baseAnchoPointVo, ao.getLevel4()); + meterMapData.add(stcd2 + category2); + } else if (distance < ao.getLevel3Distance()) { + valueSetter.accept(baseAnchoPointVo, ao.getLevel3()); + meterMapData.add(stcd2 + category2); + } else if (distance < ao.getLevel2Distance()) { + valueSetter.accept(baseAnchoPointVo, ao.getLevel2()); + meterMapData.add(stcd2 + category2); + } else if (distance < ao.getLevel1Distance()) { + valueSetter.accept(baseAnchoPointVo, ao.getLevel1()); + meterMapData.add(stcd2 + category2); + } + } + } + + public static class BaseAnchoPointAo { + private Integer defaultLevel; + private Integer level1; + private Double level1Distance; + private Integer level2; + private Double level2Distance; + private Integer level3; + private Double level3Distance; + private Integer level4; + private Double level4Distance; + private Boolean category; + private Double minX; + private Double minY; + private Double maxX; + private Double maxY; + + public Integer getDefaultLevel() { + return defaultLevel; + } + + public void setDefaultLevel(Integer defaultLevel) { + this.defaultLevel = defaultLevel; + } + + public Integer getLevel1() { + return level1; + } + + public void setLevel1(Integer level1) { + this.level1 = level1; + } + + public Double getLevel1Distance() { + return level1Distance; + } + + public void setLevel1Distance(Double level1Distance) { + this.level1Distance = level1Distance; + } + + public Integer getLevel2() { + return level2; + } + + public void setLevel2(Integer level2) { + this.level2 = level2; + } + + public Double getLevel2Distance() { + return level2Distance; + } + + public void setLevel2Distance(Double level2Distance) { + this.level2Distance = level2Distance; + } + + public Integer getLevel3() { + return level3; + } + + public void setLevel3(Integer level3) { + this.level3 = level3; + } + + public Double getLevel3Distance() { + return level3Distance; + } + + public void setLevel3Distance(Double level3Distance) { + this.level3Distance = level3Distance; + } + + public Integer getLevel4() { + return level4; + } + + public void setLevel4(Integer level4) { + this.level4 = level4; + } + + public Double getLevel4Distance() { + return level4Distance; + } + + public void setLevel4Distance(Double level4Distance) { + this.level4Distance = level4Distance; + } + + public Boolean getCategory() { + return category; + } + + public void setCategory(Boolean category) { + this.category = category; + } + + public Double getMinX() { + return minX; + } + + public void setMinX(Double minX) { + this.minX = minX; + } + + public Double getMinY() { + return minY; + } + + public void setMinY(Double minY) { + this.minY = minY; + } + + public Double getMaxX() { + return maxX; + } + + public void setMaxX(Double maxX) { + this.maxX = maxX; + } + + public Double getMaxY() { + return maxY; + } + + public void setMaxY(Double maxY) { + this.maxY = maxY; + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java index 923af1cd..a573ce04 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/impl/ZqMonitorServiceImpl.java @@ -25,6 +25,7 @@ import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; +import org.springframework.cache.annotation.Cacheable; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -89,11 +90,13 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { private MsOperationLogDetailMapper msOperationLogDetailMapper; @Override + @Cacheable(cacheNames = "zqCache#7200", keyGenerator = "cacheKeyGenerator") public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { return getMsstbprptListInternal(dataSourceRequest, false); } @Override + @Cacheable(cacheNames = "zqCache#7200", keyGenerator = "cacheKeyGenerator") public DataSourceResult getEngMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceRequest request = dataSourceRequest == null ? new DataSourceRequest() : dataSourceRequest; request.setSelect(Arrays.asList("stcd", "stnm", "wtDeviceType", "dtinType", "mway")); @@ -108,13 +111,13 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { .append(buildMsstbprptDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect())) .append(" FROM SD_RIVER_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.HBRVCD = eng.HBRVCD ") - .append(" AND hbrv.BASEID = eng.BASE_ID ") - .append(" AND hbrv.IS_DELETED = 0 ") - .append(" AND hbrv.ENABLED = 1 ") - .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ") - .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ") +// .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.HBRVCD = eng.HBRVCD ") +// .append(" AND hbrv.BASEID = eng.BASE_ID ") +// .append(" AND hbrv.IS_DELETED = 0 ") +// .append(" AND hbrv.ENABLED = 1 ") +// .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD ") +// .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD ") .append("WHERE t.IS_DELETED = 0 "); if (onlyZq) { sql.append("AND t.STTP = 'ZQ' "); diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java index 25904a0b..0e5740eb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java @@ -181,6 +181,10 @@ public class MsMaplayerB implements Serializable { @TableField("LABEL_LEVEL") private Integer labelLevel; + /** 标签层级 */ + @TableField("ANCHOR_PARAM_JSON") + private String anchorParamJson; + /** 子级集合(非数据库字段) */ @TableField(exist = false) private List children; diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerVo.java index 55c7ad5e..e3925657 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerVo.java @@ -64,6 +64,9 @@ public class MapLayerVo { @Schema(description = "参数json") private String paramJson; + @Schema(description = "参数ANCHOR_PARAM_JSON") + private String anchorParamJson; + @Schema(description = "排序") private String orderIndex; diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLegendVo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLegendVo.java index 3ad7fa4a..03d26c78 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLegendVo.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLegendVo.java @@ -49,6 +49,9 @@ public class MapLegendVo { @Schema(description = "是否默认勾选;0=否;1=是") private Integer checked; + @Schema(description = "0=否;1=是") + private Integer enable; + @Schema(description = "是否可勾选;0=否;1=是") private Integer canBeChecked; diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java index d0858123..ee8da0e4 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java @@ -23,7 +23,7 @@ public interface MsMapmoduleBMapper extends BaseMapper { * 查询地图图层树(关联MS_MAPMODULE_B与MS_MAPLAYER_B) */ @Select(" \ No newline at end of file + diff --git a/frontend/src/components/engEnvironmentData/index.vue b/frontend/src/components/engEnvironmentData/index.vue index f95868b1..77bc1cd0 100644 --- a/frontend/src/components/engEnvironmentData/index.vue +++ b/frontend/src/components/engEnvironmentData/index.vue @@ -1,9 +1,6 @@ \ No newline at end of file + const baseFilters: any[] = [ + { field: 'sttpCode', operator: 'eq', dataType: 'string', value: 'ENG' }, + { field: 'bldsttCcode', operator: 'in', dataType: 'string', value: ['1', '2'] } + ]; + if (baseid.value !== 'all') { + baseFilters.unshift({ field: 'baseId', operator: 'eq', dataType: 'string', value: baseid.value }); + } + + const params1 = { + filter: { + logic: 'and', + filters: [ + ...baseFilters, + { field: 'prsc', operator: 'in', dataType: 'string', value: ['1', '2', '3'] } + ] + } + }; + + const params2 = { + filter: { + logic: 'and', + filters: [ + ...baseFilters, + { field: 'runState', operator: 'eq', dataType: 'number', value: 4 }, + { field: 'dtin', operator: 'eq', dataType: 'number', value: 1 } + ] + } + }; + + const params3 = { + filter: { + logic: 'and', + filters: [ + ...baseFilters, + { field: 'prsc', operator: 'in', dataType: 'string', value: ['1', '2', '3'] }, + { field: 'dtinEnv', operator: 'in', dataType: 'string', value: ['2'] } + ] + } + }; + + try { + dataLoading.value = true; + const [res1, res2, res3] = await Promise.all([ + getVmsstbprptKendoList(params1), + getVmsstbprptKendoList(params2), + getVmsstbprptKendoList(params3) + ]); + + const record = { one: 0, two: 0, three: 0 }; + const responses = [res1, res2, res3]; + responses.forEach((res, index) => { + const total = res?.data?.total ?? 0; + switch (index) { + case 0: + record.one = total; + break; + case 1: + record.two = total; + break; + case 2: + record.three = total; + break; + } + }); + data.value = record; + // debugger + } catch (error) { + console.error('EngEnvironmentData getData error:', error); + } finally { + dataLoading.value = false; + } +}; + +const handleItemClick = (name: string) => { + emit('item-click', { name }); +}; + +watch( + () => JidiSelectEventStore.selectedItem, + newVal => { + if (newVal && newVal.wbsCode) { + baseid.value = newVal.wbsCode; + getData(); + } + }, + { deep: true, immediate: true } +); + diff --git a/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue b/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue index 8d7f6e9f..6b43cfe6 100644 --- a/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue +++ b/frontend/src/modules/alongFishMod/TwoLayers/Yanchengyulei.vue @@ -3,15 +3,22 @@
- - + + + > + + {{ opt.label }} + + @@ -20,21 +27,35 @@ v-model:value="formState.rvcd" placeholder="请选择" style="width: 150px" - :options="lyOptions" @change="handleRvcdChange" - /> + > + + {{ opt.label }} + + - + @@ -57,11 +78,20 @@ - - + +
- + -