feat: 动物救助站建设及接入情况

This commit is contained in:
tangwei 2026-06-11 17:24:50 +08:00
parent 23f0c51edd
commit ea91144830
4 changed files with 353 additions and 0 deletions

View File

@ -52,4 +52,10 @@ public class VapConstructionController {
public ResponseResult getWvaKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getWvaKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vpConstructionService.processWvaKendoList(dataSourceRequest)); return ResponseResult.successData(vpConstructionService.processWvaKendoList(dataSourceRequest));
} }
@PostMapping("/vac/GetKendoListCust")
@Operation(summary = "动物救助站建设及接入情况")
public ResponseResult getVacKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(vpConstructionService.processVacKendoList(dataSourceRequest));
}
} }

View File

@ -0,0 +1,65 @@
package com.yfd.platform.qgc_env.vap.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
@Data
@Schema(description = "动物救助站建设及接入情况")
public class VpVacVo {
@Schema(description = "测站编码")
private String stcd;
@Schema(description = "基础对象名称")
private String stnm;
@Schema(description = "业务类型名称")
private String sttpName;
@Schema(description = "所属基地ID")
private String baseId;
@Schema(description = "所属基地名称")
private String baseName;
@Schema(description = "水电站名称")
private String ennm;
@Schema(description = "是否接入")
private String dtin;
@Schema(description = "是否接入名称")
private String dtinName;
@Schema(description = "建设状态")
private String bldsttCcode;
@Schema(description = "建设状态名称")
private String bldsttCcodeName;
@Schema(description = "开工日期")
private Date ststdt;
@Schema(description = "建成日期")
private Date esstdt;
@Schema(description = "LOGO")
private String logo;
@Schema(description = "简介")
private String introduce;
@Schema(description = "介绍弹窗图片")
private String inffile;
@Schema(description = "基地排序")
private Integer baseStepSort;
@Schema(description = "电站排序")
private Integer rstcdStepSort;
@Schema(description = "站点排序")
private Integer siteStepSort;
}

View File

