diff --git a/backend/pom.xml b/backend/pom.xml index 3c5e33d..ec6855c 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -9,10 +9,10 @@ com.yfd - platform + qgc-platform 1.0 jar - platform + qgc-platform springboot 项目基础框架4.0.3 21 diff --git a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java index 90085ef..fb74d72 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java @@ -206,7 +206,7 @@ public class FishDraftData implements Serializable { * 设施名称 */ @TableField(exist = false) - private String fpname; + private String stnm; /** * 鱼类名称 diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index 338d3ce..fb6b136 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -59,7 +59,6 @@ public class FishImportServiceImpl implements IFishImportService { private static final Map FISH_DICT_CACHE = new LinkedHashMap<>(); private static final Map FPSS_BH_CACHE = new LinkedHashMap<>(); - private static final Map DIRECTION_DICT_CACHE = new LinkedHashMap<>(); private static final Map ISFS_DICT_CACHE = new LinkedHashMap<>(); private static final String DICT_CODE_FISH = "FISH_TYPE"; @@ -93,8 +92,8 @@ public class FishImportServiceImpl implements IFishImportService { EXCEL_COLUMN_INDEX_MAPPING.put(0, "baseName"); EXCEL_COLUMN_INDEX_MAPPING.put(1, "stationName"); - EXCEL_COLUMN_INDEX_MAPPING.put(2, "fpname"); - EXCEL_COLUMN_INDEX_MAPPING.put(3, "tm"); + EXCEL_COLUMN_INDEX_MAPPING.put(2, "stnm"); + EXCEL_COLUMN_INDEX_MAPPING.put(3, "strdt"); EXCEL_COLUMN_INDEX_MAPPING.put(4, "ftp"); EXCEL_COLUMN_INDEX_MAPPING.put(5, "isfs"); EXCEL_COLUMN_INDEX_MAPPING.put(6, "direction"); @@ -184,11 +183,12 @@ public class FishImportServiceImpl implements IFishImportService { switch (fieldName) { case "stationName": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("电站名称"); + importRow.getWarnings().add("engName"); + data.setEngName(cellValue.trim()); } else { String stcd = resolveStationCode(cellValue.trim()); if (stcd == null) { - importRow.getWarnings().add(fieldName); + importRow.getWarnings().add("engName"); data.setEngName(cellValue.trim()); } else { data.setEngName(cellValue.trim()); @@ -197,11 +197,13 @@ public class FishImportServiceImpl implements IFishImportService { break; case "baseName": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("水电基地"); + importRow.getWarnings().add("baseId"); + data.setBaseId(cellValue.trim()); + data.setBaseName(cellValue.trim()); } else { String baseId = resolveBaseCode(cellValue.trim()); if (baseId == null) { - importRow.getWarnings().add(fieldName); + importRow.getWarnings().add("baseId"); data.setBaseId(cellValue.trim()); data.setBaseName(cellValue.trim()); } else { @@ -215,6 +217,7 @@ public class FishImportServiceImpl implements IFishImportService { String rvcd = resolveRiverCode(cellValue.trim()); if (rvcd == null) { importRow.getWarnings().add(fieldName); + data.setRvcd(cellValue); } else { data.setRvcd(rvcd); } @@ -222,18 +225,20 @@ public class FishImportServiceImpl implements IFishImportService { break; case "tm": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("过鱼时间"); + importRow.getWarnings().add(fieldName); } else { Date tm = parseDate(cellValue); if (tm == null) { - importRow.getWarnings().add("过鱼时间格式错误: " + cellValue); + importRow.getWarnings().add(fieldName); } data.setTm(tm); } break; case "ftp": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("鱼种类"); + importRow.getWarnings().add(fieldName); + data.setFtp(cellValue.trim()); + data.setFtpName(cellValue.trim()); } else { String stcd = resolveFishDictCode(cellValue.trim()); if (stcd == null) { @@ -251,7 +256,8 @@ public class FishImportServiceImpl implements IFishImportService { break; case "fcnt": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("过鱼数量"); + importRow.getWarnings().add(fieldName); + data.setFcnt(parseInteger(cellValue)); } else { Integer fcnt = parseInteger(cellValue); if (fcnt == null) { @@ -265,14 +271,23 @@ public class FishImportServiceImpl implements IFishImportService { data.setFwet(cellValue.trim()); break; case "strdt": - data.setStrdt(parseDate(cellValue)); + if (!StringUtils.hasText(cellValue)) { + importRow.getWarnings().add(fieldName); + } else { + Date strdt = parseDate(cellValue); + if (strdt == null) { + importRow.getWarnings().add(fieldName); + } + data.setStrdt(strdt); + } break; case "enddt": data.setEnddt(parseDate(cellValue)); break; case "direction": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("游向"); + importRow.getWarnings().add(fieldName); + data.setDirection(cellValue.trim()); } else { String direction = resolveDirection(cellValue.trim(), importRow); data.setDirection(direction); @@ -299,17 +314,17 @@ public class FishImportServiceImpl implements IFishImportService { case "sourceType": data.setSourceType(parseSourceType(cellValue.trim())); break; - case "fpname": + case "stnm": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("过鱼设施名称"); + missingRequiredFields.add("stcd"); } else { String stcd = resolveFpssCode(cellValue.trim()); if (stcd == null) { - importRow.getWarnings().add(fieldName); + importRow.getWarnings().add("stcd"); data.setStcd(cellValue.trim()); - data.setFpname(cellValue.trim()); + data.setStnm(cellValue.trim()); } else { - data.setFpname(stcd); + data.setStnm(stcd); data.setStcd(stcd); } } @@ -507,28 +522,16 @@ public class FishImportServiceImpl implements IFishImportService { } String lowerName = direction.toLowerCase().trim(); - if (!DIRECTION_DICT_CACHE.isEmpty()) { - if (DIRECTION_DICT_CACHE.containsKey(lowerName)) { - return DIRECTION_DICT_CACHE.get(lowerName); - } - for (Map.Entry entry : DIRECTION_DICT_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { - return entry.getValue(); - } - } - } - if (lowerName.contains("上行") && lowerName.contains("折返")) { - return "上行折返"; + return "03"; } else if (lowerName.contains("下行") && lowerName.contains("折返")) { - return "下行折返"; + return "04"; } else if (lowerName.contains("上行")) { - return "上行"; + return "01"; } else if (lowerName.contains("下行")) { - return "下行"; + return "02"; } - - importRow.getWarnings().add("无法识别的游向: " + direction + ",请手动选择"); + importRow.getWarnings().add("direction"); return direction; } @@ -537,25 +540,12 @@ public class FishImportServiceImpl implements IFishImportService { return null; } String lowerName = value.toLowerCase().trim(); - - if (!ISFS_DICT_CACHE.isEmpty()) { - if (ISFS_DICT_CACHE.containsKey(lowerName)) { - return ISFS_DICT_CACHE.get(lowerName); - } - for (Map.Entry entry : ISFS_DICT_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { - return entry.getValue(); - } - } + if (lowerName.equals("是")) { + return "1"; + } else if (lowerName.equals("否") ) { + return "0"; } - - if (lowerName.equals("1") || lowerName.equals("是") || lowerName.equals("yes") || lowerName.equals("true")) { - return "是"; - } else if (lowerName.equals("0") || lowerName.equals("否") || lowerName.equals("no") || lowerName.equals("false")) { - return "否"; - } - - importRow.getWarnings().add("无法识别的【是否鱼苗】值: " + value + ",将默认设置为【否】"); + importRow.getWarnings().add("isfs"); return "否"; } diff --git a/backend/src/main/java/com/yfd/platform/data/utils/ZipFileUtil.java b/backend/src/main/java/com/yfd/platform/data/utils/ZipFileUtil.java index 137e293..4d921e9 100644 --- a/backend/src/main/java/com/yfd/platform/data/utils/ZipFileUtil.java +++ b/backend/src/main/java/com/yfd/platform/data/utils/ZipFileUtil.java @@ -1,5 +1,7 @@ package com.yfd.platform.data.utils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.*; @@ -14,11 +16,34 @@ import java.util.Map; import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; +@Component public class ZipFileUtil { - public static final String DEFAULT_TEMP_BASE = "D:\\zip_import_temp"; + private static String tempBaseDir; + + @Value("${app.zip-import.temp-dir:}") + public void setTempBaseDir(String tempDir) { + if (tempDir != null && !tempDir.trim().isEmpty()) { + ZipFileUtil.tempBaseDir = tempDir.trim(); + } + } + + public static String getDefaultTempDir() { + if (tempBaseDir != null && !tempBaseDir.isEmpty()) { + return tempBaseDir; + } + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")) { + return "D:\\zip_import_temp"; + } else { + return "/tmp/zip_import_temp"; + } + } + + public static String getTempBase() { + return getDefaultTempDir(); + } public static class ZipContent { public String excelFileName; @@ -42,12 +67,8 @@ public class ZipFileUtil { } } - public static String getDefaultTempDir() { - return DEFAULT_TEMP_BASE; - } - public static ZipContent extractZipToTemp(MultipartFile file) throws IOException { - return extractZipToTemp(file, DEFAULT_TEMP_BASE); + return extractZipToTemp(file, getDefaultTempDir()); } public static ZipContent extractZipToTemp(MultipartFile file, String baseTempDir) throws IOException { diff --git a/backend/src/main/java/com/yfd/platform/env/controller/TreeStructureController.java b/backend/src/main/java/com/yfd/platform/env/controller/TreeStructureController.java index f1c4b4b..6c64cbe 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/TreeStructureController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/TreeStructureController.java @@ -37,6 +37,15 @@ public class TreeStructureController { return ResponseResult.successData(result); } + @GetMapping("/baseEng") + @Operation(summary = "获取基地-电站树形结构") + public ResponseResult getBaseEngTree( + @RequestParam(required = false) String baseId, + @RequestParam(required = false) String engName) { + List> result = treeStructureService.getBaseEngTree(baseId, engName); + return ResponseResult.successData(result); + } + @GetMapping("/rvcdBaseEng") @Operation(summary = "获取流域-基地-电站树形结构") diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java index ab65aea..4f6eed1 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdEngInfoBH; import java.util.List; +import java.util.Set; /** *

@@ -38,6 +39,8 @@ public interface ISdEngInfoBHService extends IService { */ List selectForDropdown(String baseId, String ennm); + Set getUserAuthorizedStationCodes(); + /** * 新增电站 */ diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdFpssBHService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdFpssBHService.java index 6a7f464..7b37c27 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdFpssBHService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdFpssBHService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdFpssBH; import java.util.List; +import java.util.Set; public interface ISdFpssBHService extends IService { @@ -17,6 +18,8 @@ public interface ISdFpssBHService extends IService { */ List selectForDropdown(String rstcd, String stnm, String baseId); + Set getUserAuthorizedStationCodes(); + boolean add(SdFpssBH sdFpssBH); boolean updateById(SdFpssBH sdFpssBH); diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java index 92a94e3..096bee5 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdHydrobaseService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdHydrobase; import java.util.List; +import java.util.Set; /** *

@@ -33,6 +34,8 @@ public interface ISdHydrobaseService extends IService { */ List selectForDropdown(String basename); + Set getUserAuthorizedStationCodes(); + /** * 新增基地 */ diff --git a/backend/src/main/java/com/yfd/platform/env/service/ITreeStructureService.java b/backend/src/main/java/com/yfd/platform/env/service/ITreeStructureService.java index 360f88d..d6ca549 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ITreeStructureService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ITreeStructureService.java @@ -45,4 +45,11 @@ public interface ITreeStructureService { * @param engName 电站名称(可选,用于模糊筛选电站) */ List> getRvcdEngTree(String rvcd, String engName); + + /** + * 获取基地-电站树形结构(二级树) + * @param baseId 基地编码(可选,为空则返回全部) + * @param engName 电站名称(可选,用于模糊筛选电站) + */ + List> getBaseEngTree(String baseId, String engName); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java index 8b49d15..713b625 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java @@ -1,15 +1,23 @@ package com.yfd.platform.env.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.data.domain.SysUserDataScope; +import com.yfd.platform.data.mapper.SysUserDataScopeMapper; import com.yfd.platform.env.domain.SdEngInfoBH; import com.yfd.platform.env.mapper.SdEngInfoBHMapper; import com.yfd.platform.env.service.ISdEngInfoBHService; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** *

@@ -19,19 +27,26 @@ import java.util.List; @Service public class SdEngInfoBHServiceImpl extends ServiceImpl implements ISdEngInfoBHService { - @Resource private SdEngInfoBHMapper engInfoBHMapper; + @Resource + private SysUserDataScopeMapper sysUserDataScopeMapper; + @Override public Page queryPageList(Page page, String ennm, String rvcd, String baseId, String hycd) { - return this.page(page, this.lambdaQuery() - .like(ennm != null && !ennm.isEmpty(), SdEngInfoBH::getEnnm, ennm) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper .like(ennm != null && !ennm.isEmpty(), SdEngInfoBH::getEnnm, ennm) .eq(rvcd != null && !rvcd.isEmpty(), SdEngInfoBH::getRvcd, rvcd) .eq(baseId != null && !baseId.isEmpty(), SdEngInfoBH::getBaseId, baseId) .eq(hycd != null && !hycd.isEmpty(), SdEngInfoBH::getHycd, hycd) - .orderByAsc(SdEngInfoBH::getOrderIndex) - .getWrapper()); + .orderByAsc(SdEngInfoBH::getOrderIndex); + + Set authorizedStations = getUserAuthorizedStationCodes(); + if (authorizedStations != null && !authorizedStations.isEmpty()) { + wrapper.in(SdEngInfoBH::getStcd, authorizedStations); + } + return this.page(page, wrapper); } @Override @@ -51,12 +66,64 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl selectForDropdown(String baseId, String ennm) { - return this.lambdaQuery() - .eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) .like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm) .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm, SdEngInfoBH::getBaseId) - .orderByAsc(SdEngInfoBH::getOrderIndex) - .list(); + .orderByAsc(SdEngInfoBH::getOrderIndex); + + Set authorizedStations = getUserAuthorizedStationCodes(); + if (authorizedStations != null && !authorizedStations.isEmpty()) { + wrapper.in(SdEngInfoBH::getStcd, authorizedStations); + } else { + return new ArrayList<>(); + } + + return this.list(wrapper); + } + + @Override + public Set getUserAuthorizedStationCodes() { + String userId = SecurityUtils.getUserId(); + List sysUserDataScopes = sysUserDataScopeMapper.selectList( + new LambdaQueryWrapper() + .eq(SysUserDataScope::getUserId, userId) + .select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType) + ); + + if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) { + return new HashSet<>(); + } + + Set stationCodes = new HashSet<>(); + List basinCodes = new ArrayList<>(); + + for (SysUserDataScope scope : sysUserDataScopes) { + String orgType = scope.getOrgType(); + String orgId = scope.getOrgId(); + + if ("STATION".equals(orgType)) { + stationCodes.add(orgId); + } else if ("BASIN".equals(orgType)) { + basinCodes.add(orgId); + } + } + + if (!stationCodes.isEmpty()) { + return stationCodes; + } + + if (!basinCodes.isEmpty()) { + List engInfos = this.lambdaQuery() + .select(SdEngInfoBH::getStcd) + .in(SdEngInfoBH::getRvcd, basinCodes) + .list(); + return engInfos.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + } + + return stationCodes; } @Override diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java index da361a4..b70dc13 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFpssBHServiceImpl.java @@ -3,17 +3,33 @@ package com.yfd.platform.env.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.data.domain.SysUserDataScope; +import com.yfd.platform.data.mapper.SysUserDataScopeMapper; +import com.yfd.platform.env.domain.SdEngInfoBH; import com.yfd.platform.env.domain.SdFpssBH; +import com.yfd.platform.env.mapper.SdEngInfoBHMapper; import com.yfd.platform.env.mapper.SdFpssBHMapper; import com.yfd.platform.env.service.ISdFpssBHService; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; @Service public class SdFpssBHServiceImpl extends ServiceImpl implements ISdFpssBHService { + @Resource + private SysUserDataScopeMapper sysUserDataScopeMapper; + @Resource + private SdEngInfoBHMapper sdEngInfoBHMapper; + + @Override public Page selectPage(String stcd, String sttp, String rstcd, Integer usfl, Page page) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -31,6 +47,11 @@ public class SdFpssBHServiceImpl extends ServiceImpl i wrapper.eq(SdFpssBH::getUsfl, usfl); } + Set authorizedStations = getUserAuthorizedStationCodes(); + if (authorizedStations != null && !authorizedStations.isEmpty()) { + wrapper.in(SdFpssBH::getRstcd, authorizedStations); + } + wrapper.orderByDesc(SdFpssBH::getOrderIndex); return page(page, wrapper); } @@ -44,15 +65,72 @@ public class SdFpssBHServiceImpl extends ServiceImpl i @Override public List selectForDropdown(String rstcd, String stnm, String baseId) { + Set authorizedStations = getUserAuthorizedStationCodes(); + + if (authorizedStations == null || authorizedStations.isEmpty()) { + return new ArrayList<>(); + } + + List result; + if (StringUtils.hasText(baseId)) { - return baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId); + result = baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId); } else { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.hasText(rstcd), SdFpssBH::getRstcd, rstcd) .like(StringUtils.hasText(stnm), SdFpssBH::getStnm, stnm) .orderByDesc(SdFpssBH::getOrderIndex); - return list(wrapper); + result = list(wrapper); } + + return result.stream() + .filter(fpss -> authorizedStations.contains(fpss.getRstcd())) + .collect(Collectors.toList()); + } + + @Override + public Set getUserAuthorizedStationCodes() { + String userId = SecurityUtils.getUserId(); + List sysUserDataScopes = sysUserDataScopeMapper.selectList( + new LambdaQueryWrapper() + .eq(SysUserDataScope::getUserId, userId) + .select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType) + ); + + if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) { + return new HashSet<>(); + } + + Set stationCodes = new HashSet<>(); + List basinCodes = new ArrayList<>(); + + for (SysUserDataScope scope : sysUserDataScopes) { + String orgType = scope.getOrgType(); + String orgId = scope.getOrgId(); + + if ("STATION".equals(orgType)) { + stationCodes.add(orgId); + } else if ("BASIN".equals(orgType)) { + basinCodes.add(orgId); + } + } + + if (!stationCodes.isEmpty()) { + return stationCodes; + } + + if (!basinCodes.isEmpty()) { + List engInfos = sdEngInfoBHMapper.selectList( + new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd) + .in(SdEngInfoBH::getRvcd, basinCodes) + ); + return engInfos.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + } + + return stationCodes; } @Override diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java index 4236ea4..febc709 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHydrobaseServiceImpl.java @@ -1,14 +1,25 @@ package com.yfd.platform.env.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.data.domain.SysUserDataScope; +import com.yfd.platform.data.mapper.SysUserDataScopeMapper; +import com.yfd.platform.env.domain.SdEngInfoBH; import com.yfd.platform.env.domain.SdHydrobase; +import com.yfd.platform.env.mapper.SdEngInfoBHMapper; import com.yfd.platform.env.mapper.SdHydrobaseMapper; import com.yfd.platform.env.service.ISdHydrobaseService; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** *

