fix: 优化代码

This commit is contained in:
tangwei 2026-08-07 18:05:13 +08:00
parent 33dd34edcd
commit 021d2b2e15
8 changed files with 329 additions and 78 deletions

View File

@ -70,7 +70,7 @@ public class SecurityConfig {
.requestMatchers("/base/operationLog/**").permitAll() .requestMatchers("/base/operationLog/**").permitAll()
// .requestMatchers("/system/**").permitAll() // .requestMatchers("/system/**").permitAll()
.requestMatchers("/qgcExport/**").permitAll() .requestMatchers("/qgcExport/**").permitAll()
// .requestMatchers("/eng/**").permitAll() .requestMatchers("/eng/**").permitAll()
.requestMatchers("/eq/**").permitAll() .requestMatchers("/eq/**").permitAll()
// .requestMatchers("/env/**").permitAll() // .requestMatchers("/env/**").permitAll()
// .requestMatchers("/warn/**").permitAll() // .requestMatchers("/warn/**").permitAll()
@ -78,7 +78,7 @@ public class SecurityConfig {
// .requestMatchers("/overview/**").permitAll() // .requestMatchers("/overview/**").permitAll()
// .requestMatchers("/wt/**").permitAll() // .requestMatchers("/wt/**").permitAll()
// .requestMatchers("/fb/**").permitAll() // .requestMatchers("/fb/**").permitAll()
// .requestMatchers("/base/**").permitAll() .requestMatchers("/base/**").permitAll()
// .requestMatchers("/zq/**").permitAll() // .requestMatchers("/zq/**").permitAll()
// .requestMatchers("/wq/**").permitAll() // .requestMatchers("/wq/**").permitAll()
// .requestMatchers("/wte/**").permitAll() // .requestMatchers("/wte/**").permitAll()

View File

@ -1,8 +1,10 @@
package com.yfd.platform.qgc_base.controller; package com.yfd.platform.qgc_base.controller;
import com.yfd.platform.common.DataSourceRequest; import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo; import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo;
import com.yfd.platform.qgc_base.domain.vo.RstcdTreeInfoVo;
import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import com.yfd.platform.qgc_base.service.ISdEngInfoBHService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -75,4 +77,11 @@ public class SdEngMonitorController {
public ResponseResult getQgcRvcdList(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getQgcRvcdList(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(engInfoBHService.getQgcRvcdList(dataSourceRequest)); return ResponseResult.successData(engInfoBHService.getQgcRvcdList(dataSourceRequest));
} }
@PostMapping("/engTree/GetKendoList")
@Operation(summary = "树形结构数据信息 电站沿程排序")
public ResponseResult getEngTreeKendoList(@RequestBody DataSourceRequest dataSourceRequest) {
DataSourceResult<RstcdTreeInfoVo> result = engInfoBHService.getEngTreeByAlong(dataSourceRequest);
return ResponseResult.successData(result);
}
} }

View File

@ -124,4 +124,44 @@ public class EngVmsstbprptVo implements Serializable {
private Integer rvcdStepSort; private Integer rvcdStepSort;
private Integer rstcdStepSort; private Integer rstcdStepSort;
private Integer siteStepSort; private Integer siteStepSort;
/** 上游码头位置 */
private String updcklc;
/** 上游码头型式 */
private String updcktp;
/** 下游码头位置 */
private String downdcklc;
/** 下游码头型式 */
private String downdcktp;
/*** 过鱼时间*/
private String psfishtm;
/*** 过鱼对象*/
private String psfishtyp;
/*** 断面尺寸(长*宽*高)*/
private String syjsz;
/** 运鱼设施方式 */
private String jyyyyfs;
/** 过鱼规模 */
private Long psfishcnt;
/** 集鱼槽进口高程 */
private String syjhg;
/** 集鱼槽数量 */
private Integer syjcnt;
/** 集鱼槽流量 */
private String syjq;
/** 集鱼槽水深 */
private String syjwdp;
/** 运行时间 */
private String runtm;
/** 集诱鱼方式 */
private String syjjyyfs;
/** 投资:单位:亿元 */
private BigDecimal inv;
/** 数据监测频次 */
private Integer dtfrqcy;
/** 主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开),主要过鱼月份(多个月份用,隔开) */
private String fpssmnmon;
} }

