diff --git a/backend/src/main/java/com/yfd/platform/config/RedisConfig.java b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java index 7f32bf5d..e5f1f5f9 100644 --- a/backend/src/main/java/com/yfd/platform/config/RedisConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java @@ -61,8 +61,8 @@ public class RedisConfig { RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig() .prefixCacheNameWith("qgc:") .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) - .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer())) - .entryTtl(Duration.ofMinutes(30)); + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer())); +// .entryTtl(Duration.ofMinutes(30)); // Map cacheConfigs = new HashMap<>(); // cacheConfigs.put("dictCache", defaultConfig.entryTtl(Duration.ofHours(6))); 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 9395ae94..3f2de614 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 @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_base.controller; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -50,4 +51,10 @@ public class SdEngMonitorController { public ResponseResult getEngPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(engInfoBHService.getEngPointKendoListCust(dataSourceRequest)); } + + @PostMapping("/rsvrcscdb/GetKendoList") + @Operation(summary = "条件过滤数据列表") + public ResponseResult getRsvrcscdBKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engInfoBHService.getRsvrcscdBKendoList(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java new file mode 100644 index 00000000..c402b4a4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_base/domain/vo/EngRsvrcscdBVo.java @@ -0,0 +1,41 @@ +package com.yfd.platform.qgc_base.domain.vo; + +import lombok.Data; + +import java.util.Date; + +@Data +public class EngRsvrcscdBVo { + + private String id; + + private String rvcd; + + private String rvcdName; + + private String stcd; + + private String ennm; + + private Double srcdis; + + private Double dmhg; + + private Double normz; + + private String recordUser; + + private Date recordTime; + + private String modifyUser; + + private Date modifyTime; + + private Integer isDeleted; + + private Double lgtd; + + private Double lttd; + + private String stlc; +} \ 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 5082c0ee..73934b15 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.EngRsvrcscdBVo; 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; @@ -89,4 +90,6 @@ public interface ISdEngInfoBHService extends IService { DataSourceResult getStbprpDataKendoListCust(DataSourceRequest dataSourceRequest, String tbCode, Boolean ignorePageLimit); DataSourceResult getEngPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getRsvrcscdBKendoList(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 879347e6..47046c92 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.EngRsvrcscdBVo; 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; @@ -2689,10 +2690,10 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "t.STCD"; - case "stnm", "ennm", "titleName" -> "t.STNM"; + case "stnm", "ennm", "titleName" -> "t.ENNM"; case "rvcd" -> "t.RVCD"; case "addvcd" -> "t.ADDVCD"; case "lgtd" -> "t.LGTD"; @@ -2900,9 +2901,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl "rvcdStepSort"; case "rstcdStepSort" -> "rstcdStepSort"; case "baseStepSort" -> "baseStepSort"; - case "ifEngSpecial" -> "ifEngSpecial"; - case "anchoPointState" -> "anchoPointState"; - case "endInstalledType" -> "endInstalledType"; + case "ifEngSpecial" -> "(CASE WHEN elec.configCount > 0 THEN 'true' WHEN elec.configCount IS NULL THEN 'false' ELSE 'false' END)"; + case "anchoPointState" -> "(CASE WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 2 THEN 'large_eng_built' WHEN t.PRSC IN ('1','2') AND t.BLDSTT_CODE = 1 THEN 'large_eng_ubuilt' WHEN t.PRSC IN ('1','2') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'large_eng_nbuilt' WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 2 THEN 'mid_eng_built' WHEN t.PRSC IN ('3') AND t.BLDSTT_CODE = 1 THEN 'mid_eng_ubuilt' WHEN t.PRSC IN ('3') AND (t.BLDSTT_CODE = 0 OR t.BLDSTT_CODE IS NULL) THEN 'mid_eng_nbuilt' END)"; + case "endInstalledType" -> "(CASE WHEN t.PRSC IN ('1','2') THEN 1 WHEN t.PRSC IN ('3') THEN 2 END)"; default -> null; }; } @@ -2928,4 +2929,198 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl getRsvrcscdBKendoList(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(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT ") + .append("r.ID AS id, ") + .append("r.RVCD AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("r.STCD AS stcd, ") + .append("r.ENNM AS ennm, ") + .append("r.SRCDIS AS srcdis, ") + .append("r.DMHG AS dmhg, ") + .append("r.NORMZ AS normz, ") + .append("r.RECORD_USER AS recordUser, ") + .append("r.RECORD_TIME AS recordTime, ") + .append("r.MODIFY_USER AS modifyUser, ") + .append("r.MODIFY_TIME AS modifyTime, ") + .append("r.IS_DELETED AS isDeleted, ") + .append("eng.LGTD AS lgtd, ") + .append("eng.LTTD AS lttd, ") + .append("eng.STLC AS stlc ") + .append("FROM SD_RSVRCSCD_B r ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = r.RVCD ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = r.STCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(r.IS_DELETED, 0) = 0 "); + + String filterSql = buildRsvrcscdBFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StringUtils.hasText(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildRsvrcscdBOrderBySql(dataSourceRequest.getSort())); + + List list = microservicDynamicSQLMapper.pageAllListWithResultType( + page, sql.toString(), paramMap, EngRsvrcscdBVo.class); + result.setData(list); + result.setTotal(page == null ? list.size() : page.getTotal()); + return result; + } + + private String buildRsvrcscdBFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StringUtils.hasText(filter.getField())) { + return buildRsvrcscdBLeafCondition(filter, paramMap, indexHolder); + } + if (filter.getFilters() == null || filter.getFilters().isEmpty()) { + return ""; + } + List childConditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildRsvrcscdBFilterCondition(child, paramMap, indexHolder); + if (StringUtils.hasText(childSql)) { + childConditions.add("(" + childSql + ")"); + } + } + if (childConditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, childConditions); + } + + private String buildRsvrcscdBLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String column = mapRsvrcscdBColumn(filter.getField()); + if (!StringUtils.hasText(column)) { + return ""; + } + String operator = filter.getOperator() == null ? "eq" : filter.getOperator().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 = normalizeFilterValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String key = "rsvrParam" + indexHolder[0]++; + paramMap.put(key, item); + placeholders.add("#{map." + key + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String key = "rsvrParam" + 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 "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 mapRsvrcscdBColumn(String field) { + if (!StringUtils.hasText(field)) { + return null; + } + return switch (field) { + case "id" -> "r.ID"; + case "rvcd" -> "r.RVCD"; + case "rvcdName" -> "rv.RVNM"; + case "stcd" -> "r.STCD"; + case "ennm" -> "r.ENNM"; + case "srcdis" -> "r.SRCDIS"; + case "dmhg" -> "r.DMHG"; + case "normz" -> "r.NORMZ"; + case "lgtd" -> "eng.LGTD"; + case "lttd" -> "eng.LTTD"; + case "stlc" -> "eng.STLC"; + default -> null; + }; + } + + private String buildRsvrcscdBOrderBySql(List sortList) { + if (sortList == null || sortList.isEmpty()) { + return " ORDER BY r.RVCD ASC, r.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sortDescriptor : sortList) { + if (sortDescriptor == null || !StringUtils.hasText(sortDescriptor.getField())) { + continue; + } + String column = mapRsvrcscdBColumn(sortDescriptor.getField()); + if (!StringUtils.hasText(column)) { + continue; + } + String dir = "desc".equalsIgnoreCase(sortDescriptor.getDir()) || "des".equalsIgnoreCase(sortDescriptor.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + dir + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY r.RVCD ASC, r.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java index 4399f5e5..3534edde 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/controller/FishDraftDataController.java @@ -60,6 +60,8 @@ import java.util.*; @Slf4j public class FishDraftDataController { + private static final int IN_QUERY_BATCH_SIZE = 900; + @Resource private IFishDraftDataService fishDraftDataService; @@ -368,11 +370,10 @@ public class FishDraftDataController { @PostMapping("/batchApproveByApprovalId") @Operation(summary = "根据审批批次全部审批通过") public ResponseResult batchApproveByApprovalId(@RequestBody BatchApproveRequest request) { - if (request.getApprovalIds().isEmpty()) { + if (request.getApprovalIds() == null || request.getApprovalIds().isEmpty()) { return ResponseResult.error("请选择审批批次"); } - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.batchApprove(ids, request.getApproveComment()); return result ? ResponseResult.success("审批通过") : ResponseResult.error("审批失败"); } @@ -388,8 +389,7 @@ public class FishDraftDataController { @Operation(summary = "批量驳回") public ResponseResult batchRejectFull(@RequestBody BatchRejectRequest request) { if (request.getApprovalIds() != null && !request.getApprovalIds().isEmpty()) { - List draft = fishDraftDataService.list(new LambdaQueryWrapper().eq(FishDraftData::getDeletedFlag, 0).in(FishDraftData::getApprovalId, request.getApprovalIds()).eq(FishDraftData::getStatus, "PENDING").select(FishDraftData::getId)); - List ids = draft.stream().map(FishDraftData::getId).toList(); + List ids = listDraftIdsByApprovalIdsAndStatus(request.getApprovalIds(), "PENDING"); boolean result = fishDraftDataService.rejectBatch(ids, request.getRejectReason()); return result ? ResponseResult.success("驳回成功") : ResponseResult.error("驳回失败"); } @@ -429,6 +429,47 @@ public class FishDraftDataController { return result ? ResponseResult.success("修改成功") : ResponseResult.error("修改失败"); } + private List listDraftIdsByApprovalIdsAndStatus(List approvalIds, String status) { + List normalizedApprovalIds = normalizeBatchValues(approvalIds); + if (normalizedApprovalIds.isEmpty()) { + return Collections.emptyList(); + } + List ids = new ArrayList<>(); + for (List batchApprovalIds : splitList(normalizedApprovalIds, IN_QUERY_BATCH_SIZE)) { + List draft = fishDraftDataService.list(new LambdaQueryWrapper() + .eq(FishDraftData::getDeletedFlag, 0) + .in(FishDraftData::getApprovalId, batchApprovalIds) + .eq(FishDraftData::getStatus, status) + .select(FishDraftData::getId)); + ids.addAll(draft.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return ids; + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } + @PostMapping("/delete") @Operation(summary = "删除过鱼数据") public ResponseResult delete(@RequestParam String id) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java index 5a150f58..45c47f12 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_data/service/impl/FishDraftDataServiceImpl.java @@ -2,7 +2,6 @@ package com.yfd.platform.qgc_data.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.common.DataSourceLoadOptionsBase; @@ -36,6 +35,9 @@ import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; import java.util.*; @@ -48,6 +50,8 @@ import java.util.*; @Slf4j public class FishDraftDataServiceImpl extends ServiceImpl implements IFishDraftDataService { + private static final int IN_QUERY_BATCH_SIZE = 200; + @Resource private FishDraftDataMapper fishDraftDataMapper; @@ -85,6 +89,9 @@ public class FishDraftDataServiceImpl extends ServiceImpl queryPageList(DataSourceRequest dataSourceRequest) { Page page = KendoUtil.getPage(dataSourceRequest); @@ -254,16 +261,15 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { - long count = this.count(new LambdaQueryWrapper().in(FishDraftData::getId, ids).eq(FishDraftData::getLockFlag, 1)); + long count = countByIdsAndLockFlag(ids, 1); if(count > 0){ return false; } - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.set(FishDraftData::getDeletedFlag, 1); String userId = SecurityUtils.getUserId(); - updateWrapper.set(FishDraftData::getDeletedBy,userId ); - return this.update(updateWrapper); + return updateByIdsInBatches(ids, entity -> { + entity.setDeletedFlag(1); + entity.setDeletedBy(userId); + }); } @Override @@ -295,12 +301,13 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids) { if (ids == null || ids.isEmpty()) { return false; } String operatorId = SecurityUtils.getUserId(); + Map originalStatusMap = new HashMap<>(); + List succeededIds = new ArrayList<>(); ApprovalMain approvalMain = new ApprovalMain(); approvalMain.setApprovalNo("APR" + System.currentTimeMillis()); @@ -311,19 +318,46 @@ public class FishDraftDataServiceImpl extends ServiceImpl { + approvalMainService.save(approvalMain); + return true; + }); - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, ids); - updateWrapper.eq(FishDraftData::getLockFlag, 0); - updateWrapper.set(FishDraftData::getApprovalId, approvalMain.getId()); - updateWrapper.set(FishDraftData::getStatus, "PENDING"); - updateWrapper.set(FishDraftData::getSubmitTime, new Date()); - this.update(updateWrapper); + List unlockedDrafts = listDraftsByIdsAndLockFlag(ids, 0); + for (FishDraftData draft : unlockedDrafts) { + originalStatusMap.put(draft.getId(), draft.getStatus()); + } + Date submitTime = new Date(); + for (List batchDrafts : splitList(unlockedDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + } + updateByIdsBatch(batchIds, entity -> { + entity.setApprovalId(approvalMain.getId()); + entity.setStatus("PENDING"); + entity.setSubmitTime(submitTime); + }); + return true; + }); + for (FishDraftData batchDraft : batchDrafts) { + succeededIds.add(batchDraft.getId()); + } + } - approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); - return true; + executeInNewTransaction(() -> { + approvalLogService.logSubmit(approvalMain.getId(), operatorId, "批量提交草稿,共" + ids.size() + "条"); + return true; + }); + return true; + } catch (Exception e) { + log.error("批量提交草稿失败", e); + rollbackSubmittedDrafts(approvalMain.getId(), succeededIds, originalStatusMap, e); + return false; + } } private void setUserDataScope(ApprovalMain approvalMain) { @@ -413,7 +447,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids, String approveComment) { if (ids == null || ids.isEmpty()) { return false; @@ -421,45 +454,60 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); - Set processedApprovalIds = new HashSet<>(); - List validIds = new ArrayList<>(); - List fpssRList = new ArrayList<>(); - + List dataList = listByIdsInBatches(ids); + Map> approvalDraftMap = new LinkedHashMap<>(); for (FishDraftData fishDraftData : dataList) { if ("PENDING".equals(fishDraftData.getStatus())) { - validIds.add(fishDraftData.getId()); - if (fishDraftData.getApprovalId() != null) { - processedApprovalIds.add(fishDraftData.getApprovalId()); - } - SdFpssR fpssR = convertToSdFpssR(fishDraftData, operatorId); - fpssRList.add(fpssR); + String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__"); + approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData); } } - if (!validIds.isEmpty()) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "APPROVED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); - boolean b = sdFpssRService.saveOrUpdateBatch(fpssRList); - log.info("=======================插入数据条数======================="+fpssRList.size()); - for (String approvalId : processedApprovalIds) { - ApprovalMain approvalMain = approvalMainService.getById(approvalId); - approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment); - if (approvalMain != null) { - approvalMain.setStatus("APPROVED"); - approvalMain.setApproverId(operatorId); - approvalMain.setApproveTime(now); - approvalMain.setRemark(approveComment); - approvalMainService.updateById(approvalMain); + try { + for (Map.Entry> entry : approvalDraftMap.entrySet()) { + String approvalId = entry.getKey(); + List approvalDrafts = entry.getValue(); + for (List batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + List fpssRList = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + fpssRList.add(convertToSdFpssR(batchDraft, operatorId)); + } + updateByIdsBatch(batchIds, entity -> { + entity.setStatus("APPROVED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); + boolean saved = sdFpssRService.saveOrUpdateBatch(fpssRList, IN_QUERY_BATCH_SIZE); + if (!saved) { + throw new RuntimeException("保存正式表失败"); + } + log.info("=======================插入数据条数======================={}", fpssRList.size()); + return true; + }); + } + if (!"__NO_APPROVAL__".equals(approvalId)) { + executeInNewTransaction(() -> { + ApprovalMain approvalMain = approvalMainService.getById(approvalId); + approvalLogService.logApprove(approvalId, SecurityUtils.getUserId(), approveComment); + if (approvalMain != null) { + approvalMain.setStatus("APPROVED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(approveComment); + approvalMainService.updateById(approvalMain); + } + return true; + }); } } + return true; + } catch (Exception e) { + log.error("批量审批失败", e); + return false; } - - return true; } private SdFpssR convertToSdFpssR(FishDraftData draft, String operatorId) { @@ -537,7 +585,6 @@ public class FishDraftDataServiceImpl extends ServiceImpl ids, String rejectReason) { if (ids == null || ids.isEmpty()) { return false; @@ -548,41 +595,53 @@ public class FishDraftDataServiceImpl extends ServiceImpl dataList = this.listByIds(ids); - Set processedApprovalIds = new HashSet<>(); - List validIds = new ArrayList<>(); - + List dataList = listByIdsInBatches(ids); + Map> approvalDraftMap = new LinkedHashMap<>(); for (FishDraftData fishDraftData : dataList) { if ("PENDING".equals(fishDraftData.getStatus())) { - validIds.add(fishDraftData.getId()); - if (fishDraftData.getApprovalId() != null) { - processedApprovalIds.add(fishDraftData.getApprovalId()); - } + String approvalId = StrUtil.blankToDefault(fishDraftData.getApprovalId(), "__NO_APPROVAL__"); + approvalDraftMap.computeIfAbsent(approvalId, key -> new ArrayList<>()).add(fishDraftData); } } - if (!validIds.isEmpty()) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.in(FishDraftData::getId, validIds); - updateWrapper.set(FishDraftData::getStatus, "REJECTED"); - updateWrapper.set(FishDraftData::getApproveTime, now); - updateWrapper.set(FishDraftData::getUpdatedBy, operatorId); - this.update(updateWrapper); - - for (String approvalId : processedApprovalIds) { - approvalLogService.logReject(approvalId, operatorId, rejectReason); - ApprovalMain approvalMain = approvalMainService.getById(approvalId); - if (approvalMain != null) { - approvalMain.setStatus("REJECTED"); - approvalMain.setApproverId(operatorId); - approvalMain.setApproveTime(now); - approvalMain.setRemark(rejectReason); - approvalMainService.updateById(approvalMain); + try { + for (Map.Entry> entry : approvalDraftMap.entrySet()) { + String approvalId = entry.getKey(); + List approvalDrafts = entry.getValue(); + for (List batchDrafts : splitList(approvalDrafts, IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List batchIds = new ArrayList<>(); + for (FishDraftData batchDraft : batchDrafts) { + batchIds.add(batchDraft.getId()); + } + updateByIdsBatch(batchIds, entity -> { + entity.setStatus("REJECTED"); + entity.setApproveTime(now); + entity.setUpdatedBy(operatorId); + }); + return true; + }); + } + if (!"__NO_APPROVAL__".equals(approvalId)) { + executeInNewTransaction(() -> { + approvalLogService.logReject(approvalId, operatorId, rejectReason); + ApprovalMain approvalMain = approvalMainService.getById(approvalId); + if (approvalMain != null) { + approvalMain.setStatus("REJECTED"); + approvalMain.setApproverId(operatorId); + approvalMain.setApproveTime(now); + approvalMain.setRemark(rejectReason); + approvalMainService.updateById(approvalMain); + } + return true; + }); } } + return true; + } catch (Exception e) { + log.error("批量驳回失败", e); + return false; } - - return true; } @Override @@ -679,4 +738,144 @@ public class FishDraftDataServiceImpl extends ServiceImpl listByIdsInBatches(List ids) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + result.addAll(this.list(new LambdaQueryWrapper().in(FishDraftData::getId, batchIds))); + } + return result; + } + + private long countByIdsAndLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return 0L; + } + long total = 0L; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + total += this.count(new LambdaQueryWrapper() + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + } + return total; + } + + private List listIdsByLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + List records = this.list(new LambdaQueryWrapper() + .select(FishDraftData::getId) + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag)); + result.addAll(records.stream().map(FishDraftData::getId).filter(StrUtil::isNotBlank).toList()); + } + return result; + } + + private List listDraftsByIdsAndLockFlag(List ids, Integer lockFlag) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return Collections.emptyList(); + } + List result = new ArrayList<>(); + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + result.addAll(this.list(new LambdaQueryWrapper() + .in(FishDraftData::getId, batchIds) + .eq(FishDraftData::getLockFlag, lockFlag))); + } + return result; + } + + private boolean updateByIdsBatch(List ids, + java.util.function.Consumer entityCustomizer) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return false; + } + List batchEntities = new ArrayList<>(normalizedIds.size()); + for (String batchId : normalizedIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entityCustomizer.accept(entity); + batchEntities.add(entity); + } + return this.updateBatchById(batchEntities, IN_QUERY_BATCH_SIZE); + } + + private boolean updateByIdsInBatches(List ids, + java.util.function.Consumer entityCustomizer) { + List normalizedIds = normalizeBatchValues(ids); + if (normalizedIds.isEmpty()) { + return false; + } + boolean updated = false; + for (List batchIds : splitList(normalizedIds, IN_QUERY_BATCH_SIZE)) { + updated = updateByIdsBatch(batchIds, entityCustomizer) || updated; + } + return updated; + } + + private void rollbackSubmittedDrafts(String approvalId, + List succeededIds, + Map originalStatusMap, + Exception originalException) { + try { + for (List batchIds : splitList(normalizeBatchValues(succeededIds), IN_QUERY_BATCH_SIZE)) { + executeInNewTransaction(() -> { + List rollbackEntities = new ArrayList<>(); + for (String batchId : batchIds) { + FishDraftData entity = new FishDraftData(); + entity.setId(batchId); + entity.setApprovalId(null); + entity.setSubmitTime(null); + entity.setStatus(originalStatusMap.get(batchId)); + rollbackEntities.add(entity); + } + return this.updateBatchById(rollbackEntities, IN_QUERY_BATCH_SIZE); + }); + } + executeInNewTransaction(() -> approvalMainService.removeById(approvalId)); + } catch (Exception rollbackException) { + log.error("批量提交草稿回退失败,原始异常: {}", originalException.getMessage(), rollbackException); + } + } + + private T executeInNewTransaction(java.util.function.Supplier action) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + return transactionTemplate.execute(status -> action.get()); + } + + private List normalizeBatchValues(List values) { + if (values == null || values.isEmpty()) { + return Collections.emptyList(); + } + LinkedHashSet normalized = new LinkedHashSet<>(); + for (String value : values) { + if (StrUtil.isNotBlank(value)) { + normalized.add(value.trim()); + } + } + return new ArrayList<>(normalized); + } + + private List> splitList(List source, int batchSize) { + if (source == null || source.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + for (int i = 0; i < source.size(); i += batchSize) { + result.add(source.subList(i, Math.min(source.size(), i + batchSize))); + } + return result; + } } 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 962d0667..1773f5d0 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 @@ -181,4 +181,10 @@ public class EngEqDataController { StcdInfoVo result = engEqDataService.getStInfoByStcd(stcd); return ResponseResult.successData(result); } + + @PostMapping("/eqds/GetKendoListCust") + @Operation(summary = "生态流量泄放设施描点") + public ResponseResult getEqdsKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(engEqDataService.getEqdsKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java new file mode 100644 index 00000000..043eb2c0 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_eng/eq/entity/vo/EngEqdsVo.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_eng.eq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "生态流量泄放设施描点VO") +public class EngEqdsVo { + + @Schema(description = "设施编码") + private String stcd; + + @Schema(description = "设施名称") + private String stnm; + + @Schema(description = "电站编码") + private String rstcd; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "生态流量泄放方式") + private Integer eqtp; + + @Schema(description = "孔口尺寸") + private String flksz; + + @Schema(description = "进水口地板高程") + private BigDecimal jskdbgc; + + @Schema(description = "出水口地板高程") + private BigDecimal cskdbgc; + + @Schema(description = "死水位时保证流量") + private BigDecimal ddzgq; + + @Schema(description = "基荷发电工况") + private BigDecimal jhfdgk; + + @Schema(description = "最大泄放流量") + private String flkq; + + @Schema(description = "基地") + private String baseId; + + @Schema(description = "流域") + private String rvcd; + + @Schema(description = "行政区") + private String addvcd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "工程类型") + private String sttp; + + @Schema(description = "工程类型名称") + private String sttpName; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "设施类型") + private String sttpCode; + + @Schema(description = "图例编码") + private String anchoPointState; + + @Schema(description = "弹窗名称") + private String titleName; + + @Schema(description = "生态流量限值") + private BigDecimal qecLimit; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "建设状态 0=规划,1=在建,2=已建") + private String bldsttCode; + + @Schema(description = "沿程排序") + private Integer siteStepSort; + + @Schema(description = "流域排序") + private Integer rvcdStepSort; + + @Schema(description = "电站排序") + private Integer rstcdStepSort; + + @Schema(description = "基地排序") + private Integer baseStepSort; +} \ 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 f2fbf60c..260c2bba 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 @@ -7,6 +7,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqBaseVmsstbprptVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqdsVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqHourIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqIntervalVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo; @@ -65,4 +66,6 @@ public interface EngEqDataService { DataSourceResult getDefaultYear(DataSourceRequest dataSourceRequest); StcdInfoVo getStInfoByStcd(String stcd); + + DataSourceResult getEqdsKendoListCust(DataSourceRequest dataSourceRequest); } 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 ce231794..3ffbb034 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 @@ -18,6 +18,7 @@ import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDrtpDataVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqDayIntervalVo; +import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqdsVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitQueryVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngEqLimitVo; import com.yfd.platform.qgc_eng.eq.entity.vo.EngFidVo; @@ -36,6 +37,7 @@ 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.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -5496,6 +5498,7 @@ public class EngEqDataServiceImpl implements EngEqDataService { case "bldsttCcode" -> "t.bldsttCcode"; case "dtinEnv" -> "t.dtinEnv"; case "DTIN" -> "t.dtin"; + case "dtin" -> "t.dtin"; case "runState" -> "t.runState"; case "baseStepSort" -> "NVL(t.baseStepSort, 999999)"; case "rvcdStepSort" -> "NVL(t.rvcdStepSort, 999999)"; @@ -5889,4 +5892,123 @@ public class EngEqDataServiceImpl implements EngEqDataService { } return dataSourceResult; } + + @Override + public DataSourceResult getEqdsKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("a.STCD AS stcd, ") + .append("a.STNM AS stnm, ") + .append("a.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("a.STTP AS sttp, ") + .append("a.BASE_ID AS baseId, ") + .append("a.LGTD AS lgtd, ") + .append("a.LTTD AS lttd, ") + .append("a.ELEV AS dtmel, ") + .append("a.BLDSTT_CODE AS bldsttCode, ") +// .append("a.RVCD AS rvcd, ") +// .append("a.ADDVCD AS addvcd, ") + .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("FROM SD_EQ_B_H a ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = a.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 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 = a.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 = a.STCD ") + .append("WHERE NVL(a.IS_DELETED, 0) = 0 ") + .append("AND NVL(a.USFL, 1) = 1 ") + .append("AND a.LGTD IS NOT NULL ") + .append("AND a.LTTD IS NOT NULL ") + .append("AND a.STTP IN (SELECT STTP_CODE FROM SD_STTP_B WHERE DESCRIPTION = 'EQ') ") + .append("AND a.RSTCD IS NOT NULL ") + .append("ORDER BY NVL(siteSort.SORT, 999999), NVL(along.ORDER_INDEX, 999999), NVL(rstSort.SORT, 999999), NVL(hb.ORDER_INDEX, 999999), a.STNM "); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List eqdsVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EngEqdsVo.class); + + List resultList = new ArrayList<>(); + for (EngEqdsVo eqdsVo : eqdsVoList) { + String sttpCode = eqdsVo.getSttp(); + List sttpCodeSplit = StrUtil.split(sttpCode, "_"); + eqdsVo.setSttpMap(sttpCodeSplit.get(0)); + eqdsVo.setEqtp(Integer.valueOf(sttpCodeSplit.get(1))); + eqdsVo.setSttp(sttpCodeSplit.get(0)); + eqdsVo.setTitleName(eqdsVo.getStnm()); + + String bldsttCode = eqdsVo.getBldsttCode(); + if ("2".equals(bldsttCode)) { + eqdsVo.setAnchoPointState(sttpCode); + } else { + eqdsVo.setAnchoPointState(sttpCode + "_incomplete"); + } + + eqdsVo.setSttpCode("EQ"); + + String rstcd = eqdsVo.getRstcd(); + if (rstcd != null && rstcd.contains(",")) { + EngEqdsVo eqdsVoNew = new EngEqdsVo(); + eqdsVoNew.setStcd(eqdsVo.getStcd()); + eqdsVoNew.setStnm(eqdsVo.getStnm()); + eqdsVoNew.setSttp(eqdsVo.getSttp()); + eqdsVoNew.setSttpMap(eqdsVo.getSttpMap()); + eqdsVoNew.setSttpCode(eqdsVo.getSttpCode()); + eqdsVoNew.setEqtp(eqdsVo.getEqtp()); + eqdsVoNew.setAnchoPointState(eqdsVo.getAnchoPointState()); + eqdsVoNew.setTitleName(eqdsVo.getTitleName()); + eqdsVoNew.setLgtd(eqdsVo.getLgtd()); + eqdsVoNew.setLttd(eqdsVo.getLttd()); + eqdsVoNew.setDtmel(eqdsVo.getDtmel()); + eqdsVoNew.setBaseId(eqdsVo.getBaseId()); + eqdsVoNew.setBldsttCode(eqdsVo.getBldsttCode()); + + List stcdSplit = StrUtil.split(rstcd, ','); + eqdsVo.setRstcd(stcdSplit.get(0)); + eqdsVoNew.setRstcd(stcdSplit.get(1)); + + String ennm = eqdsVo.getEnnm(); + if (ennm != null && ennm.contains(",")) { + List ennmSplit = StrUtil.split(ennm, ','); + eqdsVo.setEnnm(ennmSplit.get(0)); + eqdsVoNew.setEnnm(ennmSplit.get(1)); + } + resultList.add(eqdsVoNew); + } + resultList.add(eqdsVo); + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + EngEqdsVo::getStcd, + EngEqdsVo::getLgtd, + EngEqdsVo::getLttd, + EngEqdsVo::getAnchoPointState, + EngEqdsVo::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/fb/service/impl/FbStationServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fb/service/impl/FbStationServiceImpl.java index 7963c7c4..1712f20c 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 @@ -4643,8 +4643,8 @@ public class FbStationServiceImpl implements FbStationService { .append(" SELECT t.RSTCD AS stcd, COUNT(1) AS lcjStatus ") .append(" FROM SD_ENGFR_R t ") .append(" INNER JOIN SD_RPIMNFISH_R t1 ON t.ID = t1.RPIMN_ID ") - .append(" WHERE (t.TASK_STATUS IS NULL OR t.TASK_STATUS = 'Approved') ") - .append(" AND NVL(t.IS_DELETED, 0) = 0 AND NVL(t1.IS_DELETED, 0) = 0 ") + .append(" WHERE 1=1 ") + .append(" AND t.IS_DELETED = 0 AND t1.IS_DELETED = 0 ") .append(" AND t.TM BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE ") .append(" GROUP BY t.RSTCD ") .append(") b ON a.STCD = b.stcd ") @@ -4654,21 +4654,32 @@ public class FbStationServiceImpl implements FbStationService { Map paramMap = new HashMap<>(); - if (StrUtil.isNotEmpty(sttp)) { - sql.append(" AND a.STTP = :sttp "); - paramMap.put("sttp", sttp); - } - if (StrUtil.isNotEmpty(rstcd)) { - sql.append(" AND a.RSTCD LIKE '%' || :rstcd || '%' "); - paramMap.put("rstcd", rstcd); - } - if (StrUtil.isNotEmpty(bldsttCcode)) { - sql.append(" AND a.BLDSTT_CODE = :bldsttCcode "); - paramMap.put("bldsttCcode", Integer.parseInt(bldsttCcode)); +// if (StrUtil.isNotEmpty(sttp)) { +// sql.append(" AND a.STTP = #{sttp} "); +// paramMap.put("sttp", sttp); +// } +// if (StrUtil.isNotEmpty(rstcd)) { +// sql.append(" AND a.RSTCD LIKE '%' || #{rstcd} || '%' "); +// paramMap.put("rstcd", rstcd); +// } +// if (StrUtil.isNotEmpty(bldsttCcode)) { +// sql.append(" AND a.BLDSTT_CODE = #{bldsttCcode} "); +// paramMap.put("bldsttCcode", Integer.parseInt(bldsttCcode)); +// } + + + + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapWeFvColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); } sql.append(" ORDER BY NVL(siteSort.SORT, 999999) ASC "); - Page page = devRequest == null ? null : QgcQueryWrapperUtil.buildPage(devRequest, devRequest.getSkip(), devRequest.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FbTracingPointVo.class); @@ -4686,6 +4697,21 @@ public class FbStationServiceImpl implements FbStationService { return dataSourceResult; } + private String mapWeFvColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "rstcd" -> "a.RSTCD"; + case "stcd" -> "a.STCD"; + case "sttp" -> "a.STTP"; + case "bldsttccode" -> "a.BLDSTT_CODE"; + case "lgtd" -> "a.LGTD"; + default -> null; + }; + } + + private List getPointLegend(List voList) { for (FbTracingPointVo pointVo : voList) { Integer bldstt = pointVo.getBldstt(); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java index 8a5ee63d..8c303c5e 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/controller/FhHabitatController.java @@ -71,4 +71,16 @@ public class FhHabitatController { public ResponseResult getStTbYsBVoKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(fhHabitatService.getStTbYsBVoKendoListCust(dataSourceRequest)); } + + @PostMapping("/fhvap/GetKendoListCust") + @Operation(summary = "栖息地/珍稀植物园/动物救助站描点") + public ResponseResult getFhvapKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getFhvapKendoListCust(dataSourceRequest)); + } + + @PostMapping("/fhvap/fhPoint/GetKendoListCust") + @Operation(summary = "栖息地关联站点描点") + public ResponseResult getFhPoint(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fhHabitatService.getFhPoint(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java new file mode 100644 index 00000000..9be9c376 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhHaVapVo.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_env.fh.entity.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class FhHaVapVo { + private String baseId; + private String baseName; + private String stcd; + private String stnm; + private String sttp; + private String sttpCode; + private String sttpMap; + private String anchoPointState; + private String rstcd; + private String ennm; + private String rvcd; + private String rvcdName; + private BigDecimal lgtd; + private BigDecimal lttd; + private String bldsttCcode; + private BigDecimal dtmel; + private Integer dtin; + private Integer distance; + private String titleName; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java new file mode 100644 index 00000000..6beebf5f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/entity/vo/FhPointVo.java @@ -0,0 +1,67 @@ +package com.yfd.platform.qgc_env.fh.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@Accessors(chain = true) +@Schema(description = "栖息地关联站点描点") +public class FhPointVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "所属栖息地编码") + private String fhstcd; + + @Schema(description = "站码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "所属电站名称") + private String ennm; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "基地名称") + private String baseName; + + @Schema(description = "所属流域编码") + private String rvcd; + + @Schema(description = "所属流域名称") + private String rvcdName; + + @Schema(description = "所属电站编码") + private String rstcd; + + @Schema(description = "所属站类编码") + private String sttpCode; + + @Schema(description = "基面高程") + private BigDecimal dtmel; + + @Schema(description = "是否接入") + private Integer dtin; + + @Schema(description = "建设状态分类") + private String bldsttCcode; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "出入库标识(1 入库水温, 2 出库水温, 3 非出入库水温)") + private Integer ioType; +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java index 267ff509..f279b5a0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/FhHabitatService.java @@ -5,6 +5,8 @@ import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhPointVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; public interface FhHabitatService { @@ -24,4 +26,8 @@ public interface FhHabitatService { FhBaseInfoVo getStcdInfo(String stcd); DataSourceResult getStTbYsBVoKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhvapKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhPoint(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java index cef364cf..9156d14b 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fh/service/impl/FhHabitatServiceImpl.java @@ -16,11 +16,14 @@ import com.yfd.platform.common.exception.BizException; import com.yfd.platform.qgc_env.fh.entity.ao.FhDefaultAo; import com.yfd.platform.qgc_env.fh.entity.vo.FhBaseInfoVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhDefaultVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhHaVapVo; +import com.yfd.platform.qgc_env.fh.entity.vo.FhPointVo; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhMsstbprptVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhSdriverdayVo; import com.yfd.platform.qgc_env.fh.entity.vo.FhSdrvwtsVo; import com.yfd.platform.qgc_env.fh.service.FhHabitatService; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.wq.entity.vo.StTbYsVo; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -1920,4 +1923,233 @@ public class FhHabitatServiceImpl implements FhHabitatService { } return sql.toString(); } + + @Override + public DataSourceResult getFhvapKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("t.STCD AS stcd, ") + .append("t.STNM AS stnm, ") + .append("t.STTP_CODE AS sttp, ") + .append("t.STTP_CODE AS sttpCode, ") + .append("t.STTP_CODE AS sttpMap, ") + .append("t.STTP_CODE AS anchoPointState, ") + .append("t.RSTCD AS rstcd, ") + .append("eng.ENNM AS ennm, ") + .append("NVL(t.HBRVCD, eng.HBRVCD) AS rvcd, ") + .append("t.LGTD AS lgtd, ") + .append("t.LTTD AS lttd, ") + .append("t.BLDSTT_CCODE AS bldsttCcode, ") + .append("t.ELEV AS dtmel, ") + .append("t.DTIN AS dtin ") + .append("FROM ( ") + .append(" SELECT STCD, STNM, 'FH' AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLPRD AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_FHBT_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(" UNION ALL ") + .append(" SELECT STCD, STNM, STTP AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLDSTT_CODE AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_VA_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(" UNION ALL ") + .append(" SELECT STCD, STNM, STTP AS STTP_CODE, RSTCD, BASE_ID, HBRVCD, LGTD, LTTD, BLDSTT_CODE AS BLDSTT_CCODE, ELEV, DTIN ") + .append(" FROM SD_VP_B_H WHERE NVL(IS_DELETED, 0) = 0 AND USFL = 1 ") + .append(") 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 = NVL(t.BASE_ID, eng.BASE_ID) AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("WHERE t.LGTD IS NOT NULL AND t.LTTD IS NOT NULL "); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapWeFvColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + Page page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List vaVpList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhHaVapVo.class); + + for (FhHaVapVo vo : vaVpList) { + String bldsttCcode = vo.getBldsttCcode(); + if (!"2".equals(bldsttCcode)) { + if ("VP".equals(vo.getSttp())) { + vo.setAnchoPointState("VP_INCOMPLETE"); + } else if ("VA".equals(vo.getSttp())) { + vo.setAnchoPointState("VA_INCOMPLETE"); + } + } + vo.setTitleName(vo.getStnm()); + vo.setSttpCode(vo.getSttp()); + } + + SiteAvoidanceUtils.calcSiteMapLev(vaVpList, + FhHaVapVo::getStcd, + FhHaVapVo::getLgtd, + FhHaVapVo::getLttd, + FhHaVapVo::getAnchoPointState, + FhHaVapVo::setDistance); + + dataSourceResult.setData(vaVpList); + dataSourceResult.setTotal(page == null ? vaVpList.size() : page.getTotal()); + return dataSourceResult; + } + + @Override + public DataSourceResult getFhPoint(DataSourceRequest dataSourceRequest) { + DataSourceResult result = new DataSourceResult<>(); + result.setAggregates(new HashMap<>()); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); + Map paramMap = new HashMap<>(); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ") + .append("t.fhstcd AS fhstcd, ") + .append("t.stcd AS stcd, ") + .append("t.stnm AS stnm, ") + .append("eng.ENNM AS ennm, ") + .append("t.lgtd AS lgtd, ") + .append("t.lttd AS lttd, ") + .append("t.baseId AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("t.rvcd AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("t.rstcd AS rstcd, ") + .append("t.sttpCode AS sttpCode, ") + .append("t.dtmel AS dtmel, ") + .append("t.dtin AS dtin, ") + .append("t.bldsttCcode AS bldsttCcode, ") + .append("t.ioType AS ioType ") + .append("FROM (") + .append("SELECT fh.STCD AS fhstcd, wq.STCD AS stcd, wq.STNM AS stnm, ") + .append(" wq.LGTD AS lgtd, wq.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" null AS rvcd, wq.RSTCD AS rstcd, ") + .append(" 'WQ' AS sttpCode, wq.ELEV AS dtmel, wq.DTIN AS dtin, ") + .append(" TO_CHAR(wq.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_WQ_B_H wq ON fh.STCD = wq.FHSTCD ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(wq.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND wq.LGTD IS NOT NULL ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, wt.STCD AS stcd, wt.STNM AS stnm, ") + .append(" wt.LGTD AS lgtd, wt.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(fh.RVCD, engWt.RVCD) AS rvcd, wt.RSTCD AS rstcd, ") + .append(" 'WTRV' AS sttpCode, wt.ELEV AS dtmel, wt.DTIN AS dtin, ") + .append(" TO_CHAR(wt.BLDSTT_CODE) AS bldsttCcode, ") + .append(" CASE WHEN wt.WT_TYPE = 'IWT' THEN 1 ") + .append(" WHEN wt.WT_TYPE = 'DWT' THEN 2 ") + .append(" ELSE 3 END AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_WT_B_H wt ON fh.STCD = wt.FHSTCD ") + .append("LEFT JOIN SD_ENGINFO_B_H engWt ON engWt.STCD = wt.RSTCD AND NVL(engWt.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(wt.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND wt.LGTD IS NOT NULL ") + .append(" AND wt.STTP = 'WTRV' ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, rv.STCD AS stcd, rv.STNM AS stnm, ") + .append(" rv.LGTD AS lgtd, rv.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(fh.RVCD, engRv.RVCD) AS rvcd, rv.RSTCD AS rstcd, ") + .append(" 'ZQ' AS sttpCode, rv.ELEV AS dtmel, rv.DTIN AS dtin, ") + .append(" TO_CHAR(rv.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_RIVER_B_H rv ON fh.STCD = rv.FHSTCD ") + .append("LEFT JOIN SD_ENGINFO_B_H engRv ON engRv.STCD = rv.RSTCD AND NVL(engRv.IS_DELETED, 0) = 0 ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND NVL(rv.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND rv.LGTD IS NOT NULL ") + .append(" AND rv.STTP = 'ZQ' ") + .append("UNION ALL ") + .append("SELECT fh.STCD AS fhstcd, vd.STCD AS stcd, vd.STNM AS stnm, ") + .append(" vd.LGTD AS lgtd, vd.LTTD AS lttd, fh.BASE_ID AS baseId, ") + .append(" NVL(vd.RVCD, fh.RVCD) AS rvcd, vd.RSTCD AS rstcd, ") + .append(" 'VD' AS sttpCode, vd.ELEV AS dtmel, vd.DTIN AS dtin, ") + .append(" TO_CHAR(vd.BLDSTT_CODE) AS bldsttCcode, CAST(NULL AS NUMBER) AS ioType ") + .append("FROM SD_FHBT_B_H fh ") + .append("INNER JOIN SD_VDINFO_B vd ON fh.STCD = vd.FHSTCD ") + .append("WHERE NVL(fh.IS_DELETED, 0) = 0 ") + .append(" AND fh.BASE_ID <> 'other' ") + .append(" AND vd.LGTD IS NOT NULL ") + .append(") 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 = t.baseId AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = t.rvcd ") + .append("WHERE 1 = 1 "); + + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapFhPointColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } + sql.append("ORDER BY t.fhstcd, t.sttpCode, t.stcd"); + + List list = microservicDynamicSQLMapper.getAllListWithResultType(sql.toString(), paramMap, FhPointVo.class); + for (FhPointVo vo : list) { + String sttpCode = StrUtil.blankToDefault(vo.getSttpCode(), ""); + if ("WQ".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_WQ"); + } else if ("WTRV".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_WTRV"); + } else if ("ZQ".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_ZQ"); + } else if ("VD".equalsIgnoreCase(sttpCode)) { + vo.setAnchoPointState("FH_VD"); + } + } + result.setData(list); + result.setTotal((long) list.size()); + return result; + } + + private String mapWeFvColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "sttpcode" -> "t.STTP_CODE"; + case "lgtd" -> "t.lgtd"; + default -> null; + }; + } + + private String mapFhPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "fhstcd" -> "t.fhstcd"; + case "stcd" -> "t.stcd"; + case "stnm" -> "t.stnm"; + case "ennm" -> "eng.ENNM"; + case "baseid" -> "t.baseId"; + case "basename" -> "hb.BASENAME"; + case "rvcd" -> "t.rvcd"; + case "rvcdname" -> "rv.RVNM"; + case "rstcd" -> "t.rstcd"; + case "sttpcode" -> "t.sttpCode"; + case "dtin" -> "t.dtin"; + case "bldsttccode" -> "t.bldsttCcode"; + case "lgtd" -> "t.lgtd"; + case "lttd" -> "t.lttd"; + default -> null; + }; + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java index 25fb7bb6..21dedacf 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/controller/FishPassageController.java @@ -106,6 +106,12 @@ public class FishPassageController { return ResponseResult.successData(fpBuildService.getStInfoByStcd(stcd)); } + @PostMapping("/point/built/GetKendoListCust") + @Operation(summary = "过鱼设施地图描点接口(仅查询在建状态的)") + public ResponseResult getFpBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(fpBuildService.getFpBuiltPointKendoListCust(dataSourceRequest)); + } + @GetMapping("/run/qgc/year/GetYearFpStatistics") @Operation(summary = "全过程过鱼统计总数,根据基地分组") public ResponseResult getYearFpStatic(@RequestParam("year") String year) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java new file mode 100644 index 00000000..f803e21c --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/entity/vo/FpAnchoPointVo.java @@ -0,0 +1,89 @@ +package com.yfd.platform.qgc_env.fp.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "过鱼设施锚点VO") +public class FpAnchoPointVo { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "建设状态编码") + private String bldsttCcode; + + @Schema(description = "建设状态") + private String bldstt; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "电站名称") + private String ennm; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "运行状态") + private String run; + + @Schema(description = "设施类型") + private String dwtp; + + @Schema(description = "设施类型名称") + private String dwtpName; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "数据接入") + private Integer dtin; + + @Schema(description = "达标状态子类型") + private Integer stdSstate; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "过鱼种类") + private Integer ftpTypeCount; + + @Schema(description = "过鱼数量") + private Integer ftpCount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java index 56b2fadb..67e8973d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/FpBuildService.java @@ -2,6 +2,7 @@ package com.yfd.platform.qgc_env.fp.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.fp.entity.vo.FpAnchoPointVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; @@ -19,4 +20,6 @@ public interface FpBuildService { DataSourceResult getFpqMsstbprptList(DataSourceRequest dataSourceRequest); FpVmsstbprptVo getStInfoByStcd(String stcd); + + DataSourceResult getFpBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java index 4e504346..b96d8ef3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpBuildServiceImpl.java @@ -11,9 +11,11 @@ import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_env.fp.entity.vo.FpAnchoPointVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpConstructionSituationVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpFishDicVo; import com.yfd.platform.qgc_env.fp.entity.vo.FpVmsstbprptVo; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.fp.service.FpBuildService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import jakarta.annotation.Resource; @@ -1142,4 +1144,177 @@ public class FpBuildServiceImpl implements FpBuildService { default -> null; }; } + + @Override + public DataSourceResult getFpBuiltPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " fp.STCD AS stcd,\n" + + " fp.STNM AS stnm,\n" + + " fp.STNM AS titleName,\n" + + " fp.BLDSTT_CODE AS bldsttCcode,\n" + + " fp.BLDSTT_CODE AS bldstt,\n" + + " fp.LTTD AS lttd,\n" + + " fp.LGTD AS lgtd,\n" + + " fp.ELEV AS dtmel,\n" + + " fp.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " 'FP' AS sttpCode,\n" + + " fp.STTP AS dwtp,\n" + + " CASE\n" + + " WHEN fp.STTP = 'FP_1' THEN '鱼道'\n" + + " WHEN fp.STTP = 'FP_2' THEN '仿自然通道'\n" + + " WHEN fp.STTP = 'FP_3' THEN '集运鱼系统'\n" + + " WHEN fp.STTP = 'FP_4' THEN '升鱼机'\n" + + " ELSE '其它'\n" + + " END AS dwtpName,\n" + + " fp.STTP AS sttpMap,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " eng.BASE_ID AS baseId,\n" + + " fp.STTP AS sttp,\n" + + " fp.MWAY AS mway,\n" + + " fp.DTIN AS dtin\n" + + "FROM SD_FPSS_B_H fp\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "WHERE NVL(fp.IS_DELETED, 0) = 0 AND fp.BLDSTT_CODE = 1 AND fp.LGTD IS NOT NULL AND fp.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String filterSql = buildFpPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + sql.append(" ORDER BY fp.ORDER_INDEX ASC "); + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FpAnchoPointVo.class); + + for (FpAnchoPointVo vo : resultList) { + String sttp = vo.getSttp(); + if ("FP_1".equals(sttp)) { + vo.setAnchoPointState("GY_1_BUILT"); + } else if ("FP_2".equals(sttp)) { + vo.setAnchoPointState("GY_2_BUILT"); + } else if ("FP_3".equals(sttp)) { + vo.setAnchoPointState("GY_3_BUILT"); + } else if ("FP_4".equals(sttp)) { + vo.setAnchoPointState("GY_4_BUILT"); + } else { + vo.setAnchoPointState("GY_5_BUILT"); + } + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + FpAnchoPointVo::getStcd, + FpAnchoPointVo::getLgtd, + FpAnchoPointVo::getLttd, + FpAnchoPointVo::getAnchoPointState, + FpAnchoPointVo::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildFpPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (filter.getField() != null && !filter.getField().isBlank()) { + return buildFpPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFpPointFilterCondition(child, paramMap, indexHolder); + if (!childSql.isBlank()) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND "; + return String.join(logic, conditions); + } + + private String buildFpPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + if (field == null || field.isBlank()) { + return ""; + } + String column = switch (field) { + case "stcd" -> "fp.STCD"; + case "stnm" -> "fp.STNM"; + case "baseId" -> "eng.BASE_ID"; + case "rvcd" -> "eng.RVCD"; + case "addvcd" -> "eng.ADDVCD"; + case "sttp" -> "fp.STTP"; + default -> null; + }; + if (column == null) { + return ""; + } + String operator = filter.getOperator() == null ? "eq" : filter.getOperator().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 = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fpPointParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + String paramKey = "fpPointParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + default: + return ""; + } + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java index c81bf512..cdaec94d 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fp/service/impl/FpRunServiceImpl.java @@ -2332,7 +2332,7 @@ public class FpRunServiceImpl implements FpRunService { " FROM ( " + " SELECT STCD, FTP " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + @@ -2356,7 +2356,7 @@ public class FpRunServiceImpl implements FpRunService { " FROM ( " + " SELECT STCD, TO_CHAR(START_TIME, 'mm') AS stm, TO_CHAR(END_TIME, 'mm') AS edm, PYCNT AS pycnt " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + @@ -2368,7 +2368,7 @@ public class FpRunServiceImpl implements FpRunService { " AND STCD NOT IN ( " + " SELECT STCD " + " FROM SD_FPRUNPLAN_B " + - " WHERE (TASK_STATUS = 'Approved' OR TASK_STATUS IS NULL) " + + " WHERE 1=1 " + " AND IS_DELETED = 0 " + " AND STCD = #{map.stcd} " + " AND TO_CHAR(START_TIME, 'yyyy') = #{map.yr} " + diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java index 61cbb809..bf3f44ff 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/controller/FprMonitorController.java @@ -4,9 +4,10 @@ import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; -import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; -import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; +import com.yfd.platform.qgc_eng.eq.service.EngEqDataService; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; @@ -86,6 +87,13 @@ public class FprMonitorController { return ResponseResult.successData(result); } + @PostMapping("/sdFprdR/point/getFprdPointList") + @Operation(summary = "鱼类调查装置锚点信息") + public ResponseResult getFprdPointList(@RequestBody FprdRunDataAo ao) { + List result = fprMonitorService.getFprdInfoList(ao); + return ResponseResult.successData(result); + } + @PostMapping("/wbsb/GetKendoList") @Operation(summary = "查询基地/基地流域树数据") public ResponseResult getWbsbList(@RequestBody DataSourceRequest dataSourceRequest) { diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java new file mode 100644 index 00000000..81ea189f --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/entity/vo/FprdPointInfoVo.java @@ -0,0 +1,67 @@ +package com.yfd.platform.qgc_env.fpr.entity.vo; + +import lombok.Data; + +@Data +public class FprdPointInfoVo { + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpCode; + + private String dwtp; + + private String dwtpName; + + private String sttpMap; + + private String rvcd; + + private String rvcdName; + + private String addvcd; + + private String addvcdName; + + private String hbrvcd; + + private String hbrvcdName; + + private String baseId; + + private String baseName; + + private String sttp; + + private String sttpName; + + private String anchoPointState; + + private String mway; + + private Integer dtin; + + private String stdSstate; + + private Integer distance; + + private String stlc; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java index 8681b405..d64cf1fc 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/FprMonitorService.java @@ -2,8 +2,9 @@ package com.yfd.platform.qgc_env.fpr.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; -import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; import com.yfd.platform.qgc_env.fpr.entity.ao.FprdRunDataAo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; @@ -29,4 +30,6 @@ public interface FprMonitorService { DataSourceResult getFprdDetailList(DataSourceRequest dataSourceRequest); List getFishInfo(); + + List getFprdInfoList(FprdRunDataAo ao); } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java index 09b35d14..c697d439 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/fpr/service/impl/FprMonitorServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceLoadOptionsBase; import com.yfd.platform.common.DataSourceRequest; @@ -18,6 +19,7 @@ import com.yfd.platform.qgc_env.fpr.entity.vo.FprFishDicVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprFtpChangeInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprMsstbprptVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdDetailVo; +import com.yfd.platform.qgc_env.fpr.entity.vo.FprdPointInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprdRunDataInfoVo; import com.yfd.platform.qgc_env.fpr.entity.vo.FprZyFishDicVo; import com.yfd.platform.qgc_env.fpr.service.FprMonitorService; @@ -126,6 +128,87 @@ public class FprMonitorServiceImpl implements FprMonitorService { .toList(); } + @Override + public List getFprdInfoList(FprdRunDataAo ao) { + validateFprdRunDataAo(ao); + + Map paramMap = new HashMap<>(); + paramMap.put("baseId", ao.getBaseId()); + + StringBuilder sql = new StringBuilder("SELECT ") + .append("aim.STCD AS stcd, ") + .append("aim.STNM AS stnm, ") + .append("aim.STNM AS titleName, ") + .append("TO_CHAR(aim.BLDSTT_CODE) AS bldsttCcode, ") + .append("TO_CHAR(aim.BLDSTT_CODE) AS bldstt, ") + .append("aim.LTTD AS lttd, ") + .append("aim.LGTD AS lgtd, ") + .append("aim.DTMEL AS dtmel, ") + .append("aim.RSTCD AS rstcds, ") + .append("eng.ENNM AS ennm, ") + .append("aim.STTP AS sttpCode, ") + .append("aim.DWTP AS dwtp, ") + .append("aim.DWTP AS dwtpName, ") + .append("aim.STTP AS sttpMap, ") + .append("aim.RVCD AS rvcd, ") + .append("rv.RVNM AS rvcdName, ") + .append("aim.ADDVCD AS addvcd, ") + .append("addv.ADDVCD_NAME AS addvcdName, ") + .append("aim.HBRVCD AS hbrvcd, ") + .append("hbrv.HBRVNM AS hbrvcdName, ") + .append("aim.BASE_ID AS baseId, ") + .append("hb.BASENAME AS baseName, ") + .append("aim.STTP AS sttp, ") + .append("sttp.STTP_NAME AS sttpName, ") + .append("'' AS anchoPointState, ") + .append("aim.MWAY AS mway, ") + .append("aim.DTIN AS dtin, ") + .append("aim.STDSSTATE AS stdSstate, ") + .append("aim.STLC AS stlc ") + .append("FROM SD_AIMONITOR_B_H aim ") + .append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = aim.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = aim.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = aim.HBRVCD ") + .append(" AND hbrv.BASEID = aim.BASE_ID ") + .append(" AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append(" AND NVL(hbrv.ENABLED, 1) = 1 ") + .append("LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = aim.RVCD ") + .append("LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = aim.ADDVCD ") + .append("LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = aim.STTP ") + .append(" AND NVL(sttp.IS_DELETED, 0) = 0 ") + .append(" AND NVL(sttp.ENABLE, 1) = 1 ") + .append("WHERE NVL(aim.IS_DELETED, 0) = 0 ") + .append(" AND aim.STTP = 'FPRD' ") + .append(" AND aim.LGTD IS NOT NULL ") + .append(" AND aim.BASE_ID = #{map.baseId}"); + + if (StrUtil.isNotBlank(ao.getHbrvcd())) { + sql.append(" AND aim.HBRVCD = #{map.hbrvcd}"); + paramMap.put("hbrvcd", ao.getHbrvcd()); + } + + if (StrUtil.isNotBlank(ao.getStcd())) { + sql.append(" AND aim.STCD = #{map.stcd}"); + paramMap.put("stcd", ao.getStcd()); + } + + List resultList = microservicDynamicSQLMapper.getAllListWithResultType( + sql.toString(), + paramMap, + FprdPointInfoVo.class + ); + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + FprdPointInfoVo::getStcd, + vo -> vo.getLgtd() != null ? java.math.BigDecimal.valueOf(vo.getLgtd()) : null, + vo -> vo.getLttd() != null ? java.math.BigDecimal.valueOf(vo.getLttd()) : null, + FprdPointInfoVo::getAnchoPointState, + FprdPointInfoVo::setDistance + ); + + return resultList; + } + @Override public DataSourceResult getMsstbprptList(DataSourceRequest dataSourceRequest) { DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); 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 ef34b630..d6900110 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 @@ -76,4 +76,16 @@ public class VapConstructionController { public ResponseResult getVprYearKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(vpConstructionService.getVprYearList(dataSourceRequest)); } + + @PostMapping("/fhvap/built/GetKendoListCust") + @Operation(summary = "栖息地/珍稀植物园/动物救助站描点接口(仅查询在建状态的)") + public ResponseResult getFhvapBuiltPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.getFhvapBuiltPointKendoListCust(dataSourceRequest)); + } + + @PostMapping("/wva/point/GetKendoListCust") + @Operation(summary = "野生动物锚点") + public ResponseResult getWvaPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(vpConstructionService.getWvaPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java new file mode 100644 index 00000000..f71df8e4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/FhvapBuiltPointVo.java @@ -0,0 +1,57 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import lombok.Data; + +@Data +public class FhvapBuiltPointVo { + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpCode; + + private String dwtp; + + private String dwtpName; + + private String sttpMap; + + private String rvcd; + + private String addvcd; + + private String baseId; + + private String sttp; + + private String anchoPointState; + + private String mway; + + private Integer dtin; + + private String stdSstate; + + private Integer distance; + + private Integer ftpTypeCount; + + private Integer ftpCount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java new file mode 100644 index 00000000..ac2802b5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vap/entity/vo/WvaPointVo.java @@ -0,0 +1,47 @@ +package com.yfd.platform.qgc_env.vap.entity.vo; + +import lombok.Data; + +@Data +public class WvaPointVo { + + private Integer dtin; + + private String stcd; + + private String stnm; + + private String titleName; + + private String bldsttCcode; + + private String bldstt; + + private Double lttd; + + private Double lgtd; + + private Double dtmel; + + private String rstcds; + + private String ennm; + + private String sttpMap; + + private String rvcd; + + private String addvcd; + + private String baseId; + + private String sttp; + + private String anchoPointState; + + private String mway; + + private String sttpCode; + + private Integer distance; +} \ No newline at end of file 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 0a362f81..634224a5 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 @@ -2,6 +2,8 @@ package com.yfd.platform.qgc_env.vap.service; import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; +import com.yfd.platform.qgc_env.vap.entity.vo.WvaPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; @@ -27,4 +29,8 @@ public interface VpConstructionService { DataSourceResult getVarYearList(DataSourceRequest dataSourceRequest); DataSourceResult getVprYearList(DataSourceRequest dataSourceRequest); + + DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getWvaPointKendoListCust(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 e0bc4ccf..9b1131e0 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 @@ -9,6 +9,8 @@ import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.PageInfo; +import com.yfd.platform.qgc_env.vap.entity.vo.FhvapBuiltPointVo; +import com.yfd.platform.qgc_env.vap.entity.vo.WvaPointVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVarVo; @@ -1908,4 +1910,403 @@ public class VpConstructionServiceImpl implements VpConstructionService { dataSourceResult.setTotal(page != null ? page.getTotal() : (long) yList.size()); return dataSourceResult; } + + @Override + public DataSourceResult getFhvapBuiltPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " t.STCD AS stcd,\n" + + " t.STNM AS stnm,\n" + + " t.STNM AS titleName,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldsttCcode,\n" + + " TO_CHAR(t.BLDSTT_CODE) AS bldstt,\n" + + " t.LTTD AS lttd,\n" + + " t.LGTD AS lgtd,\n" + + " t.ELEV AS dtmel,\n" + + " t.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " t.STTP AS sttpCode,\n" + + " t.STTP AS dwtp,\n" + + " CASE\n" + + " WHEN t.STTP = 'VP' THEN '珍稀植物园'\n" + + " WHEN t.STTP = 'VA' THEN '动物救助站'\n" + + " WHEN t.STTP = 'FH' THEN '栖息地'\n" + + " ELSE '其它'\n" + + " END AS dwtpName,\n" + + " t.STTP AS sttpMap,\n" + + " t.RVCD AS rvcd,\n" + + " t.ADDVCD AS addvcd,\n" + + " t.BASE_ID AS baseId,\n" + + " t.STTP AS sttp,\n" + + " t.DTIN AS dtin\n" + + "FROM (\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VP_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, NULL AS RVCD, NULL AS ADDVCD, BLDSTT_CODE, DTIN\n" + + " FROM SD_VA_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND BLDSTT_CODE = 1 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + " UNION ALL\n" + + " SELECT STCD, STNM, 'FH' AS STTP, LGTD, LTTD, ELEV, RSTCD, BASE_ID, RVCD, ADDVCD, 1 AS BLDSTT_CODE, DTIN\n" + + " FROM SD_FHBT_B_H\n" + + " WHERE NVL(IS_DELETED, 0) = 0 AND LGTD IS NOT NULL AND LTTD IS NOT NULL\n" + + ") t\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildFhvapPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildFhvapPointOrderBySql(dataSourceRequest.getSort())); + + Page page = KendoUtil.getPage(dataSourceRequest); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, FhvapBuiltPointVo.class); + + for (FhvapBuiltPointVo vo : resultList) { + String sttp = vo.getSttp(); + if ("VP".equals(sttp)) { + vo.setAnchoPointState("GY_1_BUILT"); + } else if ("VA".equals(sttp)) { + vo.setAnchoPointState("GY_2_BUILT"); + } else if ("FH".equals(sttp)) { + vo.setAnchoPointState("GY_3_BUILT"); + } else { + vo.setAnchoPointState("GY_4_BUILT"); + } + } + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildFhvapPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildFhvapPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildFhvapPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildFhvapPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + String column = mapFhvapPointColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "fhvapParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "fhvapParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapFhvapPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "t.STCD"); + columnMap.put("stnm", "t.STNM"); + columnMap.put("sttpCode", "t.STTP"); + columnMap.put("bldsttCcode", "t.BLDSTT_CODE"); + columnMap.put("lgtd", "t.LGTD"); + columnMap.put("lttd", "t.LTTD"); + columnMap.put("baseId", "t.BASE_ID"); + columnMap.put("rvcd", "t.RVCD"); + columnMap.put("addvcd", "t.ADDVCD"); + columnMap.put("rstcds", "t.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + return columnMap.get(field); + } + + private String buildFhvapPointOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapFhvapPointColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY t.BASE_ID ASC, t.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } + + @Override + public DataSourceResult getWvaPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " we.DTIN AS dtin,\n" + + " we.STCD AS stcd,\n" + + " we.STNM AS stnm,\n" + + " we.STNM AS titleName,\n" + + " TO_CHAR(we.BLDSTT_CODE) AS bldsttCcode,\n" + + " TO_CHAR(we.BLDSTT_CODE) AS bldstt,\n" + + " we.LTTD AS lttd,\n" + + " we.LGTD AS lgtd,\n" + + " we.ELEV AS dtmel,\n" + + " we.RSTCD AS rstcds,\n" + + " eng.ENNM AS ennm,\n" + + " 'WVA' AS sttpMap,\n" + + " we.RVCD AS rvcd,\n" + + " we.ADDVCD AS addvcd,\n" + + " we.BASE_ID AS baseId,\n" + + " 'WVA' AS sttp,\n" + + " 'wild_animal_legend' AS anchoPointState,\n" + + " 'WVA' AS sttpCode\n" + + "FROM SD_WE_B_H we\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = we.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "WHERE we.LGTD IS NOT NULL AND we.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + String filterSql = buildWvaPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildWvaPointOrderBySql(dataSourceRequest.getSort())); + + Page page = KendoUtil.getPage(dataSourceRequest); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WvaPointVo.class); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String buildWvaPointFilterCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + if (filter == null) { + return ""; + } + if (StrUtil.isNotBlank(filter.getField())) { + return buildWvaPointLeafCondition(filter, paramMap, indexHolder); + } + if (CollectionUtils.isEmpty(filter.getFilters())) { + return ""; + } + List conditions = new ArrayList<>(); + for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) { + String childSql = buildWvaPointFilterCondition(child, paramMap, indexHolder); + if (StrUtil.isNotBlank(childSql)) { + conditions.add("(" + childSql + ")"); + } + } + if (conditions.isEmpty()) { + return ""; + } + return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions); + } + + private String buildWvaPointLeafCondition(DataSourceRequest.FilterDescriptor filter, + Map paramMap, + int[] indexHolder) { + String field = filter.getField(); + Object value = filter.getValue(); + String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase(); + + String column = mapWvaPointColumn(field); + if (StrUtil.isBlank(column)) { + return ""; + } + + if ("isnull".equals(operator)) { + return column + " IS NULL"; + } + if ("isnotnull".equals(operator)) { + return column + " IS NOT NULL"; + } + if ("in".equals(operator)) { + List values = normalizeValues(value); + if (values.isEmpty()) { + return ""; + } + List placeholders = new ArrayList<>(); + for (Object item : values) { + String paramKey = "wvaParam" + indexHolder[0]++; + paramMap.put(paramKey, item); + placeholders.add("#{map." + paramKey + "}"); + } + return column + " IN (" + String.join(", ", placeholders) + ")"; + } + if (value == null) { + return ""; + } + + String paramKey = "wvaParam" + indexHolder[0]++; + switch (operator) { + case "eq": + paramMap.put(paramKey, value); + return column + " = #{map." + paramKey + "}"; + case "neq": + paramMap.put(paramKey, value); + return column + " <> #{map." + paramKey + "}"; + case "contains": + paramMap.put(paramKey, "%" + value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "startswith": + paramMap.put(paramKey, value + "%"); + return column + " LIKE #{map." + paramKey + "}"; + case "endswith": + paramMap.put(paramKey, "%" + value); + return column + " LIKE #{map." + paramKey + "}"; + case "gt": + paramMap.put(paramKey, value); + return column + " > #{map." + paramKey + "}"; + case "gte": + paramMap.put(paramKey, value); + return column + " >= #{map." + paramKey + "}"; + case "lt": + paramMap.put(paramKey, value); + return column + " < #{map." + paramKey + "}"; + case "lte": + paramMap.put(paramKey, value); + return column + " <= #{map." + paramKey + "}"; + default: + return ""; + } + } + + private String mapWvaPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + Map columnMap = new HashMap<>(); + columnMap.put("stcd", "we.STCD"); + columnMap.put("stnm", "we.STNM"); + columnMap.put("sttpCode", "'WVA'"); + columnMap.put("lgtd", "we.LGTD"); + columnMap.put("lttd", "we.LTTD"); + columnMap.put("baseId", "we.BASE_ID"); + columnMap.put("rvcd", "we.RVCD"); + columnMap.put("addvcd", "we.ADDVCD"); + columnMap.put("rstcds", "we.RSTCD"); + columnMap.put("ennm", "eng.ENNM"); + return columnMap.get(field); + } + + private String buildWvaPointOrderBySql(List sorts) { + if (sorts == null || sorts.isEmpty()) { + return " ORDER BY we.BASE_ID ASC, we.STCD ASC"; + } + List orderItems = new ArrayList<>(); + for (DataSourceRequest.SortDescriptor sort : sorts) { + if (sort == null || StrUtil.isBlank(sort.getField())) { + continue; + } + String column = mapWvaPointColumn(sort.getField()); + if (StrUtil.isBlank(column)) { + continue; + } + String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC"; + orderItems.add(column + " " + direction + " NULLS LAST"); + } + if (orderItems.isEmpty()) { + return " ORDER BY we.BASE_ID ASC, we.STCD ASC"; + } + return " ORDER BY " + String.join(", ", orderItems); + } } 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 ac9bf4e7..01cd74b5 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 @@ -523,8 +523,8 @@ public class WarnDataServiceImpl implements WarnDataService { 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("WHERE a.IS_DELETED = 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)) { 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 cbc2bb8b..424620d3 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 @@ -4575,12 +4575,12 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .append("t.FHSTCD AS fhstcd, ") .append("t.ORDER_INDEX AS orderIndex, ") .append("eng.ENNM AS ennm, ") - .append("hb.BASE_NAME AS baseName, ") + .append("hb.BASENAME 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(hbrv.HBRVNM, '') AS hbrvcdName, ") + .append("NVL(rvcd.RVNM, '') AS rvcdName, ") + .append("NVL(addvcd.ADDVNM, '') AS addvcdName, ") .append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ") .append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ") .append("NVL(siteSort.SORT, 999999) AS siteStepSort, ") @@ -4590,9 +4590,9 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .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 SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND NVL(hbrv.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_RVCD_DIC rvcd ON rvcd.RVCD = eng.RVCD AND NVL(rvcd.IS_DELETED, 0) = 0 ") + .append("LEFT JOIN SD_ADDVCD_DIC addvcd ON addvcd.ADDVCD = eng.ADDVCD ") .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 ") @@ -4607,13 +4607,19 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .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 "); + .append("AND NVL(t.USFL, 1) = 1 "); + + Map paramMap = new HashMap<>(); + String filterSql = buildWqPointFilterCondition(dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql); + } + + sql.append(buildWqPointOrderBySql(dataSourceRequest.getSort())); 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); + List wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, EnvWqAnchorPointVo.class); if (CollectionUtils.isNotEmpty(wqVoList)) { List stcdList = wqVoList.stream() @@ -4622,15 +4628,7 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { .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); + List wqDataList = queryWqDataByStcdBatch(stcdList); Map wqDataMap = wqDataList.stream() .collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue)); @@ -4706,6 +4704,205 @@ public class EnvWqDataServiceImpl implements EnvWqDataService { return dataSourceResult; } + private List queryWqDataByStcdBatch(List stcdList) { + List resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(stcdList)) { + return resultList; + } + + int batchSize = 500; + List> batches = CollUtil.split(stcdList, batchSize); + + for (List batch : batches) { + String stcdParams = batch.stream() + .map(s -> "'" + s + "'") + .collect(Collectors.joining(",")); + + 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 (" + stcdParams + ") " + + " AND NVL(t.IS_DELETED, 0) = 0 " + + ") WHERE rn = 1"; + + List batchList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class); + if (CollectionUtils.isNotEmpty(batchList)) { + resultList.addAll(batchList); + } + } + return resultList; + } + + private String buildWqPointFilterCondition(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 = buildWqPointFilterCondition(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 = mapWqPointColumn(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 = "wqPointParam" + 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 = "wqPointParam" + 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 mapWqPointColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field) { + case "stcd" -> "t.STCD"; + case "stnm" -> "t.STNM"; + case "sttp" -> "t.STTP"; + case "sttpCode" -> "t.STTP"; + case "lgtd" -> "t.LGTD"; + case "lttd" -> "t.LTTD"; + case "dtmel" -> "t.ELEV"; + case "stlc" -> "t.STLC"; + case "wwqtg" -> "t.WWQTG"; + case "dtinType" -> "t.DTIN_TYPE"; + case "rstcd" -> "t.RSTCD"; + case "fhstcd" -> "t.FHSTCD"; + case "orderIndex" -> "t.ORDER_INDEX"; + case "ennm" -> "eng.ENNM"; + case "baseName" -> "hb.BASENAME"; + case "baseId" -> "hb.BASEID"; + case "hbrvcd" -> "eng.HBRVCD"; + case "hbrvcdName" -> "hbrv.HBRVNM"; + case "rvcdName" -> "rvcd.RVNM"; + case "addvcdName" -> "addvcd.ADDVNM"; + case "rvcdStepSort" -> "rvcdStepSort"; + case "rstcdStepSort" -> "rstcdStepSort"; + case "siteStepSort" -> "siteStepSort"; + case "baseStepSort" -> "baseStepSort"; + default -> null; + }; + } + + private String buildWqPointOrderBySql(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 = mapWqPointColumn(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); + } + + private List normalizeFilterValues(Object value) { + List values = new ArrayList<>(); + if (value instanceof List) { + ((List) value).forEach(v -> { + if (v != null) { + values.add(v); + } + }); + } else if (value != null) { + values.add(value); + } + return values; + } + private String getAnchorPoint(EnvWqAnchorPointVo anchorPointVo) { Integer dtinType = anchorPointVo.getDtinType(); Integer sfdb = anchorPointVo.getSfdb(); 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 828e4caf..ca3533ee 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 @@ -327,4 +327,10 @@ public class SdWTMonitorController { public ResponseResult getFacilityPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { return ResponseResult.successData(sdWtMonitorService.getFacilityPointKendoListCust(dataSourceRequest)); } + + @PostMapping("/getEngTempPointList/GetKendoListCust") + @Operation(summary = "电站出入库水温描点") + public ResponseResult getEngTempPointListKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(sdWtMonitorService.getEngTempPointListKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java new file mode 100644 index 00000000..d5808d99 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/entity/vo/WaterTempMapVO.java @@ -0,0 +1,104 @@ +package com.yfd.platform.qgc_env.wt.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "水温监测点描点VO") +public class WaterTempMapVO { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "关联电站名称") + private String ennm; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "数据接入类型:0=自建,1=国家建,2=人工") + private String dtinType; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "是否是垂向水温,0=否 1=是") + private Integer enfc; + + @Schema(description = "所在位置") + private String location; + + @Schema(description = "运行状态") + private String status = "1"; + + @Schema(description = "水温") + private BigDecimal temperature; + + @Schema(description = "日期") + private Date tm; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "监测方式") + private Integer mway; + + @Schema(description = "垂向水温类型:1=浮动式 2=固定式") + private Integer deviceType; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "垂向水温站点浮窗数据") + private Object wtvtInfo; + + @Schema(description = "水温值") + private BigDecimal value; + + @Schema(description = "排序") + private Integer orderIndex; + + @Schema(description = "出入库标识 (1 入库水温, 2 出库水温 ,3 非出入库水温)") + private Integer ioType; + + public void setTemperature(BigDecimal temperature) { + this.temperature = temperature; + this.value = temperature; + } +} \ 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 ba092d0a..60398c1e 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 @@ -14,6 +14,7 @@ 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 com.yfd.platform.qgc_env.wt.entity.vo.WaterTempMapVO; import java.util.List; @@ -54,4 +55,6 @@ public interface SdWtMonitorService { List getWtvtDefaultTreeStcd(DataSourceRequest dataSourceRequest); DataSourceResult getFacilityPointKendoListCust(DataSourceRequest dataSourceRequest); + + DataSourceResult getEngTempPointListKendoListCust(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 b6ce2afd..127a19cc 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 @@ -21,10 +21,12 @@ 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.entity.vo.WaterTempMapVO; 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 com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import lombok.Data; import org.springframework.jdbc.core.JdbcTemplate; @@ -114,7 +116,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.JCDT AS jcdt, " + "t.WDDT AS wddt, " + "t.BLDSTT_CODE AS bldsttCode, " + - "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, "+ + "CASE WHEN t.BLDSTT_CODE =2 THEN '已建' WHEN t.BLDSTT_CODE =1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " + "t.INV AS inv, " + "t.INVINMN AS invinmn, " + "t.INTRODUCE AS introduce, " + @@ -126,7 +128,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { "t.DTIN_TYPE AS dtinType, " + "t.DTIN_TM AS dtinTm, " + "t.MWAY AS mway, " + - "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName , "+ + "CASE NVL(t.MWAY, 0) WHEN 1 THEN '人工' WHEN 2 THEN '自动' ELSE '未知' END AS mwayName , " + "t.STINDX AS stindx, " + "t.ORDER_INDEX AS orderIndex, " + "t.DMSTCD AS dmstcd, " + @@ -444,7 +446,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildYearDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdYearDetailVO.class); for (SdYearDetailVO vo : list) { vo.setActualTemp(vo.getWt()); @@ -489,7 +491,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildMonthDetailOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdMonthDetailVO.class); DataSourceResult result = new DataSourceResult<>(); result.setData(list); @@ -517,7 +519,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { Map paramMap = new HashMap<>(); paramMap.put("stcd", stcd); WtrvVo vo = (WtrvVo) microservicDynamicSQLMapper.getOneBySqlWithResultType(sql, paramMap, WtrvVo.class); - if (vo == null ) { + if (vo == null) { return buildDefaultWtrvVo(stcd); } return vo; @@ -576,7 +578,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { paramMap.put("baseId", baseId); } - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List wtFishVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtFishVo.class); String hbrvcd = wtFishVoList.isEmpty() ? null : wtFishVoList.get(0).getHbrvcd(); @@ -849,7 +851,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { } sql.append(buildVmsstbprptOrderBySql(dataSourceRequest.getSort())); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List list = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, SdWtBaseInfoVO.class); DataSourceResult result = new DataSourceResult<>(); @@ -1152,7 +1154,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { appendCxDetailOrderBy(sql, dataSourceRequest.getSort()); DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); - Page page = QgcQueryWrapperUtil.buildPage(loadOptions,loadOptions.getSkip(), loadOptions.getTake()); + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); List rowList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WtCxDetailRow.class); List verticalList = getVerticals(rowList, wtDeviceType); @@ -2871,7 +2873,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { .append("sttp.STTP_NAME AS sttpName, ") .append("t.DTIN AS dtin, ") .append("NULL AS stdSstate ") - .append("FROM SD_DFLTKW_B_H t ") + .append("FROM SD_DW_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 ") @@ -2921,4 +2923,139 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { return dataSourceResult; } + @Override + public DataSourceResult getEngTempPointListKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String dtinType = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "flag"); + String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "sttpCode"); + String fhFlag = QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "fhFlag"); + + StringBuilder sql = new StringBuilder("SELECT\n" + + " wt.STCD AS stcd,\n" + + " wt.STNM AS stnm,\n" + + " wt.STNM AS titleName,\n" + + " wt.RSTCD AS rstcds,\n" + + " CASE\n" + + " WHEN wt.STTP = 'WTVT' THEN 1\n" + + " ELSE 0\n" + + " END AS enfc,\n" + + " 'WT' AS sttp,\n" + + " wt.STTP AS sttpCode,\n" + + " 'WT' AS sttpMap,\n" + + " wt.LGTD AS lgtd,\n" + + " wt.LTTD AS lttd,\n" + + " wt.WT_DEVICE_TYPE AS deviceType,\n" + + " wt.ELEV AS dtmel,\n" + +// " wt.FHSTNM AS fhstnm,\n" + + " wt.MWAY AS mway,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " eng.BASE_ID AS baseId,\n" + + " eng.ENNM AS ennm,\n" + + " wt.ORDER_INDEX AS orderIndex,\n" + + " wt.DTIN_TYPE AS dtinType,\n" + + " (CASE\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_IWT_CODE IS NOT NULL THEN 1\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_DWT_CODE IS NOT NULL THEN 2\n" + + " WHEN wt.STTP = 'WTRV' AND rel.ENG_IWT_CODE IS NULL AND rel.ENG_DWT_CODE IS NULL THEN 3\n" + + " END) AS ioType\n" + + "FROM SD_WT_B_H wt\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = wt.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "LEFT JOIN SD_WTENGRLTN_B rel ON rel.STCD = wt.STCD AND NVL(rel.IS_DELETED, 0) = 0\n" + + "WHERE NVL(wt.IS_DELETED, 0) = 0 AND wt.STTP IN ('WTRV', 'WTVT') AND wt.LGTD IS NOT NULL AND wt.LTTD IS NOT NULL "); + Map paramMap = new HashMap<>(); + String filterSql = QgcQueryWrapperUtil.buildFilterCondition( + dataSourceRequest == null ? null : dataSourceRequest.getFilter(), + paramMap, + new int[]{0}, + this::mapWeFvColumn + ); + if (StrUtil.isNotBlank(filterSql)) { + sql.append("AND ").append(filterSql).append(" "); + } +// if (StrUtil.isNotBlank(sttpCode)) { +// sql.append(" AND wt.STTP = #{map.sttpCode} "); +// } +// if (StrUtil.isNotBlank(dtinType)) { +// sql.append(" AND wt.DTIN_TYPE = #{map.dtinType} "); +// } +// +// Map paramMap = new HashMap<>(); +// if (StrUtil.isNotBlank(sttpCode)) { +// paramMap.put("sttpCode", sttpCode); +// } +// if (StrUtil.isNotBlank(dtinType)) { +// paramMap.put("dtinType", dtinType); +// } + + List sort = dataSourceRequest.getSort(); + if (sort != null && !sort.isEmpty()) { + sql.append(" ORDER BY "); + for (int i = 0; i < sort.size(); i++) { + String field = sort.get(i).getField(); + String dir = sort.get(i).getDir(); + sql.append(field).append(" ").append(dir); + if (i < sort.size() - 1) { + sql.append(","); + } + } + } else { + sql.append(" ORDER BY wt.ORDER_INDEX ASC "); + } + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, WaterTempMapVO.class); + + for (WaterTempMapVO vo : resultList) { + if (StrUtil.isNotBlank(fhFlag)) { + vo.setAnchoPointState("fhwt_legend"); + } else if (StrUtil.isNotBlank(dtinType)) { + if ("0".equals(dtinType)) { + vo.setAnchoPointState("stinfo_wtzj_legend"); + } else if ("2".equals(dtinType)) { + vo.setAnchoPointState("stinfo_wtrg_legend"); + } + } else { + if (vo.getMway() != null && vo.getMway() == 1) { + vo.setAnchoPointState("WT_1"); + } else if (vo.getMway() != null && vo.getMway() == 2) { + vo.setAnchoPointState("WT_2"); + } + } + } + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + WaterTempMapVO::getStcd, + WaterTempMapVO::getLgtd, + WaterTempMapVO::getLttd, + WaterTempMapVO::getAnchoPointState, + WaterTempMapVO::setDistance); + + dataSourceResult.setData(resultList); + dataSourceResult.setTotal(page == null ? resultList.size() : page.getTotal()); + return dataSourceResult; + } + + private String mapWeFvColumn(String field) { + if (StrUtil.isBlank(field)) { + return null; + } + return switch (field.toLowerCase()) { + case "sttpcode" -> "wt.STTP"; + case "dtintype" -> "wt.DTIN_TYPE"; + case "lgtd" -> "wt.LGTD"; + case "fhstcd" -> "wt.FHSTCD"; + default -> null; + }; + } + } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java index 7629326f..6f166ed8 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/controller/ZqMonitorController.java @@ -82,4 +82,10 @@ public class ZqMonitorController { public ResponseResult getStcdInfo(@RequestParam String stcd) { return ResponseResult.successData(zqMonitorService.getStcdInfo(stcd)); } + + @PostMapping("/zqpoint/GetKendoListCust") + @Operation(summary = "流量站锚点接口") + public ResponseResult getZqPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { + return ResponseResult.successData(zqMonitorService.getZqPointKendoListCust(dataSourceRequest)); + } } diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java new file mode 100644 index 00000000..1ebb5502 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/entity/vo/ZqPoint.java @@ -0,0 +1,93 @@ +package com.yfd.platform.qgc_env.zq.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "流量站锚点VO") +public class ZqPoint { + + @Schema(description = "站点编码") + private String stcd; + + @Schema(description = "站名") + private String stnm; + + @Schema(description = "流域名称") + private String rvnm; + + @Schema(description = "关联电站名称") + private String ennm; + + @Schema(description = "栖息地编码") + private String fhstcd; + + @Schema(description = "栖息地名称") + private String fhstnm; + + @Schema(description = "站点类型名称") + private String sttpName; + + @Schema(description = "日期") + private Date tm; + + @Schema(description = "水位") + private BigDecimal z; + + @Schema(description = "流量") + private BigDecimal q; + + @Schema(description = "流速") + private BigDecimal v; + + @Schema(description = "数据接入类型") + private String dtinType; + + @Schema(description = "站点排序") + private Integer siteStepSort; + + @Schema(description = "站点类型编码") + private String sttpCode; + + @Schema(description = "站点类型") + private String sttp; + + @Schema(description = "锚点类型") + private String sttpMap; + + @Schema(description = "经度") + private BigDecimal lgtd; + + @Schema(description = "纬度") + private BigDecimal lttd; + + @Schema(description = "高程") + private BigDecimal dtmel; + + @Schema(description = "描点状态") + private String anchoPointState; + + @Schema(description = "弹框站点名称") + private String titleName; + + @Schema(description = "流域编码") + private String rvcd; + + @Schema(description = "行政编码") + private String addvcd; + + @Schema(description = "基地编码") + private String baseId; + + @Schema(description = "关联电站编码") + private String rstcds; + + @Schema(description = "地图避让") + private Integer distance; + + @Schema(description = "站址") + private String stlc; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java index f2468d65..f7fc85cb 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/zq/service/ZqMonitorService.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.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqPoint; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; @@ -25,4 +26,6 @@ public interface ZqMonitorService { boolean updateRiverRData(java.util.Map updateData, String source); ZqBaseInfoVo getStcdInfo(String stcd); + + DataSourceResult getZqPointKendoListCust(DataSourceRequest dataSourceRequest); } 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 a573ce04..6263bed7 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 @@ -18,9 +18,11 @@ import com.yfd.platform.qgc_base.mapper.MsOperationLogDetailMapper; import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper; import com.yfd.platform.qgc_env.fh.entity.vo.HabitatVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqBaseInfoVo; +import com.yfd.platform.qgc_env.zq.entity.vo.ZqPoint; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDayDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDrtpDataVo; import com.yfd.platform.qgc_env.zq.entity.vo.ZqRiverDataVo; +import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils; import com.yfd.platform.qgc_env.zq.service.ZqMonitorService; import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; @@ -2370,4 +2372,78 @@ public class ZqMonitorServiceImpl implements ZqMonitorService { } return " ORDER BY " + String.join(", ", orderColumns); } + + @Override + public DataSourceResult getZqPointKendoListCust(DataSourceRequest dataSourceRequest) { + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setAggregates(new HashMap<>()); + + if (dataSourceRequest == null) { + dataSourceResult.setData(new ArrayList<>()); + dataSourceResult.setTotal(0L); + return dataSourceResult; + } + + StringBuilder sql = new StringBuilder("SELECT\n" + + " rb.STCD AS stcd,\n" + + " rb.STNM AS stnm,\n" + + " rb.STNM AS titleName,\n" + + " rb.RSTCD AS rstcds,\n" + + " CASE\n" + + " WHEN rb.DTIN_TYPE = 0 THEN 'zjllz'\n" + + " WHEN rb.DTIN_TYPE = 1 THEN 'gjllz'\n" + + " ELSE ''\n" + + " END AS anchoPointState,\n" + + " 'ZQ' AS sttpMap,\n" + + " rb.STTP AS sttp,\n" + + " rb.STTP AS sttpCode,\n" + + " rb.LGTD AS lgtd,\n" + + " rb.LTTD AS lttd,\n" + + " rb.ELEV AS dtmel,\n" + + " rb.STLC AS stlc,\n" + + " eng.RVCD AS rvcd,\n" + + " eng.ADDVCD AS addvcd,\n" + + " rv.RVNM AS rvnm,\n" + + " eng.BASE_ID AS baseId,\n" + + " eng.ENNM AS ennm,\n" + + " rb.FHSTCD AS fhstcd,\n" + + " fh.STNM AS fhstnm,\n" + + " rb.DTIN_TYPE AS dtinType,\n" + + " NVL(siteSort.SORT, 999999) AS siteStepSort\n" + + "FROM SD_RIVER_B_H rb\n" + + "LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = rb.RSTCD AND NVL(eng.IS_DELETED, 0) = 0\n" + + "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD\n" + + "LEFT JOIN SD_RIVER_B_H fh ON fh.STCD = rb.FHSTCD AND NVL(fh.IS_DELETED, 0) = 0\n" + + "LEFT JOIN (\n" + + " SELECT det.SORT, cfg.RVCD, det.STCD\n" + + " FROM MS_ALONGDET_B det\n" + + " INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID\n" + + " WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common'\n" + + ") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = rb.STCD\n" + + "WHERE NVL(rb.IS_DELETED, 0) = 0 AND rb.STTP = 'ZQ' AND rb.LGTD IS NOT NULL AND rb.LTTD IS NOT NULL "); + + Map paramMap = new HashMap<>(); + + DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest(); + String filterSql = buildMsstbprptFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(), paramMap, new int[]{0}); + if (StrUtil.isNotBlank(filterSql)) { + sql.append(" AND ").append(filterSql).append(" "); + } + + sql.append(" ORDER BY siteStepSort ASC "); + + Page page = QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake()); + List resultList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), paramMap, ZqPoint.class); + + SiteAvoidanceUtils.calcSiteMapLev(resultList, + ZqPoint::getStcd, + ZqPoint::getLgtd, + ZqPoint::getLttd, + ZqPoint::getAnchoPointState, + ZqPoint::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_sys/mapLayer/controller/MapLegendController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java index 87e3187a..9c2b5010 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java @@ -61,6 +61,7 @@ public class MapLegendController { // 执行分页查询 Page page = DataSourceRequestUtil.getPage(dataSourceRequest); Page resultPage; + wrapper.eq("IS_DELETED", 0); if (page != null) { resultPage = mapLegendService.page(page, wrapper); } else { @@ -110,7 +111,7 @@ public class MapLegendController { String parentId = entity.getParentId(); if (parentId != null && parentMap.containsKey(parentId)) { MsMaplegendB parent = parentMap.get(parentId); - entity.setParentCode(parent.getCode()); + entity.setParentCode(parent.getNameEn()); entity.setParentName(parent.getName()); } else { entity.setParentCode(null); @@ -161,18 +162,6 @@ public class MapLegendController { if (legend.getDataType() == null) { throw new BizException("图例数据类型(dataType: 1=结构,2=数据)不能为空."); } - if (legend.getDataType() == 2 && StrUtil.isBlank(legend.getLayerCode())) { - throw new BizException("关联的图层编码(layerCode)不能为空."); - } - if (StrUtil.isNotBlank(legend.getName())){ - if(StrUtil.isBlank(legend.getGroupName())){ - legend.setGroupName(legend.getName()); - } - if(StrUtil.isBlank(legend.getParentName())){ - legend.setGroupName(legend.getName()); - } - } - legend.setRecordUser(SecurityUtils.getUserId()); mapLegendService.saveOrUpdate(legend); return ResponseResult.success("保存成功."); } 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 00b8523a..89d4548e 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 @@ -35,7 +35,7 @@ public interface MsMapmoduleBMapper extends BaseMapper { + " AND BMM.TEMPLATE_ID = #{templateId}" + " AND (BMM.TEMPLATE_ID IS NULL OR BMM.TEMPLATE_ID = '00000000-0000-0000-0000-000000000000')" + "" - + "WHERE BML.ENABLE = 1 AND (BML.TYPE NOT IN ('YXDT','DXDT','SLDT') OR BML.TYPE IS NULL) " + + "WHERE BML.ENABLE = 1 AND BML.IS_DELETED =0 AND (BML.TYPE NOT IN ('YXDT','DXDT','SLDT') OR BML.TYPE IS NULL) " + "ORDER BY BML.ORDER_INDEX" + "") List getMapLayerTree(@Param("moduleId") String moduleId, @Param("sid") String sid, diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java index 1ad9c34e..ef971c89 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendBizServiceImpl.java @@ -178,8 +178,8 @@ public class MapLegendBizServiceImpl implements IMapLegendBizService { collect.forEach((str, mapLegendVoList) -> { MapLegendVo mapLegendVo = new MapLegendVo(); mapLegendVo.setName(str); - mapLegendVo.setPSort(mapLegendVoList.get(0).getPSort()); - mapLegendVo.setLayerCode(finalLayerCodeMap.get(mapLegendVoList.get(0).getParentId())); + mapLegendVo.setPSort(mapLegendVoList.getFirst().getPSort()); + mapLegendVo.setLayerCode(finalLayerCodeMap.get(mapLegendVoList.getFirst().getParentId())); // 按子级分组名分组 Map> collect1 = mapLegendVoList.stream() .collect(Collectors.groupingBy(MapLegendVo::getGroupName)); @@ -188,7 +188,7 @@ public class MapLegendBizServiceImpl implements IMapLegendBizService { List list1 = collect1.get(groupNameStr); // 如果子级和父级名称相同,则不用子级 if (groupNameStr.equalsIgnoreCase(str)) { - childrenList = list1; + childrenList.addAll(list1); } else { MapLegendVo mapLegendVoChild = new MapLegendVo(); mapLegendVoChild.setName(groupNameStr); diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java index 5152e819..29b8e0f9 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java @@ -11,10 +11,13 @@ import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplegendBMapper; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMapmoduleBMapper; import com.yfd.platform.qgc_sys.mapLayer.service.IMapLegendService; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /** * 地图图例基础服务实现 @@ -71,7 +74,7 @@ public class MapLegendServiceImpl extends ServiceImpl siblingWrapper = new LambdaQueryWrapper<>(); - siblingWrapper.eq(MsMaplegendB::getParentId, parent.getId()); + siblingWrapper.eq(MsMaplegendB::getParentId, parent.getId()) + .eq(MsMaplegendB::getIsDeleted, 0); List siblings = this.list(siblingWrapper); if (siblings.size() == 1 && id.equals(siblings.get(0).getId())) { MsMaplegendB updateParent = new MsMaplegendB(); @@ -94,4 +98,143 @@ public class MapLegendServiceImpl extends ServiceImpl list = getSubLegendList(legend.getParentId()); + Integer maxOrderIndex = getMaxOrderIndex(list); + legend.setOrderIndex(maxOrderIndex + 1); + MsMaplegendB parentLegend = null; + if (StrUtil.isNotBlank(legend.getParentId())) { + parentLegend = this.getById(legend.getParentId()); + if (parentLegend == null) { + throw new BizException("获取父级图例信息失败.请检查父级图例(parentId)是否存在."); + } + legend.setFullPath(parentLegend.getFullPath() + legend.getId() + ","); + legend.setTreeLevel(parentLegend.getTreeLevel() + 1); + legend.setHasChildren(0); + } else { + legend.setTreeLevel(1); + legend.setFullPath(legend.getId() + ","); + legend.setHasChildren(0); + } + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + legend.setParentName(legend.getName()); + } else { + String fullPath = parentLegend.getFullPath(); + if (StrUtil.isNotBlank(fullPath)) { + String[] path = fullPath.split(","); + if (path.length == 1) { + legend.setGroupName(parentLegend.getName()); + legend.setParentName(parentLegend.getName()); + } else if (path.length == 2) { + legend.setGroupName(parentLegend.getName()); + MsMaplegendB root = this.getById(path[0]); + if (root == null) { + legend.setParentName(parentLegend.getParentName()); + } else { + legend.setParentName(root.getName()); + } + } + } + } + if (parentLegend != null && StrUtil.isBlank(legend.getLayerCode())) { + legend.setLayerCode(parentLegend.getLayerCode()); + } + legend.setIfShow(0); + legend.setInternal(0); + legend.setEnable(0); + legend.setRecordUser(SecurityUtils.getUserId()); + legend.setModifyUser(SecurityUtils.getUserId()); + this.save(legend); + if (parentLegend != null) { + MsMaplegendB temp = new MsMaplegendB(); + temp.setId(parentLegend.getId()); + temp.setHasChildren(1); + this.updateById(temp); + } + } + return true; + } + + private void updateSetLegend(MsMaplegendB legend) { + if (StrUtil.isNotBlank(legend.getParentId())) { + MsMaplegendB parent = this.getById(legend.getParentId()); + if (parent != null) { + if (legend.getDataType() == 1) { + legend.setParentName(parent.getName()); + legend.setFullPath(parent.getFullPath() + legend.getId() + ","); + } else { + legend.setGroupName(parent.getName()); + if (StrUtil.isNotBlank(parent.getFullPath())) { + MsMaplegendB root = this.getById(parent.getFullPath().split(",")[0]); + if (root != null) { + legend.setParentName(root.getName()); + } + legend.setFullPath(parent.getFullPath() + legend.getId() + ","); + } + } + if (StrUtil.isNotBlank(legend.getFullPath())) { + legend.setTreeLevel(legend.getFullPath().split(",").length); + } + } + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + } + } else { + if (legend.getDataType() == 1) { + legend.setGroupName(legend.getName()); + legend.setParentName(legend.getName()); + } + legend.setFullPath(legend.getId() + ","); + legend.setTreeLevel(1); + } + } + + public List getSubLegendList(String parentId) { + if (StrUtil.isNotBlank(parentId)) { + return this.lambdaQuery() + .eq(MsMaplegendB::getParentId, parentId) + .orderByAsc(MsMaplegendB::getOrderIndex) + .list(); + } else { + return this.lambdaQuery() + .eq(MsMaplegendB::getTreeLevel, 1) + .orderByAsc(MsMaplegendB::getOrderIndex) + .list(); + } + } + + public Integer getMaxOrderIndex(List list) { + if (CollectionUtil.isEmpty(list)) { + return 0; + } else { + return list.stream() + .sorted(Comparator.comparing(MsMaplegendB::getOrderIndex).reversed()) + .toList() + .getFirst() + .getOrderIndex(); + } + } + + public boolean hasSameCode(MsMaplegendB legend) { + List list = this.lambdaQuery() + .eq(MsMaplegendB::getNameEn, legend.getNameEn()) + .list(); + return !CollectionUtil.isEmpty(list) && !list.get(0).getId().equals(legend.getId()); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java index dc0d0a9f..63a368fe 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java @@ -68,8 +68,10 @@ public class MapmoduleBController { // 3. 执行分页查询 Page resultPage; if (page != null) { + wrapper.eq("IS_DELETED", 0); resultPage = mapmoduleBService.page(page, wrapper); } else { + wrapper.eq("IS_DELETED", 0); List list = mapmoduleBService.list(wrapper); resultPage = new Page<>(); resultPage.setRecords(list); diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java index 20f531d7..de1c5d31 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Random; +import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -162,7 +163,7 @@ public class SmsVerifyCodeServiceImpl extends ServiceImpl validPhones = sysUsers.stream().map(SysUser::getPhone).filter(this::isValidPhone).toList(); + Set validPhones = sysUsers.stream().map(SysUser::getPhone).filter(this::isValidPhone).collect(Collectors.toSet()); if (validPhones.isEmpty()) { log.warn("催促短信发送失败:没有合规的手机号"); diff --git a/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java b/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java new file mode 100644 index 00000000..092f3493 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/UUIDUtil.java @@ -0,0 +1,43 @@ +package com.yfd.platform.utils; + +import java.util.UUID; + +public class UUIDUtil { + public UUIDUtil() { + } + + public static String generateTenantUUID(String tenantId) { + return tenantId + generateUUID(); + } + + public static String generateUUID() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + public static String generateUUIDWithEnDash() { + return UUID.randomUUID().toString(); + } + + public static String generateUpperUUIDWithEnDash() { + return UUID.randomUUID().toString().toUpperCase(); + } + + public static boolean checkUuid(String uuid) { + boolean isUuid = false; + return uuid.matches("([0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}?)") ? true : isUuid; + } + + public static String md5ToUUID(String md5) { + if (!StringUtils.isBlank(md5) && md5.length() == 32) { + md5 = md5.toUpperCase(); + String var1 = md5.substring(0, 8); + String var2 = md5.substring(8, 12); + String var3 = md5.substring(12, 16); + String var4 = md5.substring(16, 20); + String var5 = md5.substring(20); + return var1 + "-" + var2 + "-" + var3 + "-" + var4 + "-" + var5; + } else { + return null; + } + } +} \ No newline at end of file diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml index 597cd003..609aa2bc 100644 --- a/backend/src/main/resources/application-devtw.yml +++ b/backend/src/main/resources/application-devtw.yml @@ -111,6 +111,19 @@ spring: mvc: pathmatch: matching-strategy: ant_path_matcher + data: + redis: + host: "${REDIS_HOST:172.16.21.142}" + port: "${REDIS_PORT:6379}" + password: "${REDIS_PASSWORD:zny5678}" + database: "${REDIS_DATABASE:15}" + timeout: 10000ms + lettuce: + pool: + max-active: 8 + max-idle: 8 + min-idle: 2 + max-wait: 10000ms servlet: multipart: max-file-size: 300MB diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index 48e5a037..a08b5045 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -111,10 +111,10 @@ spring: matching-strategy: ant_path_matcher data: redis: - host: ${REDIS_HOST:172.16.21.142} - port: ${REDIS_PORT:6379} - password: ${REDIS_PASSWORD:zny5678} - database: ${REDIS_DATABASE:15} + host: "${REDIS_HOST:172.16.21.142}" + port: "${REDIS_PORT:6379}" + password: "${REDIS_PASSWORD:zny5678}" + database: "${REDIS_DATABASE:15}" timeout: 10000ms lettuce: pool: diff --git a/frontend-sjtb/.env.development b/frontend-sjtb/.env.development index 6f8bd729..083fa926 100644 --- a/frontend-sjtb/.env.development +++ b/frontend-sjtb/.env.development @@ -7,7 +7,7 @@ VITE_APP_TITLE = '水电水利建设项目全过程环境管理信息平台' VITE_APP_PORT = 3000 VITE_APP_BASE_API = '/dev-api' # 本地环境 -VITE_APP_BASE_URL = 'http://10.84.121.127:8093' +VITE_APP_BASE_URL = 'http://10.84.111.235:8093' # 测试环境 # VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' diff --git a/frontend/.env.development b/frontend/.env.development index b9d4b82d..27f26cbe 100644 --- a/frontend/.env.development +++ b/frontend/.env.development @@ -7,17 +7,14 @@ VITE_APP_TITLE = '水电水利建设项目全过程环境管理信息平台' VITE_APP_PORT = 3000 VITE_APP_BASE_API = '/dev-api' # 本地环境 -# VITE_APP_BASE_URL = 'http://172.16.54.1:8093' +# VITE_APP_BASE_URL = 'http://localhost:8093' # 测试环境 # VITE_APP_BASE_URL = 'http://172.16.21.142:8093' # VITE_APP_BASE_URL = 'http://172.16.21.142:8096' # 汤伟 -VITE_APP_BASE_URL = 'http://10.84.121.127:8093' +# VITE_APP_BASE_URL = 'http://10.84.111.235:8093' # 李林 -# VITE_APP_BASE_URL = 'http://10.84.121.43:8093' -# VITE_APP_BASE_URL = 'http://192.168.1.162:8093' -# 李林 -# VITE_APP_BASE_URL = 'http://10.84.121.43:8093' +VITE_APP_BASE_URL = 'http://10.84.111.25:8093' # 测试环境线上10.84.121.122: VITE_APP_TEST_ONLINE_URL = 'https://211.99.26.225:12122' diff --git a/frontend/docs/问题.md b/frontend/docs/问题.md index d3f62f2a..64508204 100644 --- a/frontend/docs/问题.md +++ b/frontend/docs/问题.md @@ -24,9 +24,11 @@ | 2026-06-26 |
| 14 | 地图抽吸 碰撞检测 放大到具体层级锚点抽吸了但是 popup 弹框还在显示 | ⚠ |
| | 2026-06-26 |
| 15 | 地图比如积石峡 放大到层级被公伯峡隐藏掉了,然后在放大才显示 抽吸的问题 | ⚠ |
| | 2026-06-26 |
| 16 | 运行情况 计划开始运行时间 接口没接 | ⚠ |
| -| 2026-07-01 | 王 | 17 | 所有弹框加拖动 |
|
| -| 2026-07-01 | 王 | 18 | 所有弹框检查宽度有的是固定的 |
|
| +| 2026-07-01 | 王 | 17 | 所有弹框加拖动 | ✅ |
| +| 2026-07-01 | 王 | 18 | 所有弹框检查宽度有的是固定的 | ✅ |
| +| 2026-07-01 | 王 | 18 | 所有导出的添加 |
|
| | 2026-07-02 | 扈 | 19 | 地图点击基地切换偶发性会全部展示出来所有锚点 |
|
| +| 2026-07-03 | 汤 | 20 | 图例数据关了选中配置需要添加一个字段是默认不显示 |
|
| --- diff --git a/frontend/src/api/select/index.ts b/frontend/src/api/select/index.ts index 647e773e..d322e8e1 100644 --- a/frontend/src/api/select/index.ts +++ b/frontend/src/api/select/index.ts @@ -1,5 +1,5 @@ import request from '@/utils/request'; -//水电基地数据获取 +//水电基地数据获取 export function wbsbGetKendoList(data: any) { return request({ url: '/env/hydrobase/wbsb/GetKendoList', @@ -106,3 +106,11 @@ export function uploadFile(data: any) { headers: { 'Content-Type': 'multipart/form-data' } }); } +// 所在位置下拉列表 +export function getAddvcdDropdownByRvcd(params: any) { + return request({ + url: '/base/msalongb/noAuth/GetKendoList', + method: 'post', + params + }); +} diff --git a/frontend/src/api/system/map/ConfigManagement/index.ts b/frontend/src/api/system/map/ConfigManagement/index.ts index d9549aed..bed99f3b 100644 --- a/frontend/src/api/system/map/ConfigManagement/index.ts +++ b/frontend/src/api/system/map/ConfigManagement/index.ts @@ -3,7 +3,7 @@ import request from '@/utils/request'; // 获取所有沿程配置数据 export function getAllConfigTree(data: any) { return request({ - url: '/api/dec-lygk-base-server/base/msalongb/GetKendoList', + url: '/base/msalongb/GetKendoList', method: 'post', data: data }); @@ -11,7 +11,7 @@ export function getAllConfigTree(data: any) { // 保存沿程配置 export function saveBaseWbsb(data: any) { return request({ - url: '/api/dec-lygk-base-server/base/wbsb/addOrUpdate', + url: '/base/msalongb/save', method: 'post', data: data }); @@ -19,8 +19,24 @@ export function saveBaseWbsb(data: any) { // 删除沿程配置 export function deleteBaseWbsb(data: any) { return request({ - url: '/api/dec-lygk-base-server/base/wbsb/delete', - method: 'get', - params: data + url: '/base/msalongb/delete', + method: 'post', + data + }); +} +// 保存沿程配置子节点 +export function saveBaseWbsbChild(data: any) { + return request({ + url: '/base/msalongb/save', + method: 'post', + data: data + }); +} + +export function saveBaseWbsbChildDetail(data: any) { + return request({ + url: '/base/msalongdetb/save', + method: 'post', + data: data }); } diff --git a/frontend/src/api/zzfl/index.ts b/frontend/src/api/zzfl/index.ts index 426de90f..dcf647e0 100644 --- a/frontend/src/api/zzfl/index.ts +++ b/frontend/src/api/zzfl/index.ts @@ -26,7 +26,7 @@ export function overviewGetOverviewSecond(data: any) { data }); } -//增殖站介绍 /api/dec-lygk-base-server/base/msstbprpt/GetKendoList +//增殖站介绍 export function msstbprptGetKendoList(data: any) { return request({ url: '/fb/msstbprpt/GetKendoList', @@ -34,7 +34,7 @@ export function msstbprptGetKendoList(data: any) { data }); } -// 增殖站运行数据统计 +// 增殖站运行数据统计 export function qgcgetFbStaticsData(data: any) { return request({ url: '/fb/station/qgc/getFbStaticsData', @@ -73,4 +73,4 @@ export function msfbrdmGetKendoListCust(data: any) { method: 'post', data }); -} \ No newline at end of file +} diff --git a/frontend/src/components/BasicSearch/index.vue b/frontend/src/components/BasicSearch/index.vue index 70e421bd..1a500565 100644 --- a/frontend/src/components/BasicSearch/index.vue +++ b/frontend/src/components/BasicSearch/index.vue @@ -177,7 +177,84 @@ + +
+ + + + + {{ opt.basename }} + + + + + + {{ opt.ennm }},{{ opt.reachcdName }} + + + + + + {{ opt.ennm }} + + + +
+ + + + + + + +
+ +
+
+ + + +
+ +
+
+ + + + + diff --git a/frontend/src/components/MapModal/components/AIYXSB/index.vue b/frontend/src/components/MapModal/components/AIYXSB/index.vue index fddb65fd..921b2525 100644 --- a/frontend/src/components/MapModal/components/AIYXSB/index.vue +++ b/frontend/src/components/MapModal/components/AIYXSB/index.vue @@ -245,6 +245,7 @@ import { useModelStore } from '@/store/modules/model'; import videoCover from '@/assets/images/videFm.jpg'; import MediaViewer from './MediaViewer.vue'; import AttachmentPreview from './AttachmentPreview.vue'; +import { useDraggable } from '@/utils/drag'; const modelStore = useModelStore(); @@ -875,7 +876,8 @@ const notRunningMediaViewerRef = ref(); // 附件预览弹窗 const attachmentModalVisible = ref(false); const currentAttachmentFid = ref(''); - +useDraggable(detailModalVisible, { boundary: true, resetOnOpen: true }); +useDraggable(attachmentModalVisible, { boundary: true, resetOnOpen: true }); // 查看附件 const handleViewAttachment = (record: any) => { if (!record.fid) { diff --git a/frontend/src/components/MapModal/components/BasicInfo.vue b/frontend/src/components/MapModal/components/BasicInfo.vue index c66884fa..70a185dd 100644 --- a/frontend/src/components/MapModal/components/BasicInfo.vue +++ b/frontend/src/components/MapModal/components/BasicInfo.vue @@ -152,7 +152,7 @@ import { getStcdDetail } from '@/api/mapModal'; const baseUrl = import.meta.env.VITE_APP_ATTACHMENT_URL; const modelStore = useModelStore(); const hasLoaded = ref(false); // 标记是否已经请求过 - +import { useDraggable } from '@/utils/drag'; const props = defineProps({ url: { type: String, @@ -168,6 +168,7 @@ const isLogo = ref(false); const loading = ref(false); const data2: any = ref({}); const tabledata = ref([]); +useDraggable(visible, { boundary: true, resetOnOpen: true }); const columnsConfig = ref([ { type: 'ENG', diff --git a/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue b/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue index e3e3bb4c..a9e993cb 100644 --- a/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue +++ b/frontend/src/components/MapModal/components/FishFacilityMonitorData.vue @@ -56,6 +56,7 @@ import { getMonitorDataFpq, getMonitorDataOnline } from '@/api/mapModal'; import { useModelStore } from '@/store/modules/model'; import { DateSetting } from '@/utils/enumeration'; import dayjs from 'dayjs'; +import { useDraggable } from '@/utils/drag'; const loading = ref(false); const modelStore = useModelStore(); @@ -72,7 +73,8 @@ const previewImageUrl = ref(''); // 视频预览 const videoPreviewVisible = ref(false); const previewVideoUrl = ref(''); - +useDraggable(imagePreviewVisible, { boundary: true, resetOnOpen: true }); +useDraggable(videoPreviewVisible, { boundary: true, resetOnOpen: true }); const openImagePreview = (url: string) => { previewImageUrl.value = import.meta.env.VITE_APP_ATTACHMENT_URL + '/?' + url; imagePreviewVisible.value = true; diff --git a/frontend/src/components/MapModal/components/FishFacilityRunState.vue b/frontend/src/components/MapModal/components/FishFacilityRunState.vue index 9354ccfb..f93afe69 100644 --- a/frontend/src/components/MapModal/components/FishFacilityRunState.vue +++ b/frontend/src/components/MapModal/components/FishFacilityRunState.vue @@ -102,6 +102,7 @@ import { getDictItemsByCode } from '@/api/dict'; import { getFishDictoryDropdown } from '@/api/select'; import { useModelStore } from '@/store/modules/model'; import dayjs from 'dayjs'; +import { useDraggable } from '@/utils/drag'; const loading = ref(false); const modelStore = useModelStore(); @@ -125,7 +126,8 @@ const previewImageUrl = ref(''); // 视频预览 const videoPreviewVisible = ref(false); const currentVideoUrl = ref(''); - +useDraggable(imagePreviewVisible, { boundary: true, resetOnOpen: true }); +useDraggable(videoPreviewVisible, { boundary: true, resetOnOpen: true }); // 鱼类搜索过滤 const filterFtpOption = (input: string, option: any) => { console.log('filterOption', input, option); diff --git a/frontend/src/components/MapModal/components/FlowMeasure.vue b/frontend/src/components/MapModal/components/FlowMeasure.vue index b3908191..b5d619ef 100644 --- a/frontend/src/components/MapModal/components/FlowMeasure.vue +++ b/frontend/src/components/MapModal/components/FlowMeasure.vue @@ -79,6 +79,7 @@ import { queryPostUrlList } from '@/api/mapModal'; import { useModelStore } from '@/store/modules/model'; import BasicTable from '@/components/BasicTable/index.vue'; import { DateSetting } from '@/utils/enumeration'; +import { useDraggable } from '@/utils/drag'; const modelStore = useModelStore(); @@ -102,7 +103,7 @@ let chartInstance: echarts.ECharts | null = null; const videoModalVisible = ref(false); const videoModalTitle = ref(''); const currentVideoUrl = ref(''); - +useDraggable(videoModalVisible, { boundary: true, resetOnOpen: true }); const tabsList = [{ name: '流量监测', key: 'flowMeasure' }]; const activeTabKey = ref('flowMeasure'); diff --git a/frontend/src/components/MapModal/components/NormalOperationData/index.vue b/frontend/src/components/MapModal/components/NormalOperationData/index.vue index 432b1a4f..e99ef6b4 100644 --- a/frontend/src/components/MapModal/components/NormalOperationData/index.vue +++ b/frontend/src/components/MapModal/components/NormalOperationData/index.vue @@ -110,6 +110,7 @@ import { type OperationFilterField, type OperationTableItem } from './operationConfig'; +import { useDraggable } from '@/utils/drag'; const props = defineProps({ isActive: { type: Boolean, default: false } @@ -141,6 +142,7 @@ const loadYear = ref(false); const loadFtp = ref(false); const tableRef = ref(); const attachmentModalVisible = ref(false); +useDraggable(attachmentModalVisible, { boundary: true, resetOnOpen: true }); const currentAttachmentFid = ref(''); const fieldOptionsMap = reactive>({}); const selectLoadingMap = reactive>({}); diff --git a/frontend/src/components/developStatusChart/index.vue b/frontend/src/components/developStatusChart/index.vue index c9bb000d..70c329da 100644 --- a/frontend/src/components/developStatusChart/index.vue +++ b/frontend/src/components/developStatusChart/index.vue @@ -7,7 +7,7 @@ @@ -28,7 +28,7 @@ import * as echarts from 'echarts'; import { getVmsstbprptKendoList } from '@/api/home'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import ShuiDianKaiFQKTwoLayer from '@/modules/shuidianhuangjingjieruMod/TwoLayer/ShuiDianKaiFQKTwoLayer.vue'; - +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'developStatusChart' }); @@ -41,7 +41,7 @@ const dataLoading = ref(false); const modalVisible = ref(false); const modalProps = ref({}); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); function openModal(props: any) { modalProps.value = props; modalVisible.value = true; diff --git a/frontend/src/components/engEnvironmentData/index.vue b/frontend/src/components/engEnvironmentData/index.vue index b368b924..f28a244c 100644 --- a/frontend/src/components/engEnvironmentData/index.vue +++ b/frontend/src/components/engEnvironmentData/index.vue @@ -42,7 +42,7 @@ @@ -60,7 +60,7 @@ import { ref, watch } from 'vue'; import { getVmsstbprptKendoList } from '@/api/home'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import HuanJingSJJRQK from '@/modules/shuidianhuangjingjieruMod/TwoLayer/HuanJingSJJRQK.vue'; - +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'EngEnvironmentData' }); @@ -72,7 +72,7 @@ const data = ref>({ one: 0, two: 0, three: 0 }); const modalVisible = ref(false); const modalProps = ref({}); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); function openModal(props: any) { modalProps.value = props; modalVisible.value = true; diff --git a/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue b/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue index d65599df..4a82d2cd 100644 --- a/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue +++ b/frontend/src/modules/DongWuJiuZhuZhan/JiuZhuZhanQingKuangJieShao.vue @@ -63,6 +63,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { vpcGetKendoListCust } from '@/api/zxdzw'; import ArtsDetail from '@/components/carouselIntroduce/ArtsDetail.vue'; +import { useDraggable } from '@/utils/drag'; // 定义组件名(便于调试和递归) defineOptions({ @@ -83,7 +84,7 @@ const baseid = ref(''); // 弹框控制 const modalVisible = ref(false); const currentItem = ref(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 加载状态 const loading = ref(false); diff --git a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue index e871f270..912ca453 100644 --- a/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue +++ b/frontend/src/modules/EnvironmentalQuality/TwoLayers/EnvironmentalQualityTwoLayers.vue @@ -109,6 +109,7 @@ import isSameOrAfter from 'dayjs/plugin/isSameOrAfter' import BasicTable from '@/components/BasicTable/index.vue' import { wqGetKendoList } from '@/api/sz' import HJMZDTwoLays from "./HJMZDTwoLays.vue" +import { useDraggable } from '@/utils/drag'; // 注册 dayjs 插件 dayjs.extend(isSameOrAfter) @@ -155,7 +156,7 @@ const detailModalVisible = ref(false) const detailData = ref({}) const mapModalVisible = ref(false) const mapModalData = ref({}) - +useDraggable(detailModalVisible, { boundary: true, resetOnOpen: true }); // 排序配置 const sortConfig = computed(() => [ { field: 'rstcdStepSort', dir: 'asc' }, diff --git a/frontend/src/modules/EnvironmentalQuality/index.vue b/frontend/src/modules/EnvironmentalQuality/index.vue index d2c9a511..814a5bcc 100644 --- a/frontend/src/modules/EnvironmentalQuality/index.vue +++ b/frontend/src/modules/EnvironmentalQuality/index.vue @@ -36,6 +36,8 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { wqGetKendoListCust } from '@/api/sz' import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; import EnvironmentalQualityTwoLayers from "./TwoLayers/EnvironmentalQualityTwoLayers.vue" +import { useDraggable } from '@/utils/drag'; + // 定义组件名(便于调试和递归) defineOptions({ name: 'EnvironmentalQuality' @@ -774,7 +776,7 @@ onUnmounted(() => { // 弹框相关状态 const modalVisible = ref(false); const clickedBarData = ref<{ name: string; current: number | null; lastYear: number | null; selectedId?: string } | null>(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); diff --git a/frontend/src/modules/GYZLLB/index.vue b/frontend/src/modules/GYZLLB/index.vue index 91f70884..bfa7ed5d 100644 --- a/frontend/src/modules/GYZLLB/index.vue +++ b/frontend/src/modules/GYZLLB/index.vue @@ -1,77 +1,60 @@ diff --git a/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue b/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue index 2ace8474..4933ef49 100644 --- a/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue +++ b/frontend/src/modules/ZhenXiZhiWuYuanMod/ZhiWuYuanJianSheJiJieRuQingKuangBar/index.vue @@ -32,6 +32,7 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { vpcGetKendoListCust } from '@/api/zxdzw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import ZhiWuYuanDetailTable from './ZhiWuYuanDetailTable.vue'; +import { useDraggable } from '@/utils/drag'; // 定义组件名(便于调试和递归) defineOptions({ @@ -50,7 +51,7 @@ const loading = ref(false); // 弹窗状态 const modalVisible = ref(false); const modalJidi = ref('all'); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 基地选项(用于弹窗中的下拉) const jidiOptions = ref([]); diff --git a/frontend/src/modules/alongFishMod/index.vue b/frontend/src/modules/alongFishMod/index.vue index f0d3adc2..2ca8e91d 100644 --- a/frontend/src/modules/alongFishMod/index.vue +++ b/frontend/src/modules/alongFishMod/index.vue @@ -54,6 +54,7 @@ import Yanchengyulei from './TwoLayers/Yanchengyulei.vue'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import { wbsbGetKendoList, getDftYear, fishChanges2 } from '@/api/stdc'; import moment from 'moment'; +import { useDraggable } from '@/utils/drag'; defineOptions({ name: 'alongFishMod' @@ -108,7 +109,7 @@ const modalHbrvcd = ref(''); const modalStateName = ref(''); const modalSectionName = ref(''); const modalStcd = ref(''); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // ==================== 图表相关 ==================== /** diff --git a/frontend/src/modules/churukushuiwenMod/index.vue b/frontend/src/modules/churukushuiwenMod/index.vue index 388895b7..abf6cc30 100644 --- a/frontend/src/modules/churukushuiwenMod/index.vue +++ b/frontend/src/modules/churukushuiwenMod/index.vue @@ -53,6 +53,8 @@ import { getVmsstbprpt, inOutOneGetKendoListCust } from '@/api/sw'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import churukushuiwen from './churukushuiwen.vue'; import { MapClass } from '@/components/gis/map.class'; +import { useDraggable } from '@/utils/drag'; + // ==================== 组件基础配置 ==================== // 定义组件名(便于调试和递归) defineOptions({ @@ -96,7 +98,7 @@ const modalVisible = ref(false); // 弹框显示状态 const clickDataInfo = ref(null); // 点击的数据点信息 const stationName = ref(''); // 站点名称 // ==================== 数据处理函数 ==================== - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); /** * 转换图表数据格式 * 将后端返回的扁平数据结构转换为ECharts所需的双线数据格式 diff --git a/frontend/src/modules/dianxingcuoshijieshao/index.vue b/frontend/src/modules/dianxingcuoshijieshao/index.vue index 44cc22b1..5cd9c2b8 100644 --- a/frontend/src/modules/dianxingcuoshijieshao/index.vue +++ b/frontend/src/modules/dianxingcuoshijieshao/index.vue @@ -2,7 +2,7 @@ @@ -296,8 +304,12 @@ onUnmounted(() => { } .empty-container { display: flex; + flex-direction: column; justify-content: center; align-items: center; height: 200px; + p{ + text-indent:0px !important; + } } diff --git a/frontend/src/modules/fishSurvey/FishIntroduce/index.vue b/frontend/src/modules/fishSurvey/FishIntroduce/index.vue index e910b751..3b90254a 100644 --- a/frontend/src/modules/fishSurvey/FishIntroduce/index.vue +++ b/frontend/src/modules/fishSurvey/FishIntroduce/index.vue @@ -68,6 +68,8 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { fishDicGetKendoList, wbsbGetKendoList } from '@/api/yldc'; import { useJidiSelectEventStore } from '@/store/modules/jidiSelectEvent'; import ArtsDetail from '@/components/carouselIntroduce/ArtsDetail.vue'; +import { useDraggable } from '@/utils/drag'; + // 定义组件名(便于调试和递归) defineOptions({ name: 'zengZhiZhanJieShaoMod' @@ -87,7 +89,7 @@ let rvcd = ref(''); // 弹框控制 const modalVisible = ref(false); const currentItem = ref(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 加载状态 const loading = ref(false); diff --git a/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue b/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue index d2bca5f2..6e74c811 100644 --- a/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue +++ b/frontend/src/modules/fishSurvey/ZhuanZhiIntroduce/index.vue @@ -62,6 +62,8 @@ import { ref, onMounted, onUnmounted, computed } from 'vue'; import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { msstbprptGetKendoList } from '@/api/yldc'; import ArtsDetail from '@/components/carouselIntroduce/ArtsDetail.vue'; +import { useDraggable } from '@/utils/drag'; + // 定义组件名(便于调试和递归) defineOptions({ name: 'zengZhiZhanJieShaoMod' @@ -79,7 +81,7 @@ const baseUrl = import.meta.env.VITE_APP_ATTACHMENT_URL; // 弹框控制 const modalVisible = ref(false); const currentItem = ref(null); - +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 加载状态 const loading = ref(false); diff --git a/frontend/src/modules/guoyujiance/index.vue b/frontend/src/modules/guoyujiance/index.vue index f3c39485..aea4c041 100644 --- a/frontend/src/modules/guoyujiance/index.vue +++ b/frontend/src/modules/guoyujiance/index.vue @@ -36,6 +36,8 @@ import SidePanelItem from '@/components/SidePanelItem/index.vue'; import { vmsstbprptGetKendoList } from '@/api/gyss' import { useJidiSelectEventStore } from "@/store/modules/jidiSelectEvent"; import FPVDDetailMD from './components/FPVDDetailMD.vue' +import { useDraggable } from '@/utils/drag'; + // 定义组件名(便于调试和递归) defineOptions({ name: 'guoyusheshijiansheqingkuang' @@ -81,6 +83,7 @@ const loading = ref(false); const modalVisible = ref(false); const selectedFacility = ref(null); const title = ref(''); +useDraggable(modalVisible, { boundary: true, resetOnOpen: true }); // 处理卡片点击事件 const handleCardClick = (facility: any) => { selectedFacility.value = facility; diff --git a/frontend/src/modules/guoyusheshijiansheqingkuang/index.vue b/frontend/src/modules/guoyusheshijiansheqingkuang/index.vue index b7adca44..d75a84d1 100644 --- a/frontend/src/modules/guoyusheshijiansheqingkuang/index.vue +++ b/frontend/src/modules/guoyusheshijiansheqingkuang/index.vue @@ -1,201 +1,230 @@ \ No newline at end of file + diff --git a/frontend/src/modules/guoyusheshijieshao/index.vue b/frontend/src/modules/guoyusheshijieshao/index.vue index 1e30aa44..9f2b850d 100644 --- a/frontend/src/modules/guoyusheshijieshao/index.vue +++ b/frontend/src/modules/guoyusheshijieshao/index.vue @@ -1,76 +1,102 @@ + +
+ +
+ + + + +
+ {{ currentDescription }} +
+ + + + + + +
+ +
+
+ \ No newline at end of file + diff --git a/frontend/src/modules/huanbaoMod/index.vue b/frontend/src/modules/huanbaoMod/index.vue index d02f6001..32605966 100644 --- a/frontend/src/modules/huanbaoMod/index.vue +++ b/frontend/src/modules/huanbaoMod/index.vue @@ -1,5 +1,5 @@ -