@@ -18,6 +29,12 @@ import java.util.List; @Service public class SdHydrobaseServiceImpl extends ServiceImpl implements ISdHydrobaseService { + @Resource + private SysUserDataScopeMapper sysUserDataScopeMapper; + + @Resource + private SdEngInfoBHMapper sdEngInfoBHMapper; + @Override public Page queryPageList(Page page, String basename, String pbaseid) { return this.page(page, this.lambdaQuery() @@ -45,10 +62,81 @@ public class SdHydrobaseServiceImpl extends ServiceImpl selectForDropdown(String basename) { - return this.lambdaQuery() - .like(StringUtils.hasText(basename), SdHydrobase::getBasename, basename) - .orderByAsc(SdHydrobase::getOrderIndex) - .list(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (StringUtils.hasText(basename)) { + wrapper.like(SdHydrobase::getBasename, basename); + } + + Set authorizedStations = getUserAuthorizedStationCodes(); + + if (authorizedStations != null && !authorizedStations.isEmpty()) { + List engInfos = sdEngInfoBHMapper.selectList( + new LambdaQueryWrapper() + .select(SdEngInfoBH::getBaseId) + .in(SdEngInfoBH::getStcd, authorizedStations) + ); + List baseIds = engInfos.stream() + .map(SdEngInfoBH::getBaseId) + .filter(id -> id != null && !id.isEmpty()) + .distinct() + .collect(Collectors.toList()); + + if (!baseIds.isEmpty()) { + wrapper.in(SdHydrobase::getBaseid, baseIds); + } else { + return new ArrayList<>(); + } + } else { + return new ArrayList<>(); + } + wrapper.orderByAsc(SdHydrobase::getOrderIndex); + return this.list(wrapper); + } + + @Override + public Set getUserAuthorizedStationCodes() { + String userId = SecurityUtils.getUserId(); + List sysUserDataScopes = sysUserDataScopeMapper.selectList( + new LambdaQueryWrapper() + .eq(SysUserDataScope::getUserId, userId) + .select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType) + ); + + if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) { + return new HashSet<>(); + } + + Set stationCodes = new HashSet<>(); + List basinCodes = new ArrayList<>(); + + for (SysUserDataScope scope : sysUserDataScopes) { + String orgType = scope.getOrgType(); + String orgId = scope.getOrgId(); + + if ("STATION".equals(orgType)) { + stationCodes.add(orgId); + } else if ("BASIN".equals(orgType)) { + basinCodes.add(orgId); + } + } + + if (!stationCodes.isEmpty()) { + return stationCodes; + } + + if (!basinCodes.isEmpty()) { + List engInfos = sdEngInfoBHMapper.selectList( + new LambdaQueryWrapper() + .select(SdEngInfoBH::getStcd) + .in(SdEngInfoBH::getRvcd, basinCodes) + ); + return engInfos.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + } + + return stationCodes; } @Override diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java index 440687a..3cfe57d 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/TreeStructureServiceImpl.java @@ -426,5 +426,82 @@ public class TreeStructureServiceImpl implements ITreeStructureService { return result; } + @Override + public List> getBaseEngTree(String baseId, String engName) { + List> result = new ArrayList<>(); + + // 1. 查询基地列表 + List baseList; + if (StringUtils.hasText(baseId)) { + baseList = hydrobaseMapper.selectByPbaseid(baseId); + SdHydrobase singleBase = hydrobaseMapper.selectById(baseId); + if (singleBase != null && !baseList.contains(singleBase)) { + baseList = new ArrayList<>(); + baseList.add(singleBase); + } + } else { + baseList = hydrobaseMapper.selectRootList(); + } + + // 2. 预加载所有基地下的电站(按基地分组) + Map> baseEngMap = new HashMap<>(); + for (SdHydrobase hydrobase : baseList) { + List engList = engInfoBHMapper.selectByBaseId(hydrobase.getBaseid()); + + if (StringUtils.hasText(engName) && engList != null) { + engList = engList.stream() + .filter(eng -> eng.getEnnm() != null && eng.getEnnm().contains(engName)) + .collect(Collectors.toList()); + } + + if (engList != null && !engList.isEmpty()) { + baseEngMap.put(hydrobase.getBaseid(), engList); + } + } + + // 3. 构建二级树形结构(基地 -> 电站) + for (SdHydrobase hydrobase : baseList) { + Map baseNode = new LinkedHashMap<>(); + baseNode.put("type", "BASE"); + baseNode.put("code", hydrobase.getBaseid()); + baseNode.put("name", hydrobase.getBasename()); + baseNode.put("shortname", hydrobase.getShortname()); + baseNode.put("grd", hydrobase.getGrd()); + baseNode.put("path", hydrobase.getPath()); + baseNode.put("orgLevel", 0); + baseNode.put("parentId", "0"); + + // 获取该基地下的所有电站 + List engList = baseEngMap.get(hydrobase.getBaseid()); + List> engChildren = new ArrayList<>(); + + if (engList != null && !engList.isEmpty()) { + for (SdEngInfoBH eng : engList) { + Map engNode = new LinkedHashMap<>(); + engNode.put("type", "STATION"); + engNode.put("code", eng.getStcd()); + engNode.put("name", eng.getEnnm()); + engNode.put("lgtd", eng.getLgtd()); + engNode.put("lttd", eng.getLttd()); + engNode.put("elev", eng.getElev()); + engNode.put("usfl", eng.getUsfl()); + engNode.put("bldstt", eng.getBldstt()); + engNode.put("engtp", eng.getEngtp()); + engNode.put("parentId", hydrobase.getBaseid()); + engNode.put("orgLevel", 1); + engChildren.add(engNode); + } + } + + // 只有当该基地下有电站时才添加该基地节点 + if (!engChildren.isEmpty()) { + baseNode.put("children", engChildren); + result.add(baseNode); + } + } + + return result; + } + } diff --git a/backend/src/main/resources/application-dev.yml b/backend/src/main/resources/application-dev.yml index 37c1cdd..8d16f53 100644 --- a/backend/src/main/resources/application-dev.yml +++ b/backend/src/main/resources/application-dev.yml @@ -53,6 +53,9 @@ login: # 启动自动数据库初始化(仅 dev/server): app: + # ZIP导入临时目录配置 + zip-import: + temp-dir: ${ZIP_IMPORT_TEMP_DIR:D:\zip_import_temp} init: enabled: false schema: classpath:db-init/sql/min-schema.sql diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml new file mode 100644 index 0000000..8021243 --- /dev/null +++ b/backend/src/main/resources/application-prod.yml @@ -0,0 +1,119 @@ +server: + port: 8093 + +spring: + #应用名称 + application: + name: Project-plateform + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + master: + driverClassName: oracle.jdbc.OracleDriver + url: "${DB_MASTER_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + username: "${DB_MASTER_USERNAME:QGC_REFA}" + password: "${DB_MASTER_PASSWORD:Y4M4K1oCkL8U}" + slave: + driverClassName: oracle.jdbc.OracleDriver + url: "${DB_SLAVE_URL:jdbc:oracle:thin:@172.16.21.134:1521/SDLYZ}" + username: "${DB_SLAVE_USERNAME:QGC_REFA}" + password: "${DB_SLAVE_PASSWORD:Y4M4K1oCkL8U}" + + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + mvc: + pathmatch: + matching-strategy: ant_path_matcher + servlet: + multipart: + max-file-size: 30MB + max-request-size: 100MB + +logging: + file: + name: logs/projectname.log + level: + com.genersoft.iot: debug + com.genersoft.iot.vmp.storager.dao: info + com.genersoft.iot.vmp.gb28181: info + +# 在线文档: swagger-ui(生产环境建议关闭) +swagger-ui: + enabled: true + +mybatis-plus: +# mapper-locations: classpath*:**/mapper/*Mapper.xml,classpath*:**/mapping/*Mapper.xml + global-config: + banner: false + db-config: + id-type: ASSIGN_ID + insert-strategy: not_null + update-strategy: not_null + select-strategy: not_empty + table-underline: true + logic-delete-value: 1 + logic-not-delete-value: 0 + logic-delete-field: isDeleted + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + + +# 登录相关配置 +login: + # 登录缓存 + cache-enable: true + # 是否限制单用户登录 + single-login: false + # 验证码 + login-code: + # 验证码类型配置 查看 LoginProperties 类 + code-type: arithmetic + +# 启动自动数据库初始化(仅 dev/server): +app: + # ZIP导入临时目录配置 + zip-import: + temp-dir: ${ZIP_IMPORT_TEMP_DIR:/tmp/zip_import_temp} + init: + enabled: false + schema: classpath:db-init/sql/min-schema.sql + # data 文件可选;为避免复杂 dump 解析问题,先不导入 + # data: + marker-table: sys_user + marker-version: v1.0.0 + # 登录图形验证码有效时间/分钟 + expiration: 2 + # 验证码高度 + width: 111 + # 验证码宽度 + heigth: 36 + # 内容长度 + length: 2 + # 字体名称,为空则使用默认字体 + font-name: + # 字体大小 + font-size: 25 + +# IP 本地解析 +ip: + local-parsing: true + + +file-space: #项目文档空间 + files: D:\demoproject\files\ #单独上传的文件附件 + system: D:\demoproject\system\ #单独上传的文件 + +task: + pool: + # 核心线程池大小 + core-pool-size: 10 + # 最大线程数 + max-pool-size: 30 + # 活跃时间 + keep-alive-seconds: 60 + # 队列容量 + queue-capacity: 50 diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 8f42778..547f405 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: devtw + active: prod jasypt: encryptor: diff --git a/backend/src/main/resources/mapper/env/SdEngInfoBHMapper.xml b/backend/src/main/resources/mapper/env/SdEngInfoBHMapper.xml index 05bc17a..06101d4 100644 --- a/backend/src/main/resources/mapper/env/SdEngInfoBHMapper.xml +++ b/backend/src/main/resources/mapper/env/SdEngInfoBHMapper.xml @@ -233,7 +233,7 @@ diff --git a/backend/src/main/resources/mapper/env/SdHydrobaseMapper.xml b/backend/src/main/resources/mapper/env/SdHydrobaseMapper.xml index 953f2b6..3391d95 100644 --- a/backend/src/main/resources/mapper/env/SdHydrobaseMapper.xml +++ b/backend/src/main/resources/mapper/env/SdHydrobaseMapper.xml @@ -4,10 +4,10 @@ - + - +