@ -4,6 +4,7 @@ import com.yfd.platform.common.DataSourceRequest;
import com.yfd.platform.common.DataSourceResult; import com.yfd.platform.common.DataSourceResult;
import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpVacVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpWvaRunVo;
public interface VpConstructionService { public interface VpConstructionService {
@ -17,4 +18,6 @@ public interface VpConstructionService {
DataSourceResult<VpBasinIntDetailVo> basinVpIntDetail(DataSourceRequest dataSourceRequest); DataSourceResult<VpBasinIntDetailVo> basinVpIntDetail(DataSourceRequest dataSourceRequest);
DataSourceResult<VpWvaRunVo> processWvaKendoList(DataSourceRequest dataSourceRequest); DataSourceResult<VpWvaRunVo> processWvaKendoList(DataSourceRequest dataSourceRequest);
DataSourceResult<VpVacVo> processVacKendoList(DataSourceRequest dataSourceRequest);
} }

View File

@ -11,6 +11,7 @@ import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import com.yfd.platform.common.PageInfo; import com.yfd.platform.common.PageInfo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpBasinIntDetailVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpConstructionSituationVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpVacVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpStBaseInfoVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStBaseInfoVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpStInfoResultVo;
import com.yfd.platform.qgc_env.vap.entity.vo.VpVmsstbprptVo; import com.yfd.platform.qgc_env.vap.entity.vo.VpVmsstbprptVo;
@ -213,6 +214,284 @@ public class VpConstructionServiceImpl implements VpConstructionService {
return result; return result;
} }
@Override
public DataSourceResult<VpVacVo> processVacKendoList(DataSourceRequest dataSourceRequest) {
DataSourceLoadOptionsBase loadOptions = dataSourceRequest == null ? null : dataSourceRequest.toDevRequest();
PageInfo pageInfo = loadOptions == null ? new PageInfo() : QgcQueryWrapperUtil.getPageInfo(loadOptions);
Page<?> page = pageInfo.getHasPageInfo() ? pageInfo.getPage() : null;
String isZoo = loadOptions == null ? null : QgcQueryWrapperUtil.getFilterFieldValue(loadOptions, "isZoo");
Map<String, Object> paramMap = new HashMap<>();
StringBuilder sql = new StringBuilder(buildVacBaseSql("1".equals(isZoo)));
String filterSql = buildVacFilterCondition(dataSourceRequest == null ? null : dataSourceRequest.getFilter(),
paramMap, new int[]{0});
if (StrUtil.isNotBlank(filterSql)) {
sql.append(" AND ").append(filterSql);
}
String groupBy = dataSourceRequest == null ? null : KendoUtil.getGroupBy(dataSourceRequest);
GroupingInfo[] groupInfos = loadOptions == null ? null : loadOptions.getGroup();
if (StrUtil.isNotBlank(groupBy) && groupInfos != null && groupInfos.length > 0) {
String groupedSql = buildVacGroupSql(sql.toString(), groupInfos);
List<Map<String, Object>> rows = microservicDynamicSQLMapper.pageAllList(null, groupedSql, paramMap);
DataSourceResult result = new DataSourceResult();
if (Boolean.TRUE.equals(dataSourceRequest.getGroupResultFlat())) {
result.setData(new GroupHelper().faltGroup(rows, Arrays.asList(groupInfos)));
} else {
result.setData(new GroupHelper().group(rows, Arrays.asList(groupInfos)));
}
result.setTotal(0L);
result.setAggregates(new HashMap<>());
return result;
}
sql.append(buildVacOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort()));
List<VpVacVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, VpVacVo.class
);
DataSourceResult<VpVacVo> result = new DataSourceResult<>();
result.setData(list);
result.setTotal(page != null ? page.getTotal() : list.size());
result.setAggregates(new HashMap<>());
return result;
}
private String buildVacBaseSql(boolean isZoo) {
String baseIdExpr = isZoo ? "CASE WHEN va.BASE_ID IS NULL THEN 'null' ELSE va.BASE_ID END" : "va.BASE_ID";
String dtinExpr = isZoo ? "CASE WHEN va.DTIN IS NULL THEN '400' ELSE TO_CHAR(va.DTIN) END" : "TO_CHAR(va.DTIN)";
return "SELECT " +
"va.STCD AS stcd, " +
"va.STNM AS stnm, " +
"sttp.STTP_NAME AS sttpName, " +
baseIdExpr + " AS baseId, " +
"hb.BASENAME AS baseName, " +
"eng.ENNM AS ennm, " +
dtinExpr + " AS dtin, " +
"CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END AS dtinName, " +
"TO_CHAR(va.BLDSTT_CODE) AS bldsttCcode, " +
"CASE WHEN NVL(va.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(va.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END AS bldsttCcodeName, " +
"va.SWDT AS ststdt, " +
"va.JCDT AS esstdt, " +
"va.LOGO AS logo, " +
"va.INTRODUCE AS introduce, " +
"va.INFFILE AS inffile, " +
"NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, " +
"NVL(eng.ORDER_INDEX, 999999) AS rstcdStepSort, " +
"NVL(va.ORDER_INDEX, 999999) AS siteStepSort " +
"FROM SD_VA_B_H va " +
"LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = va.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = va.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 " +
"LEFT JOIN SD_STTP_B sttp ON sttp.STTP_CODE = va.STTP " +
"AND NVL(sttp.IS_DELETED, 0) = 0 AND NVL(sttp.ENABLE, 1) = 1 " +
"WHERE va.STTP = 'VA' AND NVL(va.IS_DELETED, 0) = 0 ";
}
private String buildVacFilterCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
if (filter == null) {
return "";
}
if (StrUtil.isNotBlank(filter.getField())) {
return buildVacLeafCondition(filter, paramMap, indexHolder);
}
if (CollectionUtils.isEmpty(filter.getFilters())) {
return "";
}
List<String> conditions = new ArrayList<>();
for (DataSourceRequest.FilterDescriptor child : filter.getFilters()) {
String childSql = buildVacFilterCondition(child, paramMap, indexHolder);
if (StrUtil.isNotBlank(childSql)) {
conditions.add("(" + childSql + ")");
}
}
if (conditions.isEmpty()) {
return "";
}
return String.join("or".equalsIgnoreCase(filter.getLogic()) ? " OR " : " AND ", conditions);
}
private String buildVacLeafCondition(DataSourceRequest.FilterDescriptor filter,
Map<String, Object> paramMap,
int[] indexHolder) {
String field = filter.getField();
if ("isZoo".equals(field)) {
return "";
}
Object value = filter.getValue();
String operator = StrUtil.blankToDefault(filter.getOperator(), "eq").toLowerCase();
if ("keyword".equals(field)) {
if (value == null || StrUtil.isBlank(String.valueOf(value))) {
return "";
}
String paramKey = "vacParam" + indexHolder[0]++;
paramMap.put(paramKey, "%" + value + "%");
return "(va.STNM LIKE #{map." + paramKey + "} OR hb.BASENAME LIKE #{map." + paramKey + "} OR eng.ENNM LIKE #{map." + paramKey + "})";
}
String column = mapVacColumn(field);
if (StrUtil.isBlank(column)) {
return "";
}
if ("isnull".equals(operator)) {
return column + " IS NULL";
}
if ("isnotnull".equals(operator)) {
return column + " IS NOT NULL";
}
if ("in".equals(operator)) {
List<Object> values = normalizeValues(value);
if (values.isEmpty()) {
return "";
}
List<String> placeholders = new ArrayList<>();
for (Object item : values) {
String paramKey = "vacParam" + indexHolder[0]++;
paramMap.put(paramKey, item);
placeholders.add("#{map." + paramKey + "}");
}
return column + " IN (" + String.join(", ", placeholders) + ")";
}
if (value == null) {
return "";
}
String paramKey = "vacParam" + indexHolder[0]++;
switch (operator) {
case "eq":
paramMap.put(paramKey, value);
return column + " = #{map." + paramKey + "}";
case "neq":
paramMap.put(paramKey, value);
return column + " <> #{map." + paramKey + "}";
case "contains":
paramMap.put(paramKey, "%" + value + "%");
return column + " LIKE #{map." + paramKey + "}";
case "startswith":
paramMap.put(paramKey, value + "%");
return column + " LIKE #{map." + paramKey + "}";
case "endswith":
paramMap.put(paramKey, "%" + value);
return column + " LIKE #{map." + paramKey + "}";
case "gt":
paramMap.put(paramKey, value);
return column + " > #{map." + paramKey + "}";
case "gte":
paramMap.put(paramKey, value);
return column + " >= #{map." + paramKey + "}";
case "lt":
paramMap.put(paramKey, value);
return column + " < #{map." + paramKey + "}";
case "lte":
paramMap.put(paramKey, value);
return column + " <= #{map." + paramKey + "}";
default:
return "";
}
}
private String buildVacGroupSql(String detailSql, GroupingInfo[] groupInfos) {
List<String> groupFields = new ArrayList<>();
List<String> orderItems = new ArrayList<>();
StringBuilder sql = new StringBuilder("SELECT ");
boolean first = true;
for (GroupingInfo item : groupInfos) {
if (item == null || StrUtil.isBlank(item.getSelector())) {
continue;
}
String selector = item.getSelector();
if (!isVacGroupSupported(selector)) {
continue;
}
if (!first) {
sql.append(", ");
}
sql.append("t.").append(selector).append(" AS ").append(selector)
.append(", COUNT(*) AS count_").append(selector);
groupFields.add("t." + selector);
orderItems.add("t." + selector + (item.getDesc() ? " DESC" : " ASC"));
first = false;
}
if (groupFields.isEmpty()) {
return "SELECT * FROM (" + detailSql + ") t WHERE 1 = 0";
}
sql.append(" FROM (").append(detailSql).append(") t GROUP BY ")
.append(String.join(", ", groupFields));
if (!orderItems.isEmpty()) {
sql.append(" ORDER BY ").append(String.join(", ", orderItems));
}
return sql.toString();
}
private boolean isVacGroupSupported(String selector) {
return "stcd".equals(selector)
|| "stnm".equals(selector)
|| "sttpName".equals(selector)
|| "baseId".equals(selector)
|| "baseName".equals(selector)
|| "ennm".equals(selector)
|| "dtin".equals(selector)
|| "dtinName".equals(selector)
|| "bldsttCcode".equals(selector)
|| "bldsttCcodeName".equals(selector);
}
private String mapVacColumn(String field) {
if (StrUtil.isBlank(field)) {
return null;
}
Map<String, String> columnMap = new HashMap<>();
columnMap.put("stcd", "va.STCD");
columnMap.put("stnm", "va.STNM");
columnMap.put("sttpName", "sttp.STTP_NAME");
columnMap.put("baseId", "va.BASE_ID");
columnMap.put("baseName", "hb.BASENAME");
columnMap.put("ennm", "eng.ENNM");
columnMap.put("dtin", "va.DTIN");
columnMap.put("dtinName", "CASE WHEN NVL(va.DTIN, 0) = 1 THEN '已接入' ELSE '未接入' END");
columnMap.put("bldstt", "va.BLDSTT_CODE");
columnMap.put("bldsttCcode", "va.BLDSTT_CODE");
columnMap.put("bldsttCcodeName",
"CASE WHEN NVL(va.BLDSTT_CODE, 0) = 2 THEN '已建' WHEN NVL(va.BLDSTT_CODE, 0) = 1 THEN '在建' ELSE '未建/规划' END");
columnMap.put("ststdt", "va.SWDT");
columnMap.put("esstdt", "va.JCDT");
columnMap.put("logo", "va.LOGO");
columnMap.put("introduce", "va.INTRODUCE");
columnMap.put("inffile", "va.INFFILE");
return columnMap.get(field);
}
private String buildVacOrderBySql(List<DataSourceRequest.SortDescriptor> sorts) {
if (sorts == null || sorts.isEmpty()) {
return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, va.STCD ASC";
}
List<String> orderItems = new ArrayList<>();
for (DataSourceRequest.SortDescriptor sort : sorts) {
if (sort == null || StrUtil.isBlank(sort.getField())) {
continue;
}
String column = mapVacColumn(sort.getField());
if (StrUtil.isBlank(column)) {
column = switch (sort.getField()) {
case "baseStepSort" -> "hb.ORDER_INDEX";
case "rstcdStepSort" -> "eng.ORDER_INDEX";
case "siteStepSort" -> "va.ORDER_INDEX";
default -> null;
};
}
if (StrUtil.isBlank(column)) {
continue;
}
String direction = "desc".equalsIgnoreCase(sort.getDir()) || "des".equalsIgnoreCase(sort.getDir()) ? "DESC" : "ASC";
orderItems.add(column + " " + direction + " NULLS LAST");
}
if (orderItems.isEmpty()) {
return " ORDER BY NVL(hb.ORDER_INDEX, 999999) ASC, NVL(eng.ORDER_INDEX, 999999) ASC, NVL(va.ORDER_INDEX, 999999) ASC, va.STCD ASC";
}
return " ORDER BY " + String.join(", ", orderItems);
}
private String buildWvaBaseSql() { private String buildWvaBaseSql() {
return "SELECT " + return "SELECT " +
"va.STCD AS stcd, " + "va.STCD AS stcd, " +