feat: 过鱼设施自动数据周旬月年统计表

This commit is contained in:
tangwei 2026-08-13 14:48:11 +08:00
parent 8ce31d9c80
commit 24515bf559
5 changed files with 287 additions and 1 deletions

View File

@ -1389,10 +1389,15 @@ public class FishImportServiceImpl implements IFishImportService {
boolean isUp = lowerName.contains("上行") && !isUpReturn; // 排除上行折返
boolean isDown = lowerName.contains("下行") && !isDownReturn; // 排除下行折返
// 判断 direction 是否为字典编码
boolean isDictCode = "0".equals(direction) || "1".equals(direction) ||
"2".equals(direction) || "3".equals(direction);
if (importRow.getWarnings().contains("stcd")) {
importRow.getWarnings().add("direction");
// 如果是字典编码返回对应的中文否则返回原始数据
return isDictCode ? getDirectionChinese(direction) : direction;
}
// 如果 direction 本身是字典编码0/1/2/3直接识别
if ("0".equals(direction)) {
isUp = true;

View File

@ -148,4 +148,10 @@ public class FishPassageController {
public ResponseResult getQgcFpssrlQdaySKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fpRunService.processQgcFpssrlQdaySKendoList(dataSourceRequest));
}
@PostMapping("/fpssrlQdrtps/GetKendoListCust")
@Operation(summary = "过鱼设施自动数据周旬月年统计表SD_FPSSRLDRTP_S")
public ResponseResult getQgcFpssrlQdrtpSKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(fpRunService.processQgcFpssrlQdrtpSKendoList(dataSourceRequest));
}
}

View File

@ -0,0 +1,65 @@
package com.yfd.platform.qgc_env.fp.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 过鱼设施自动数据(带水温,流速)周旬月年统计表 VO
* </p>
* <p>对应新表 SD_FPSSRLDRTP_S旧系统 SD_FPSSRLQDRTP_S</p>
*/
@Data
@Schema(description = "过鱼设施自动数据周旬月年统计表")
public class FpFpssrlQdrtpSVo {
@Schema(description = "主键ID")
private String id;
@Schema(description = "过鱼设施编码")
private String stcd;
@Schema(description = "数据时间")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date tm;
@Schema(description = "维度类型WEEK=周 TEN=旬 MON=月 QUA=季 YEAR=年")
private String drtp;
@Schema(description = "YYYY")
private Long year;
@Schema(description = "")
private Long month;
@Schema(description = "时段类型")
private Long dr;
@Schema(description = "鱼类")
private String ftp;
@Schema(description = "自动过鱼设施过鱼数量")
private Long fcnt;
@Schema(description = "水温,单位:℃")
private BigDecimal temperature;
@Schema(description = "水位单位m")
private BigDecimal waterlevel;
@Schema(description = "流速单位m/s")
private BigDecimal speed;
@Schema(description = "流量单位m3/s")
private BigDecimal q;
@Schema(description = "溶氧单位mg/L")
private BigDecimal dox;
@Schema(description = "浊度单位NTU")
private BigDecimal tu;
}

View File

@ -12,6 +12,7 @@ import com.yfd.platform.qgc_env.fp.entity.vo.FpTreeStcdGroupVo;
import com.yfd.platform.qgc_env.fp.entity.vo.YearFpStatisticsVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpOverfishTotalVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdaySVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdrtpSVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunPlanVo;
import java.util.List;
@ -41,4 +42,6 @@ public interface FpRunService {
DataSourceResult<FpOverfishTotalVo> processQgcOverfishTotalKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<FpFpssrlQdaySVo> processQgcFpssrlQdaySKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<FpFpssrlQdrtpSVo> processQgcFpssrlQdrtpSKendoList(DataSourceRequest dataSourceRequest);
}

View File

