Merge branch 'dev-tw'

This commit is contained in:
tangwei 2026-04-25 22:07:40 +08:00
commit 2bffb1e516
18 changed files with 550 additions and 82 deletions

View File

@ -9,10 +9,10 @@
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yfd</groupId>
<artifactId>platform</artifactId>
<artifactId>qgc-platform</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>platform</name>
<name>qgc-platform</name>
<description>springboot 项目基础框架4.0.3</description>
<properties>
<java.version>21</java.version>

View File

@ -206,7 +206,7 @@ public class FishDraftData implements Serializable {
* 设施名称
*/
@TableField(exist = false)
private String fpname;
private String stnm;
/**
* 鱼类名称

View File

@ -59,7 +59,6 @@ public class FishImportServiceImpl implements IFishImportService {
private static final Map<String, String> FISH_DICT_CACHE = new LinkedHashMap<>();
private static final Map<String, String> FPSS_BH_CACHE = new LinkedHashMap<>();
private static final Map<String, String> DIRECTION_DICT_CACHE = new LinkedHashMap<>();
private static final Map<String, String> 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<String, String> 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<String, String> 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 "";
}

View File

@ -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 {

View File

@ -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<Map<String, Object>> result = treeStructureService.getBaseEngTree(baseId, engName);
return ResponseResult.successData(result);
}
@GetMapping("/rvcdBaseEng")
@Operation(summary = "获取流域-基地-电站树形结构")

View File

@ -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;
/**
* <p>
@ -38,6 +39,8 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
*/
List<SdEngInfoBH> selectForDropdown(String baseId, String ennm);
Set<String> getUserAuthorizedStationCodes();
/**
* 新增电站
*/

View File

@ -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<SdFpssBH> {
@ -17,6 +18,8 @@ public interface ISdFpssBHService extends IService<SdFpssBH> {
*/
List<SdFpssBH> selectForDropdown(String rstcd, String stnm, String baseId);
Set<String> getUserAuthorizedStationCodes();
boolean add(SdFpssBH sdFpssBH);
boolean updateById(SdFpssBH sdFpssBH);

View File

@ -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;
/**
* <p>
@ -33,6 +34,8 @@ public interface ISdHydrobaseService extends IService<SdHydrobase> {
*/
List<SdHydrobase> selectForDropdown(String basename);
Set<String> getUserAuthorizedStationCodes();
/**
* 新增基地
*/

View File

@ -45,4 +45,11 @@ public interface ITreeStructureService {
* @param engName 电站名称可选用于模糊筛选电站
*/
List<Map<String, Object>> getRvcdEngTree(String rvcd, String engName);
/**
* 获取基地-电站树形结构二级树
* @param baseId 基地编码可选为空则返回全部
* @param engName 电站名称可选用于模糊筛选电站
*/
List<Map<String, Object>> getBaseEngTree(String baseId, String engName);
}

View File

@ -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;
/**
* <p>
@ -19,19 +27,26 @@ import java.util.List;
@Service
public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEngInfoBH> implements ISdEngInfoBHService {
@Resource
private SdEngInfoBHMapper engInfoBHMapper;
@Resource
private SysUserDataScopeMapper sysUserDataScopeMapper;
@Override
public Page<SdEngInfoBH> queryPageList(Page<SdEngInfoBH> page, String ennm, String rvcd, String baseId, String hycd) {
return this.page(page, this.lambdaQuery()
.like(ennm != null && !ennm.isEmpty(), SdEngInfoBH::getEnnm, ennm)
LambdaQueryWrapper<SdEngInfoBH> 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<String> 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<SdEngInfoBHMapper, SdEng
@Override
public List<SdEngInfoBH> selectForDropdown(String baseId, String ennm) {
return this.lambdaQuery()
.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId)
LambdaQueryWrapper<SdEngInfoBH> 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<String> authorizedStations = getUserAuthorizedStationCodes();
if (authorizedStations != null && !authorizedStations.isEmpty()) {
wrapper.in(SdEngInfoBH::getStcd, authorizedStations);
} else {
return new ArrayList<>();
}
return this.list(wrapper);
}
@Override
public Set<String> getUserAuthorizedStationCodes() {
String userId = SecurityUtils.getUserId();
List<SysUserDataScope> sysUserDataScopes = sysUserDataScopeMapper.selectList(
new LambdaQueryWrapper<SysUserDataScope>()
.eq(SysUserDataScope::getUserId, userId)
.select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType)
);
if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) {
return new HashSet<>();
}
Set<String> stationCodes = new HashSet<>();
List<String> 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<SdEngInfoBH> engInfos = this.lambdaQuery()
.select(SdEngInfoBH::getStcd)
.in(SdEngInfoBH::getRvcd, basinCodes)
.list();
return engInfos.stream()
.map(SdEngInfoBH::getStcd)
.collect(Collectors.toSet());
}
return stationCodes;
}
@Override

View File

@ -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<SdFpssBHMapper, SdFpssBH> implements ISdFpssBHService {
@Resource
private SysUserDataScopeMapper sysUserDataScopeMapper;
@Resource
private SdEngInfoBHMapper sdEngInfoBHMapper;
@Override
public Page<SdFpssBH> selectPage(String stcd, String sttp, String rstcd, Integer usfl, Page<SdFpssBH> page) {
LambdaQueryWrapper<SdFpssBH> wrapper = new LambdaQueryWrapper<>();
@ -31,6 +47,11 @@ public class SdFpssBHServiceImpl extends ServiceImpl<SdFpssBHMapper, SdFpssBH> i
wrapper.eq(SdFpssBH::getUsfl, usfl);
}
Set<String> 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<SdFpssBHMapper, SdFpssBH> i
@Override
public List<SdFpssBH> selectForDropdown(String rstcd, String stnm, String baseId) {
Set<String> authorizedStations = getUserAuthorizedStationCodes();
if (authorizedStations == null || authorizedStations.isEmpty()) {
return new ArrayList<>();
}
List<SdFpssBH> result;
if (StringUtils.hasText(baseId)) {
return baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId);
result = baseMapper.selectForDropdownWithBaseId(rstcd, stnm, baseId);
} else {
LambdaQueryWrapper<SdFpssBH> 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<String> getUserAuthorizedStationCodes() {
String userId = SecurityUtils.getUserId();
List<SysUserDataScope> sysUserDataScopes = sysUserDataScopeMapper.selectList(
new LambdaQueryWrapper<SysUserDataScope>()
.eq(SysUserDataScope::getUserId, userId)
.select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType)
);
if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) {
return new HashSet<>();
}
Set<String> stationCodes = new HashSet<>();
List<String> 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<SdEngInfoBH> engInfos = sdEngInfoBHMapper.selectList(
new LambdaQueryWrapper<SdEngInfoBH>()
.select(SdEngInfoBH::getStcd)
.in(SdEngInfoBH::getRvcd, basinCodes)
);
return engInfos.stream()
.map(SdEngInfoBH::getStcd)
.collect(Collectors.toSet());
}
return stationCodes;
}
@Override

View File

@ -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;
/**
* <p>
@ -18,6 +29,12 @@ import java.util.List;
@Service
public class SdHydrobaseServiceImpl extends ServiceImpl<SdHydrobaseMapper, SdHydrobase> implements ISdHydrobaseService {
@Resource
private SysUserDataScopeMapper sysUserDataScopeMapper;
@Resource
private SdEngInfoBHMapper sdEngInfoBHMapper;
@Override
public Page<SdHydrobase> queryPageList(Page<SdHydrobase> page, String basename, String pbaseid) {
return this.page(page, this.lambdaQuery()
@ -45,10 +62,81 @@ public class SdHydrobaseServiceImpl extends ServiceImpl<SdHydrobaseMapper, SdHyd
@Override
public List<SdHydrobase> selectForDropdown(String basename) {
return this.lambdaQuery()
.like(StringUtils.hasText(basename), SdHydrobase::getBasename, basename)
.orderByAsc(SdHydrobase::getOrderIndex)
.list();
LambdaQueryWrapper<SdHydrobase> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.hasText(basename)) {
wrapper.like(SdHydrobase::getBasename, basename);
}
Set<String> authorizedStations = getUserAuthorizedStationCodes();
if (authorizedStations != null && !authorizedStations.isEmpty()) {
List<SdEngInfoBH> engInfos = sdEngInfoBHMapper.selectList(
new LambdaQueryWrapper<SdEngInfoBH>()
.select(SdEngInfoBH::getBaseId)
.in(SdEngInfoBH::getStcd, authorizedStations)
);
List<String> 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<String> getUserAuthorizedStationCodes() {
String userId = SecurityUtils.getUserId();
List<SysUserDataScope> sysUserDataScopes = sysUserDataScopeMapper.selectList(
new LambdaQueryWrapper<SysUserDataScope>()
.eq(SysUserDataScope::getUserId, userId)
.select(SysUserDataScope::getOrgId, SysUserDataScope::getOrgType)
);
if (sysUserDataScopes == null || sysUserDataScopes.isEmpty()) {
return new HashSet<>();
}
Set<String> stationCodes = new HashSet<>();
List<String> 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<SdEngInfoBH> engInfos = sdEngInfoBHMapper.selectList(
new LambdaQueryWrapper<SdEngInfoBH>()
.select(SdEngInfoBH::getStcd)
.in(SdEngInfoBH::getRvcd, basinCodes)
);
return engInfos.stream()
.map(SdEngInfoBH::getStcd)
.collect(Collectors.toSet());
}
return stationCodes;
}
@Override

View File

@ -426,5 +426,82 @@ public class TreeStructureServiceImpl implements ITreeStructureService {
return result;
}
@Override
public List<Map<String, Object>> getBaseEngTree(String baseId, String engName) {
List<Map<String, Object>> result = new ArrayList<>();
// 1. 查询基地列表
List<SdHydrobase> 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<String, List<SdEngInfoBH>> baseEngMap = new HashMap<>();
for (SdHydrobase hydrobase : baseList) {
List<SdEngInfoBH> 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<String, Object> 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<SdEngInfoBH> engList = baseEngMap.get(hydrobase.getBaseid());
List<Map<String, Object>> engChildren = new ArrayList<>();
if (engList != null && !engList.isEmpty()) {
for (SdEngInfoBH eng : engList) {
Map<String, Object> 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;
}
}

View File

@ -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

View File

@ -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

View File

@ -1,6 +1,6 @@
spring:
profiles:
active: devtw
active: prod
jasypt:
encryptor:

View File

@ -233,7 +233,7 @@
<select id="selectByBaseId" resultMap="BaseResultMap">
SELECT * FROM SD_ENGINFO_B_H
WHERE BASEID = #{baseId}
WHERE BASE_ID = #{baseId}
ORDER BY ORDER_INDEX ASC
</select>

View File

@ -4,10 +4,10 @@
<mapper namespace="com.yfd.platform.env.mapper.SdHydrobaseMapper">
<resultMap id="BaseResultMap" type="com.yfd.platform.env.domain.SdHydrobase">
<id column="BASEID" property="baseId"/>
<id column="BASEID" property="baseid"/>
<result column="BASENAME" property="basename"/>
<result column="SHORTNAME" property="shortname"/>
<result column="PBASEID" property="pBaseId"/>
<result column="PBASEID" property="pbaseid"/>
<result column="GRD" property="grd"/>
<result column="PATH" property="path"/>
<result column="ORDERINDEX" property="orderIndex"/>