feat: (全过程)增殖站二级页面: 增殖放流情况

This commit is contained in:
tangwei 2026-06-17 15:20:22 +08:00
parent da213852f6
commit 2c37ad6cb3
6 changed files with 593 additions and 5 deletions

View File

@ -26,4 +26,10 @@ public class FbMsfbrdmController {
public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getFbFlData(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest)); return ResponseResult.successData(fbStationService.getFbFlDataKendoListCust(dataSourceRequest));
} }
@PostMapping("/qgc/GetKendoListCust")
@Operation(summary = "(全过程)增殖站二级页面: 增殖放流情况")
public ResponseResult getQgcKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fbStationService.getQgcMsfbrdmKendoListCust(dataSourceRequest));
}
} }

View File

@ -0,0 +1,47 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import java.util.List;
@Data
public class FbMsfbrdmQgcVo {
private String stcd;
private String stnm;
private String baseId;
private String baseName;
private String rstcd;
private String ennm;
private Integer bldstt;
private Integer hydrodtin;
private Integer runState;
private String runStateName;
private String ftp;
private String ftpName;
private Long fcntjh;
private Long fcntjc;
private String flyr;
private String fsz;
private String fwet;
private String fid;
private List<FbReleaseDirectionVo> directionVoList;
}

View File

@ -0,0 +1,21 @@
package com.yfd.platform.qgc_env.fb.entity.vo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class FbReleaseDirectionVo {
private String flstcd;
private String flstnm;
private Long flfnct;
private String flyr;
private String ftp;
private String stcd;
}

View File

@ -6,6 +6,7 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStationStaticsDataVo;
@ -22,6 +23,8 @@ public interface FbStationService {
DataSourceResult<FbFlDataVo> getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbFlDataVo> getFbFlDataKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbMsfbrdmQgcVo> getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest);
DataSourceResult<FbBsmfRFishTableVo> getBsmfRFishKendoListCust(DataSourceRequest dataSourceRequest); DataSourceResult<FbBsmfRFishTableVo> getBsmfRFishKendoListCust(DataSourceRequest dataSourceRequest);

View File