View File

@ -0,0 +1,33 @@
package com.yfd.platform.qgc_base.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* 沿程树形节点按电站(RSTCD)分组
*/
@Data
@Schema(description = "沿程树形电站节点")
public class RstcdTreeInfoVo {
@Schema(description = "电站编码")
private String rstcd;
@Schema(description = "电站名称")
private String ennm;
@Schema(description = "沿程排序")
private Integer sort;
@Schema(description = "基地编码")
private String baseId;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "下属测站列表")
private List<StcdItemVo> items = new ArrayList<>();
}

View File

@ -0,0 +1,51 @@
package com.yfd.platform.qgc_base.domain.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 测站条目 V_MS_STBPRP_T 视图中提取的测站字段
*/
@Data
@Schema(description = "沿程树形测站条目")
public class StcdItemVo {
@Schema(description = "测站编码")
private String stcd;
@Schema(description = "测站名称")
private String stnm;
@Schema(description = "站类编码")
private String sttpCode;
@Schema(description = "站类名称")
private String sttpName;
@Schema(description = "监测方式名称")
private String mwayName;
@Schema(description = "监测方式1=人工 2=自动")
private Integer mway;
@Schema(description = "经度")
private String lgtd;
@Schema(description = "纬度")
private String lttd;
@Schema(description = "站点排序")
private Integer orderIndex;
@Schema(description = "所属电站编码")
private String rstcd;
@Schema(description = "所属电站名称")
private String ennm;
@Schema(description = "所属基地编码")
private String baseId;
@Schema(description = "所属基地名称")
private String baseName;
}

View File

@ -0,0 +1,33 @@
package com.yfd.platform.qgc_base.mapper;
import com.yfd.platform.qgc_base.domain.vo.StcdItemVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* V_MS_STBPRP_T 视图 Mapper
*/
@Mapper
public interface VMsStbprpTMapper {
/**
* 查询视图中的测站沿程数据按站类编码过滤
*/
@Select("<script>" +
"SELECT STCD, STNM, STTP_CODE AS sttpCode, STTP_NAME AS sttpName, " +
"MWAY, RSTCD, ENNM, BASE_ID AS baseId, BASE_NAME AS baseName, " +
"NVL(RSTCDSTEPSORT, 999999) AS sort, ORDER_INDEX AS orderIndex, " +
"LGTD AS lgtd, LTTD AS lttd " +
"FROM V_MS_STBPRP_T " +
"WHERE IS_DELETED = 0 " +
"<if test='sttpCodes != null and sttpCodes.size() > 0'>" +
" AND STTP_CODE IN " +
" <foreach collection='sttpCodes' item='code' open='(' separator=',' close=')'>#{code}</foreach>" +
"</if>" +
"ORDER BY NVL(RSTCDSTEPSORT, 999999), NVL(ORDER_INDEX, 999999)" +
"</script>")
List<StcdItemVo> selectBySttpCodes(@Param("sttpCodes") List<String> sttpCodes);
}

View File

@ -17,6 +17,8 @@ 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.EngStInfoResultVo;
import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo; import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo;
import com.yfd.platform.qgc_base.domain.vo.RstcdTreeInfoVo;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -101,4 +103,9 @@ public interface ISdEngInfoBHService extends IService<SdEngInfoBH> {
DataSourceResult<EngRsvrcscdRvcdVo> getRsvrcscdBRvcdList(DataSourceRequest dataSourceRequest); DataSourceResult<EngRsvrcscdRvcdVo> getRsvrcscdBRvcdList(DataSourceRequest dataSourceRequest);
DataSourceResult<EngQgcRvcdVo> getQgcRvcdList(DataSourceRequest dataSourceRequest); DataSourceResult<EngQgcRvcdVo> getQgcRvcdList(DataSourceRequest dataSourceRequest);
/**
* 树形结构数据信息 电站沿程排序
*/
DataSourceResult<RstcdTreeInfoVo> getEngTreeByAlong(DataSourceRequest dataSourceRequest);
} }

View File

