feat: 过鱼设施自动数据周旬月年统计表
This commit is contained in:
parent
8ce31d9c80
commit
24515bf559
@ -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;
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user