@ -17,7 +17,9 @@ import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishSummaryVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbBsmfRFishTableVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFtpStatisticsVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbFlDataVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbMsfbrdmQgcVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbRelatedYrVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbReleaseDirectionVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbResearchVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStBaseInfoVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStBaseInfoVo;
import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo; import com.yfd.platform.qgc_env.fb.entity.vo.FbStInfoResultVo;
@ -81,6 +83,16 @@ public class FbStationServiceImpl implements FbStationService {
return queryFbFlDataDetailList(dataSourceRequest, loadOptions); return queryFbFlDataDetailList(dataSourceRequest, loadOptions);
} }
@Override
public DataSourceResult<FbMsfbrdmQgcVo> getQgcMsfbrdmKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
GroupingInfo[] groups = loadOptions == null ? null : loadOptions.getGroup();
if (groups != null && groups.length > 0) {
return queryQgcMsfbrdmGroupList(dataSourceRequest, loadOptions, groups);
}
return queryQgcMsfbrdmDetailList(dataSourceRequest, loadOptions);
}
@Override @Override
public DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest) { public DataSourceResult<FbBsmfRQgcVo> getQgcBsmfRKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest(); DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
@ -732,6 +744,505 @@ public class FbStationServiceImpl implements FbStationService {
return sql.toString(); return sql.toString();
} }
private DataSourceResult<FbMsfbrdmQgcVo> queryQgcMsfbrdmDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
Map<String, Object> paramMap = new HashMap<>();
String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime");
String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime");
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildQgcMsfbrdmDetailSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" FROM (")
.append(buildQgcMsfbrdmCoreSql(parseDateTimeSafely(startTime), parseDateTimeSafely(endTime), paramMap))
.append(") t WHERE 1 = 1 ");
String filterSql = buildQgcMsfbrdmFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0}
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildQgcMsfbrdmOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<FbMsfbrdmQgcVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, FbMsfbrdmQgcVo.class
);
enrichQgcMsfbrdmDirections(list, parseDateTimeSafely(startTime), parseDateTimeSafely(endTime));
deduplicateQgcMsfbrdmFids(list);
DataSourceResult<FbMsfbrdmQgcVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
@SuppressWarnings({"rawtypes", "unchecked"})
private DataSourceResult<FbMsfbrdmQgcVo> queryQgcMsfbrdmGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions,
GroupingInfo[] groupInfos) {
Map<String, Object> paramMap = new HashMap<>();
String startTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "startTime");
String endTime = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "endTime");
StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM (")
.append(buildQgcMsfbrdmCoreSql(parseDateTimeSafely(startTime), parseDateTimeSafely(endTime), paramMap))
.append(") t WHERE 1 = 1 ");
String filterSql = buildQgcMsfbrdmFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0}
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
String groupSql = buildQgcMsfbrdmGroupSql(sql.toString(), dataSourceRequest == null ? null : dataSourceRequest.getGroup());
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, groupSql, paramMap);
DataSourceResult<FbMsfbrdmQgcVo> result = new DataSourceResult<>();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData((List<FbMsfbrdmQgcVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
List<Group> grouped = new GroupHelper().group(rows, Arrays.asList(groupInfos));
populateQgcMsfbrdmGroupKeyNames(grouped);
result.setData((List<FbMsfbrdmQgcVo>) (List<?>) grouped);
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
private String buildQgcMsfbrdmCoreSql(Date startTime, Date endTime, Map<String, Object> paramMap) {
Integer year = startTime == null ? null : Integer.parseInt(DateUtil.format(startTime, "yyyy"));
String ftpCodeExpr = "COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), " +
"TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(stat.FTP))";
String ftpNameExpr = buildFishNameExpr("stat.FTP");
StringBuilder sql = new StringBuilder();
sql.append("SELECT fb.STCD AS stcd, ")
.append("fb.STNM AS stnm, ")
.append("fb.RSTCD AS rstcd, ")
.append("eng.ENNM AS ennm, ")
.append("fb.BASE_ID AS baseId, ")
.append("hb.BASENAME AS baseName, ")
.append("TO_CHAR(mt.YR) AS flyr, ")
.append(ftpCodeExpr).append(" AS ftp, ")
.append(ftpNameExpr).append(" AS ftpName, ")
.append("stat.FCNTJH AS fcntjh, ")
.append("stat.FCNTJC AS fcntjc, ")
.append("stat.FSZ AS fsz, ")
.append("stat.FWET AS fwet, ")
.append("fb.DTIN AS hydrodtin, ")
.append("fb.BLDSTT_CODE AS bldstt, ")
.append("mt.STD_SSTATE AS runState, ")
.append("CASE mt.STD_SSTATE ")
.append(" WHEN 0 THEN '数据未接入' ")
.append(" WHEN 1 THEN '正常运行' ")
.append(" WHEN 2 THEN '未正常报送数据' ")
.append(" WHEN 3 THEN '未正常运行' ")
.append(" ELSE NULL END AS runStateName, ")
.append("stat.FID AS fid ")
.append("FROM MS_STSTATE_T mt ")
.append("INNER JOIN SD_FBRD_B_H fb ON fb.STCD = mt.STCD ")
.append(" AND NVL(fb.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = fb.BASE_ID ")
.append(" AND NVL(hb.IS_DELETED, 0) = 0 ")
.append(" AND NVL(hb.ENABLED, 1) = 1 ")
.append("LEFT JOIN (")
.append(" SELECT COALESCE(planAgg.STCD, actualAgg.STCD) AS STCD, ")
.append(" COALESCE(planAgg.FTP, actualAgg.FTP) AS FTP, ")
.append(" COALESCE(planAgg.FLYR, actualAgg.FLYR) AS FLYR, ")
.append(" planAgg.FCNTJH AS FCNTJH, ")
.append(" actualAgg.FCNTJC AS FCNTJC, ")
.append(" actualAgg.FID AS FID, ")
.append(" actualAgg.FSZ AS FSZ, ")
.append(" actualAgg.FWET AS FWET ")
.append(" FROM (")
.append(" SELECT plan.RSTCD AS STCD, ")
.append(" planDet.FTP AS FTP, ")
.append(" TO_NUMBER(TO_CHAR(plan.PLANSD, 'YYYY')) AS FLYR, ")
.append(" SUM(planDet.FCNT) AS FCNTJH ")
.append(" FROM SD_ENGFRPLAN_B plan ")
.append(" INNER JOIN SD_ENGFRPLANDET_B planDet ON plan.ID = planDet.RPJH_ID ")
.append(" AND NVL(planDet.IS_DELETED, 0) = 0 ")
.append(" AND planDet.FTP IS NOT NULL ")
.append(" WHERE NVL(plan.IS_DELETED, 0) = 0 ");
if (startTime != null) {
paramMap.put("qgcMsfbrdmPlanStart", startTime);
sql.append(" AND plan.PLANSD >= #{map.qgcMsfbrdmPlanStart} ");
}
if (endTime != null) {
paramMap.put("qgcMsfbrdmPlanEnd", endTime);
sql.append(" AND plan.PLANED <= #{map.qgcMsfbrdmPlanEnd} ");
}
sql.append(" GROUP BY plan.RSTCD, planDet.FTP, TO_NUMBER(TO_CHAR(plan.PLANSD, 'YYYY')) ")
.append(" ) planAgg ")
.append(" FULL OUTER JOIN (")
.append(" SELECT run.RSTCD AS STCD, ")
.append(" actualDet.FTP AS FTP, ")
.append(" TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) AS FLYR, ")
.append(" SUM(actualDet.FCNT) AS FCNTJC, ")
.append(" LISTAGG(run.FPRFID || ',' || run.FLRFID || ',' || run.BRRFID || ',' || run.BRFFID, ',') ")
.append(" WITHIN GROUP (ORDER BY run.ID) AS FID, ")
.append(" MAX(actualDet.FSZ) AS FSZ, ")
.append(" MAX(actualDet.FWET) AS FWET ")
.append(" FROM SD_ENGFR_R run ")
.append(" INNER JOIN SD_RPIMNFISH_R actualDet ON run.ID = actualDet.RPIMN_ID ")
.append(" AND NVL(actualDet.IS_DELETED, 0) = 0 ")
.append(" AND actualDet.FTP IS NOT NULL ")
.append(" WHERE NVL(run.IS_DELETED, 0) = 0 ");
if (startTime != null) {
paramMap.put("qgcMsfbrdmRunStart", startTime);
sql.append(" AND run.TM >= #{map.qgcMsfbrdmRunStart} ");
}
if (endTime != null) {
paramMap.put("qgcMsfbrdmRunEnd", endTime);
sql.append(" AND run.TM <= #{map.qgcMsfbrdmRunEnd} ");
}
sql.append(" GROUP BY run.RSTCD, actualDet.FTP, TO_NUMBER(TO_CHAR(run.TM, 'YYYY')) ")
.append(" ) actualAgg ")
.append(" ON planAgg.STCD = actualAgg.STCD ")
.append(" AND NVL(planAgg.FTP, '~') = NVL(actualAgg.FTP, '~') ")
.append(" AND NVL(planAgg.FLYR, -1) = NVL(actualAgg.FLYR, -1) ")
.append(") stat ON stat.STCD = mt.STCD AND stat.FLYR = mt.YR ")
.append(buildFishJoinSql("stat.FTP", "fb.HBRVCD"))
.append("WHERE NVL(mt.IS_DELETED, 0) = 0 ")
.append(" AND mt.STTP_CODE = 'FB' ");
if (year != null) {
paramMap.put("qgcMsfbrdmYear", year);
sql.append(" AND mt.YR = #{map.qgcMsfbrdmYear} ");
}
return sql.toString();
}
private void enrichQgcMsfbrdmDirections(List<FbMsfbrdmQgcVo> list, Date startTime, Date endTime) {
if (CollUtil.isEmpty(list)) {
return;
}
Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder();
sql.append("SELECT run.STCD AS flstcd, ")
.append(" eng.ENNM AS flstnm, ")
.append(" SUM(det.FCNT) AS flfnct, ")
.append(" TO_CHAR(run.TM, 'YYYY') AS flyr, ")
.append(" COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), ")
.append(" TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(det.FTP)) AS ftp, ")
.append(" run.RSTCD AS stcd ")
.append("FROM SD_ENGFR_R run ")
.append("INNER JOIN SD_RPIMNFISH_R det ON det.RPIMN_ID = run.ID ")
.append(" AND NVL(det.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_FBRD_B_H fb ON fb.STCD = run.RSTCD ")
.append(" AND NVL(fb.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = run.STCD ")
.append(" AND NVL(eng.IS_DELETED, 0) = 0 ")
.append(buildFishJoinSql("det.FTP", "fb.HBRVCD"))
.append("WHERE NVL(run.IS_DELETED, 0) = 0 ");
if (startTime != null) {
paramMap.put("qgcMsfbrdmDirStart", startTime);
sql.append(" AND run.TM >= #{map.qgcMsfbrdmDirStart} ");
}
if (endTime != null) {
paramMap.put("qgcMsfbrdmDirEnd", endTime);
sql.append(" AND run.TM <= #{map.qgcMsfbrdmDirEnd} ");
}
sql.append("GROUP BY run.STCD, eng.ENNM, TO_CHAR(run.TM, 'YYYY'), ")
.append(" COALESCE(TO_CHAR(NVL(relRv.ZY_FISH_ID, relRv.FISH_ID)), ")
.append(" TO_CHAR(NVL(relZy.ZY_FISH_ID, relZy.FISH_ID)), TO_CHAR(det.FTP)), ")
.append(" run.RSTCD ");
List<FbReleaseDirectionVo> directions = microservicDynamicSQLMapper.pageAllListWithResultType(
null, sql.toString(), paramMap, FbReleaseDirectionVo.class
);
if (CollUtil.isEmpty(directions)) {
return;
}
Map<String, List<FbReleaseDirectionVo>> directionMap = directions.stream()
.collect(Collectors.groupingBy(
item -> StrUtil.blankToDefault(item.getStcd(), "") + "|" +
StrUtil.blankToDefault(item.getFtp(), "") + "|" +
StrUtil.blankToDefault(item.getFlyr(), ""),
LinkedHashMap::new,
Collectors.toList()
));
for (FbMsfbrdmQgcVo item : list) {
String key = StrUtil.blankToDefault(item.getStcd(), "") + "|" +
StrUtil.blankToDefault(item.getFtp(), "") + "|" +
StrUtil.blankToDefault(item.getFlyr(), "");
item.setDirectionVoList(directionMap.getOrDefault(key, Collections.emptyList()));
}
}
private void deduplicateQgcMsfbrdmFids(List<FbMsfbrdmQgcVo> list) {
if (CollUtil.isEmpty(list)) {
return;
}
for (FbMsfbrdmQgcVo item : list) {
if (item == null || StrUtil.isBlank(item.getFid())) {
continue;
}
Set<String> fidSet = Arrays.stream(item.getFid().split(","))
.map(StrUtil::trim)
.filter(StrUtil::isNotBlank)
.collect(Collectors.toCollection(LinkedHashSet::new));
item.setFid(fidSet.isEmpty() ? null : String.join(",", fidSet));
}
}
private String buildQgcMsfbrdmDetailSelectSql(List<String> select) {
List<String> fields = CollUtil.isEmpty(select)
? List.of("stcd", "stnm", "baseId", "baseName", "rstcd", "ennm", "bldstt",
"hydrodtin", "runState", "runStateName", "ftp", "ftpName", "fcntjh", "fcntjc",
"flyr", "fsz", "fwet", "fid")
: select;
List<String> selectParts = new ArrayList<>();
for (String field : fields) {
String column = mapQgcMsfbrdmColumn(field);
if (StrUtil.isNotBlank(column)) {
selectParts.add(column + " AS " + field);
}
}
if (selectParts.isEmpty()) {
selectParts.add("t.stcd AS stcd");
}
return String.join(", ", selectParts);
}
private String buildQgcMsfbrdmFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildQgcMsfbrdmLeafCondition(filter, paramMap, indexHolder);
}
if (CollUtil.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildQgcMsfbrdmFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add("(" + childSql + ")");
}
}
if (conditions.isEmpty()) {
return "";
}
String logic = "or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ";
return String.join(logic, conditions);
}
private String buildQgcMsfbrdmLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String column = mapQgcMsfbrdmColumn(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 ("in".equals(operator)) {
List<Object> values = normalizeQgcBsmfRValues(value);
if (values.isEmpty()) {
return "";
}
List<String> placeholders = new ArrayList<>();
for (Object item : values) {
String key = "qgcMsfbrdmP" + indexHolder[0]++;
paramMap.put(key, normalizeQgcMsfbrdmValue(filter.getField(), item));
placeholders.add("#{map." + key + "}");
}
return column + " IN (" + String.join(", ", placeholders) + ")";
}
if (value == null) {
return "";
}
String key = "qgcMsfbrdmP" + indexHolder[0]++;
Object normalizedValue = normalizeQgcMsfbrdmValue(filter.getField(), value);
return switch (operator) {
case "eq" -> {
paramMap.put(key, normalizedValue);
yield column + " = #{map." + key + "}";
}
case "neq" -> {
paramMap.put(key, normalizedValue);
yield column + " <> #{map." + key + "}";
}
case "gt" -> {
paramMap.put(key, normalizedValue);
yield column + " > #{map." + key + "}";
}
case "gte" -> {
paramMap.put(key, normalizedValue);
yield column + " >= #{map." + key + "}";
}
case "lt" -> {
paramMap.put(key, normalizedValue);
yield column + " < #{map." + key + "}";
}
case "lte" -> {
paramMap.put(key, normalizedValue);
yield column + " <= #{map." + key + "}";
}
case "contains" -> {
paramMap.put(key, "%" + normalizedValue + "%");
yield column + " LIKE #{map." + key + "}";
}
case "doesnotcontain" -> {
paramMap.put(key, "%" + normalizedValue + "%");
yield column + " NOT LIKE #{map." + key + "}";
}
case "startswith" -> {
paramMap.put(key, normalizedValue + "%");
yield column + " LIKE #{map." + key + "}";
}
case "endswith" -> {
paramMap.put(key, "%" + normalizedValue);
yield column + " LIKE #{map." + key + "}";
}
default -> "";
};
}
private String buildQgcMsfbrdmOrderBySql(List<DataSourceRequest.SortDescriptor> sortDescriptors) {
if (CollUtil.isEmpty(sortDescriptors)) {
return " ORDER BY t.flyr DESC, t.stnm ASC, t.ftpName ASC";
}
List<String> parts = new ArrayList<>();
for (DataSourceRequest.SortDescriptor descriptor : sortDescriptors) {
String column = mapQgcMsfbrdmColumn(descriptor.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String direction = "desc".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC";
parts.add(column + " " + direction);
}
if (parts.isEmpty()) {
return " ORDER BY t.flyr DESC, t.stnm ASC, t.ftpName ASC";
}
return " ORDER BY " + String.join(", ", parts);
}
private String buildQgcMsfbrdmGroupSql(String baseSql, List<DataSourceRequest.GroupDescriptor> groups) {
if (CollUtil.isEmpty(groups)) {
return baseSql;
}
List<DataSourceRequest.GroupDescriptor> validGroups = groups.stream()
.filter(group -> StrUtil.isNotBlank(mapQgcMsfbrdmColumn(group.getField())))
.toList();
if (validGroups.isEmpty()) {
return baseSql;
}
List<String> fields = validGroups.stream().map(DataSourceRequest.GroupDescriptor::getField).toList();
StringBuilder sql = new StringBuilder("SELECT ");
for (int i = 0; i < fields.size(); i++) {
if (i > 0) {
sql.append(", ");
}
sql.append(fields.get(i));
}
for (String field : fields) {
sql.append(", COUNT(*) AS count_").append(field);
}
sql.append(" FROM (").append(baseSql).append(") t GROUP BY ");
for (int i = 0; i < fields.size(); i++) {
if (i > 0) {
sql.append(", ");
}
sql.append(fields.get(i));
}
List<String> orderByParts = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : validGroups) {
if (Boolean.FALSE.equals(descriptor.getNeedSortFlag())) {
continue;
}
String direction = "desc".equalsIgnoreCase(descriptor.getDir()) ? "DESC" : "ASC";
orderByParts.add(descriptor.getField() + " " + direction);
}
if (!orderByParts.isEmpty()) {
sql.append(" ORDER BY ").append(String.join(", ", orderByParts));
}
return sql.toString();
}
private String mapQgcMsfbrdmColumn(String field) {
return switch (field) {
case "stcd" -> "t.stcd";
case "stnm" -> "t.stnm";
case "baseId" -> "t.baseId";
case "baseName" -> "t.baseName";
case "rstcd" -> "t.rstcd";
case "ennm" -> "t.ennm";
case "bldstt" -> "t.bldstt";
case "hydrodtin" -> "t.hydrodtin";
case "runState" -> "t.runState";
case "runStateName" -> "t.runStateName";
case "ftp" -> "t.ftp";
case "ftpName" -> "t.ftpName";
case "fcntjh" -> "t.fcntjh";
case "fcntjc" -> "t.fcntjc";
case "flyr" -> "t.flyr";
case "fsz" -> "t.fsz";
case "fwet" -> "t.fwet";
case "fid" -> "t.fid";
default -> "";
};
}
private Object normalizeQgcMsfbrdmValue(String field, Object value) {
if (value == null) {
return null;
}
return switch (field) {
case "fcntjh", "fcntjc", "bldstt", "hydrodtin", "runState" -> Integer.valueOf(String.valueOf(value));
case "flyr" -> String.valueOf(value);
default -> value;
};
}
@SuppressWarnings("unchecked")
private void populateQgcMsfbrdmGroupKeyNames(List<Group> groups) {
if (CollUtil.isEmpty(groups)) {
return;
}
for (Group group : groups) {
if (group == null) {
continue;
}
if ("runState".equals(group.getField()) || "runStateName".equals(group.getField())) {
group.setKeyName(resolveQgcMsfbrdmRunStateName(group.getKey()));
}
if (CollUtil.isNotEmpty(group.getItems()) && group.getItems().get(0) instanceof Group) {
populateQgcMsfbrdmGroupKeyNames((List<Group>) group.getItems());
}
}
}
private String resolveQgcMsfbrdmRunStateName(Object value) {
if (value == null) {
return null;
}
String text = String.valueOf(value);
return switch (text) {
case "0" -> "数据未接入";
case "1" -> "正常运行";
case "2" -> "未正常报送数据";
case "3" -> "未正常运行";
default -> text;
};
}
private DataSourceResult<FbBsmfRQgcVo> queryQgcBsmfRDetailList(DataSourceRequest dataSourceRequest, private DataSourceResult<FbBsmfRQgcVo> queryQgcBsmfRDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) { DataSourceLoadOptionsBase loadOptions) {
Map<String, Object> paramMap = new HashMap<>(); Map<String, Object> paramMap = new HashMap<>();

View File

@ -136,15 +136,15 @@ public class FpBuildServiceImpl implements FpBuildService {
String sql = "SELECT DISTINCT " + String sql = "SELECT DISTINCT " +
" fish.ID AS id, " + " fish.ID AS id, " +
" fish.NAME AS name " + " fish.NAME AS name " +
"FROM SD_FPSS_B_H fp " + "FROM SD_FBRD_B_H fb " +
"INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = fp.RSTCD " + // "INNER JOIN SD_ENGINFO_B_H eng ON eng.STCD = fb.RSTCD " +
" AND NVL(eng.IS_DELETED, 0) = 0 " + // " AND NVL(eng.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_FISHDICTORY_RLTN_B rel ON rel.RVCD = eng.HBRVCD " + "INNER JOIN SD_FISHDICTORY_RLTN_B rel ON rel.BASE_ID = fb.BASE_ID " +
" AND NVL(rel.IS_DELETED, 0) = 0 " + " AND NVL(rel.IS_DELETED, 0) = 0 " +
"INNER JOIN SD_FISHDICTORY_B fish ON fish.ID = NVL(rel.ZY_FISH_ID, rel.FISH_ID) " + "INNER JOIN SD_FISHDICTORY_B fish ON fish.ID = NVL(rel.ZY_FISH_ID, rel.FISH_ID) " +
" AND NVL(fish.IS_DELETED, 0) = 0 " + " AND NVL(fish.IS_DELETED, 0) = 0 " +
" AND NVL(fish.ENABLE, 1) = 1 " + " AND NVL(fish.ENABLE, 1) = 1 " +
"WHERE fp.STCD = #{map.stcd} " + "WHERE fb.STCD = #{map.stcd} " +
"ORDER BY fish.NAME"; "ORDER BY fish.NAME";
List<FpFishDicVo> list = microservicDynamicSQLMapper.getAllListWithResultType( List<FpFishDicVo> list = microservicDynamicSQLMapper.getAllListWithResultType(