@ -23,23 +23,11 @@ import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.common.GroupHelper; import com.yfd.platform.common.GroupHelper;
import com.yfd.platform.common.GroupingInfo; import com.yfd.platform.common.GroupingInfo;
import com.yfd.platform.common.MicroservicDynamicSQLMapper; import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.qgc_base.domain.vo.*;
import com.yfd.platform.qgc_data.domain.SysUserDataScope; import com.yfd.platform.qgc_data.domain.SysUserDataScope;
import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper; import com.yfd.platform.qgc_data.mapper.SysUserDataScopeMapper;
import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdEngInfoBH;
import com.yfd.platform.qgc_base.domain.vo.DataScopeApplyResult;
import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest; import com.yfd.platform.qgc_base.domain.SdEngInfoBHRequest;
import com.yfd.platform.qgc_base.domain.vo.EngAlarmPointVo;
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.EngQgcRvcdVo;
import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdBVo;
import com.yfd.platform.qgc_base.domain.vo.EngRsvrcscdRvcdVo;
import com.yfd.platform.qgc_base.domain.vo.EngPointVo;
import com.yfd.platform.qgc_base.domain.vo.EngStbprpDataVo;
import com.yfd.platform.qgc_base.domain.vo.EngStBaseInfoVo;
import com.yfd.platform.qgc_base.domain.vo.EngStInfoResultVo;
import com.yfd.platform.qgc_base.domain.vo.EngVmsstbprptVo;
import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper; import com.yfd.platform.qgc_base.mapper.SdEngInfoBHMapper;
import com.yfd.platform.qgc_base.service.IDataScopeFilterService; import com.yfd.platform.qgc_base.service.IDataScopeFilterService;
import com.yfd.platform.qgc_base.service.IMsOperationLogService; import com.yfd.platform.qgc_base.service.IMsOperationLogService;
@ -149,6 +137,9 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Resource @Resource
private IAdminAuthService adminAuthService; private IAdminAuthService adminAuthService;
@Resource
private com.yfd.platform.qgc_base.mapper.VMsStbprpTMapper vMsStbprpTMapper;
@Override @Override
public Page<SdEngInfoBH> queryPageList(Page<SdEngInfoBH> page, String ennm, String rvcd, String baseId, String hycd) { public Page<SdEngInfoBH> queryPageList(Page<SdEngInfoBH> page, String ennm, String rvcd, String baseId, String hycd) {
LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<SdEngInfoBH> wrapper = new LambdaQueryWrapper<>();
@ -1002,75 +993,25 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
@Override @Override
public EngVmsstbprptVo getStInfoByStcd(String stcd) { public EngVmsstbprptVo getStInfoByStcd(String stcd) {
// 先查 V_MS_STBPRP_T 视图获取 STTP_CODE
String checkSql = "SELECT STCD, STTP_CODE FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0 AND ROWNUM = 1";
Map<String, Object> checkResult = microservicDynamicSQLMapper.getOneBySql(checkSql, Collections.singletonMap("stcd", stcd));
String sttpCode = checkResult != null ? (String) checkResult.get("STTP_CODE") : null;
if (!"ENG".equals(sttpCode)) {
// ENG直接从 V_MS_STBPRP_T 视图返回
String viewSql = "SELECT * FROM V_MS_STBPRP_T WHERE STCD = #{map.stcd} AND IS_DELETED = 0";
return microservicDynamicSQLMapper.getOneBySqlWithResultType(viewSql, Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class);
}
// ENG 走原有逻辑
StringBuilder sql = new StringBuilder(); StringBuilder sql = new StringBuilder();
sql.append("SELECT *") sql.append("SELECT *")
.append(" FROM (") .append(" FROM (")
.append(buildVmsstbprptViewSqlNew()) .append(buildVmsstbprptViewSqlNew())
.append(") t WHERE 1 = 1 AND t.STCD = #{map.stcd}"); .append(") t WHERE 1 = 1 AND t.STCD = #{map.stcd}");
EngVmsstbprptVo vo = microservicDynamicSQLMapper.getOneBySqlWithResultType(sql.toString(), Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class); return microservicDynamicSQLMapper.getOneBySqlWithResultType(sql.toString(), Collections.singletonMap("stcd", stcd), EngVmsstbprptVo.class);
// SdEngInfoBH entity = this.getById(stcd);
// if (entity == null) {
// return null;
// }
//
// EngBaseInfoVo vo = new EngBaseInfoVo();
// BeanUtil.copyProperties(entity, vo);
// vo.setId(entity.getStcd());
// vo.setStnm(entity.getEnnm());
//
// String sql = "SELECT " +
// "sttp.ID AS sttp, " +
// "sttp.STTP_CODE AS sttpCode, " +
// "sttp.STTP_NAME AS sttpName, " +
// "sttp.FULL_PATH AS sttpFullPath, " +
// "sttp.TREE_LEVEL AS sttpTreeLevel, " +
// "hb.BASENAME AS baseName, " +
// "hbrv.HBRVNM AS hbrvcdName, " +
// "rv.RVNM AS rvcdName, " +
// "rv.PATH AS rvcdFullPath, " +
// "addv.ADDVNM AS addvcdName, " +
// "addv.PATH AS addvcdFullPath, " +
// "country.COUNTRY_NAME AS countryName, " +
// "hy.HYNM AS hynm, " +
// "topHy.HYNM AS topHynm " +
// "FROM SD_ENGINFO_B_H eng " +
// "LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = 'ENG' " +
// " AND NVL(sttp.IS_DELETED, 0) = 0 " +
// " AND NVL(sttp.ENABLE, 1) = 1 " +
// "LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID " +
// "LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.HBRVCD = eng.HBRVCD AND hbrv.BASEID = eng.BASE_ID " +
// " AND NVL(hbrv.ENABLED, 1) = 1 " +
// "LEFT JOIN SD_RVCD_DIC rv ON rv.RVCD = eng.RVCD " +
// "LEFT JOIN SD_ADDVCD_DIC addv ON addv.ADDVCD = eng.ADDVCD " +
// "LEFT JOIN SD_COUNTRY_B country ON country.COUNTRY_ID = eng.COUNTRY AND NVL(country.ENABLED, 1) = 1 " +
// "LEFT JOIN SD_HYCD_DIC hy ON hy.HYCD = eng.HYCD " +
// "LEFT JOIN SD_HYCD_DIC topHy ON topHy.HYCD = eng.TOP_HYCD " +
// "WHERE eng.STCD = #{map.stcd}";
//
// EngBaseInfoVo extra = microservicDynamicSQLMapper.getOneBySqlWithResultType(
// sql, java.util.Collections.singletonMap("stcd", stcd), EngBaseInfoVo.class);
// if (extra != null) {
// BeanUtil.copyProperties(extra, vo, CopyOptions.create().setIgnoreNullValue(true));
// }
//
// vo.setSttpCode("ENG");
// vo.setBlprdCode(entity.getBlprd() == null ? null : String.valueOf(entity.getBlprd()));
// vo.setBlprdCcode(entity.getBlprd() == null ? null : String.valueOf(entity.getBlprd()));
// vo.setBlprdName(resolveBlprdName(entity.getBlprd()));
// vo.setBlprdCname(vo.getBlprdName());
// vo.setDtinName(resolveDtinName(entity.getDtin()));
// vo.setBldsttName(resolveBldsttName(entity.getBldstt()));
// vo.setBldsttCcode(entity.getBldsttCode() == null ? null : String.valueOf(entity.getBldsttCode()));
// vo.setBldsttCcodeName(resolveBldsttCodeName(entity.getBldsttCode()));
// vo.setDvtpName(resolveDvtpName(entity.getDvtp()));
// vo.setRgcpName(resolveRgcpName(entity.getRgcp()));
// vo.setEngtpName(resolveEngtpName(entity.getEngtp()));
// vo.setPrscName(resolvePrscName(entity.getPrsc()));
// vo.setScrscName(resolveScrscName(entity.getScrsc()));
// vo.setPrgrName(resolvePrgrName(entity.getPrgr()));
return vo;
} }
@ -4128,4 +4069,141 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl<SdEngInfoBHMapper, SdEng
} }
} }
} }
// ======================== 沿程树形查询 ========================
@Override
public DataSourceResult<RstcdTreeInfoVo> getEngTreeByAlong(
DataSourceRequest dataSourceRequest) {
DataSourceResult<RstcdTreeInfoVo> result = new DataSourceResult<>();
result.setAggregates(new HashMap<>());
if (dataSourceRequest == null) {
result.setData(new ArrayList<>());
result.setTotal(0L);
return result;
}
// 从请求 filter 中提取 STTP 过滤条件用于限定站类范围
List<String> sttpCodes = extractSttpCodesFromRequest(dataSourceRequest);
// 查询 V_MS_STBPRP_T 视图
List<com.yfd.platform.qgc_base.domain.vo.StcdItemVo> allItems =
vMsStbprpTMapper.selectBySttpCodes(sttpCodes);
if (CollUtil.isEmpty(allItems)) {
result.setData(new ArrayList<>());
result.setTotal(0L);
return result;
}
// 构建树形结构 RSTCD 分组
Map<String, List<StcdItemVo>> groupedMap = new LinkedHashMap<>();
for (StcdItemVo item : allItems) {
String rstcd = StrUtil.blankToDefault(item.getRstcd(), "");
// 处理逗号分隔的多个 RSTCD一个测站关联多个电站
if (rstcd.contains(",")) {
for (String singleRstcd : rstcd.split(",")) {
String r = singleRstcd.trim();
if (StrUtil.isNotBlank(r)) {
groupedMap.computeIfAbsent(r, k -> new ArrayList<>()).add(item);
}
}
} else if (StrUtil.isNotBlank(rstcd)) {
groupedMap.computeIfAbsent(rstcd, k -> new ArrayList<>()).add(item);
} else {
// 无电站归属 other
groupedMap.computeIfAbsent("other", k -> new ArrayList<>()).add(item);
}
}
// 转换为树节点列表
List<RstcdTreeInfoVo> treeList = new ArrayList<>();
for (Map.Entry<String, List<StcdItemVo>> entry : groupedMap.entrySet()) {
String rstcd = entry.getKey();
List<StcdItemVo> items = entry.getValue();
RstcdTreeInfoVo node =
new RstcdTreeInfoVo();
if ("other".equals(rstcd)) {
node.setRstcd("other");
node.setEnnm("其它");
} else {
node.setRstcd(rstcd);
// 从测站数据中取电站名称
String ennm = items.stream()
.map(StcdItemVo::getEnnm)
.filter(StrUtil::isNotBlank)
.findFirst().orElse(rstcd);
node.setEnnm(ennm);
}
// 取第一个测站的排序和基地信息
StcdItemVo first = items.get(0);
node.setSort(first.getOrderIndex());
node.setBaseId(first.getBaseId());
node.setBaseName(first.getBaseName());
node.setItems(items);
treeList.add(node);
}
result.setData(treeList);
result.setTotal(treeList.size());
return result;
}
/**
* DataSourceRequest filter 中提取 STTP 过滤码
*/
private List<String> extractSttpCodesFromRequest(DataSourceRequest request) {
if (request == null || request.getFilter() == null) {
return null;
}
return extractSttpCodesFromFilter(request.getFilter());
}
private List<String> extractSttpCodesFromFilter(DataSourceRequest.FilterDescriptor filter) {
if (filter == null) {
return null;
}
// 叶子节点检查字段是否为 sttpCode
if (StrUtil.isNotBlank(filter.getField())) {
if ("sttpCode".equals(filter.getField()) || "sttp_code".equalsIgnoreCase(filter.getField())) {
if ("in".equalsIgnoreCase(filter.getOperator())) {
Object val = filter.getValue();
if (val instanceof List<?> list) {
return list.stream()
.filter(Objects::nonNull)
.map(Object::toString)
.filter(StrUtil::isNotBlank)
.map(String::trim)
.collect(Collectors.toList());
}
if (val instanceof Object[] arr) {
return Arrays.stream(arr)
.filter(Objects::nonNull)
.map(Object::toString)
.filter(StrUtil::isNotBlank)
.map(String::trim)
.collect(Collectors.toList());
}
}
}
return null;
}
// 递归子节点
if (CollUtil.isNotEmpty(filter.getFilters())) {
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
List<String> codes = extractSttpCodesFromFilter(child);
if (codes != null) {
return codes;
}
}
}
return null;
}
} }