@ -17,6 +17,7 @@ import com.yfd.platform.qgc_env.fp.entity.vo.FbFishRunVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFishSelectVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQueryVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdaySVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFpssrlQdrtpSVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpFtpStatisticsVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpOverfishTotalVo;
import com.yfd.platform.qgc_env.fp.entity.vo.FpRunAnalysisHeadColumnVo;
@ -3312,4 +3313,210 @@ public class FpRunServiceImpl implements FpRunService {
return orders.isEmpty() ? " ORDER BY t.DT DESC" : " ORDER BY " + String.join(", ", orders);
}
// ==================== 过鱼设施自动数据周旬月年统计表 ====================
@Override
public DataSourceResult<FpFpssrlQdrtpSVo> processQgcFpssrlQdrtpSKendoList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
if (CollUtil.isEmpty(dataSourceRequest == null ? null : dataSourceRequest.getGroup())) {
return queryFpssrlQdrtpSDetailList(dataSourceRequest, loadOptions);
}
return queryFpssrlQdrtpSGroupList(dataSourceRequest, loadOptions);
}
private DataSourceResult<FpFpssrlQdrtpSVo> queryFpssrlQdrtpSDetailList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append(buildFpssrlQdrtpSSelectSql(dataSourceRequest == null ? null : dataSourceRequest.getSelect()))
.append(" FROM (")
.append(buildFpssrlQdrtpSCoreSql())
.append(") t WHERE 1 = 1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0},
this::mapFpssrlQdrtpSColumn
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
sql.append(buildFpssrlQdrtpSOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<FpFpssrlQdrtpSVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, FpFpssrlQdrtpSVo.class
);
DataSourceResult<FpFpssrlQdrtpSVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private DataSourceResult<FpFpssrlQdrtpSVo> queryFpssrlQdrtpSGroupList(DataSourceRequest dataSourceRequest,
DataSourceLoadOptionsBase loadOptions) {
List<DataSourceRequest.GroupDescriptor> groups = dataSourceRequest.getGroup();
GroupingInfo[] groupInfos = loadOptions == null ? new GroupingInfo[0] : loadOptions.getGroup();
List<String> selectItems = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapFpssrlQdrtpSColumn(descriptor.getField());
if (StrUtil.isBlank(column)) {
continue;
}
selectItems.add(column + " AS " + descriptor.getField().toUpperCase());
selectItems.add("COUNT(*) AS COUNT_" + descriptor.getField().toUpperCase());
if (CollUtil.isNotEmpty(descriptor.getAggregates())) {
for (DataSourceRequest.AggregateDescriptor aggregate : descriptor.getAggregates()) {
String aggregateColumn = mapFpssrlQdrtpSColumn(aggregate.getField());
if (StrUtil.isBlank(aggregateColumn) || StrUtil.isBlank(aggregate.getAggregate())) {
continue;
}
selectItems.add(buildAggregateSql(aggregate.getAggregate(), aggregateColumn, aggregate.getField()));
}
}
}
if (selectItems.isEmpty()) {
selectItems.add("t.STCD AS STCD");
selectItems.add("COUNT(*) AS COUNT_STCD");
}
StringBuilder sql = new StringBuilder("SELECT ");
sql.append(String.join(", ", selectItems))
.append(" FROM (")
.append(buildFpssrlQdrtpSCoreSql())
.append(") t WHERE 1 = 1 ");
Map<String, Object> paramMap = new HashMap<>();
String filterSql = QgcQueryWrapperUtil.buildFilterCondition(
dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap,
new int[]{0},
this::mapFpssrlQdrtpSColumn
);
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql).append(" ");
}
List<String> groupByColumns = new ArrayList<>();
for (DataSourceRequest.GroupDescriptor descriptor : groups) {
if (descriptor == null || StrUtil.isBlank(descriptor.getField())) {
continue;
}
String column = mapFpssrlQdrtpSColumn(descriptor.getField());
if (StrUtil.isNotBlank(column)) {
groupByColumns.add(column);
}
}
if (!groupByColumns.isEmpty()) {
sql.append(" GROUP BY ").append(String.join(", ", groupByColumns)).append(" ");
}
sql.append(buildFpssrlQdrtpSOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, sql.toString(), paramMap);
DataSourceResult<FpFpssrlQdrtpSVo> result = new DataSourceResult<>();
if (dataSourceRequest.getGroupResultFlat() != null && dataSourceRequest.getGroupResultFlat()) {
result.setData((List<FpFpssrlQdrtpSVo>) (List<?>) new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData((List<FpFpssrlQdrtpSVo>) (List<?>) new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
/**
* 过鱼设施自动数据周旬月年统计表核心 SQL单表 SD_FPSSRLDRTP_S
*/
private String buildFpssrlQdrtpSCoreSql() {
return "SELECT t.ID, t.STCD, t.TM, t.DRTP, t.YEAR, t.MONTH, t.DR, t.FTP, t.FCNT, " +
"t.TEMPERATURE, t.WATERLEVEL, t.SPEED, t.Q, t.DOX, t.TU " +
"FROM SD_FPSSRLDRTP_S t " +
"WHERE NVL(t.IS_DELETED, 0) = 0 ";
}
private String buildFpssrlQdrtpSSelectSql(List<String> selectFields) {
Map<String, String> columns = new LinkedHashMap<>();
columns.put("id", "t.ID AS id");
columns.put("stcd", "t.STCD AS stcd");
columns.put("tm", "t.TM AS tm");
columns.put("drtp", "t.DRTP AS drtp");
columns.put("year", "t.YEAR AS year");
columns.put("month", "t.MONTH AS month");
columns.put("dr", "t.DR AS dr");
columns.put("ftp", "t.FTP AS ftp");
columns.put("fcnt", "t.FCNT AS fcnt");
columns.put("temperature", "t.TEMPERATURE AS temperature");
columns.put("waterlevel", "t.WATERLEVEL AS waterlevel");
columns.put("speed", "t.SPEED AS speed");
columns.put("q", "t.Q AS q");
columns.put("dox", "t.DOX AS dox");
columns.put("tu", "t.TU AS tu");
List<String> selected = new ArrayList<>();
if (CollUtil.isEmpty(selectFields)) {
selected.addAll(columns.values());
} else {
for (String field : selectFields) {
String column = columns.get(field);
if (StrUtil.isNotBlank(column)) {
selected.add(column);
}
}
if (selected.isEmpty()) {
selected.addAll(columns.values());
}
}
return String.join(", ", selected);
}
private String mapFpssrlQdrtpSColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
return switch (field.toLowerCase()) {
case "id" -> "t.ID";
case "stcd" -> "t.STCD";
case "tm" -> "t.TM";
case "drtp" -> "t.DRTP";
case "year" -> "t.YEAR";
case "month" -> "t.MONTH";
case "dr" -> "t.DR";
case "ftp" -> "t.FTP";
case "fcnt" -> "t.FCNT";
case "temperature" -> "t.TEMPERATURE";
case "waterlevel" -> "t.WATERLEVEL";
case "speed" -> "t.SPEED";
case "q" -> "t.Q";
case "dox" -> "t.DOX";
case "tu" -> "t.TU";
default -> null;
};
}
private String buildFpssrlQdrtpSOrderBySql(List<DataSourceRequest.SortDescriptor> sortList) {
if (CollUtil.isEmpty(sortList)) {
return " ORDER BY t.YEAR DESC, t.MONTH DESC, t.DR DESC";
}
List<String> orders = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sortList) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapFpssrlQdrtpSColumn(sort.getField());
if (StrUtil.isBlank(column)) {
continue;
}
String dir = "desc".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
orders.add(column + " " + dir);
}
return orders.isEmpty() ? " ORDER BY t.YEAR DESC, t.MONTH DESC, t.DR DESC" : " ORDER BY " + String.join(", ", orders);
}
}