feat: 水质锚点

This commit is contained in:
tangwei 2026-07-03 15:56:36 +08:00
parent 9ba6df9f5e
commit cf2885f8e2
4 changed files with 441 additions and 0 deletions

View File

@ -156,4 +156,10 @@ public class EnvWqDataController {
public ResponseResult getRuleKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) { public ResponseResult getRuleKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(envWqDataService.getWqWarRuleList(dataSourceRequest)); return ResponseResult.successData(envWqDataService.getWqWarRuleList(dataSourceRequest));
} }
@PostMapping("/anchorPoint/GetKendoListCust")
@Operation(summary = "水质锚点")
public ResponseResult getAnchorPointKendoListCust(@RequestBody DataSourceRequest dataSourceRequest) {
return ResponseResult.successData(envWqDataService.getAnchorPointKendoListCust(dataSourceRequest));
}
} }

View File

@ -0,0 +1,228 @@
package com.yfd.platform.qgc_env.wq.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
@Schema(description = "水质锚点VO")
public class EnvWqAnchorPointVo {
@Schema(description = "断面")
private String stcd;
@Schema(description = "断面名称")
private String stnm;
@Schema(description = "电站名称")
private String ennm;
@Schema(description = "数据接入类型0=自建 1=国家建 2=人工")
private Integer dtinType;
@Schema(description = "所在位置")
private String stlc;
@Schema(description = "水质要求")
private String wwqtg;
@Schema(description = "水质要求名称")
private String wwqtgName;
@Schema(description = "水质是否达标")
private Integer sfdb;
@Schema(description = "数据时间")
private Date tm;
@Schema(description = "水质类别:监测结果")
private String wqGrd;
@Schema(description = "水质类别名称")
private String wqGrdName;
@Schema(description = "站点类型 - 用于锚点弹框显示")
private String sttp;
@Schema(description = "经度")
private BigDecimal lgtd;
@Schema(description = "纬度")
private BigDecimal lttd;
@Schema(description = "高程")
private BigDecimal dtmel;
@Schema(description = "描点状态 - 用于图例")
private String anchoPointState;
@Schema(description = "锚点类型 - 用于锚点浮框显示")
private String sttpMap;
@Schema(description = "弹框站点名称")
private String titleName;
@Schema(description = "基地id")
private String baseId;
@Schema(description = "栖息地名称")
private String fhstnm;
@Schema(description = "栖息地编码")
private String fhstcd;
private String addvcdName;
private String baseName;
private String hbrvcd;
private String hbrvcdName;
private String rvcdName;
private String rstcd;
private Integer rstcdStepSort;
private Integer siteStepSort;
private Integer baseStepSort;
private Integer rvcdStepSort;
@Schema(description = "地图避让")
private Integer distance;
private String sttpCode;
private String value;
private String alias;
@Schema(description = "水温")
private BigDecimal wtmp;
@Schema(description = "PH")
private BigDecimal ph;
@Schema(description = "溶解氧")
private BigDecimal dox;
@Schema(description = "高锰酸盐指数")
private BigDecimal codmn;
@Schema(description = "化学需氧量")
private BigDecimal codcr;
@Schema(description = "五日生化需氧量")
private BigDecimal bod5;
@Schema(description = "氨氮")
private BigDecimal nh3n;
@Schema(description = "总磷")
private BigDecimal tp;
@Schema(description = "总氮")
private BigDecimal tn;
@Schema(description = "")
private BigDecimal cu;
@Schema(description = "")
private BigDecimal zn;
@Schema(description = "氟化物")
private BigDecimal f;
@Schema(description = "")
private BigDecimal se;
@Schema(description = "")
private BigDecimal ars;
@Schema(description = "")
private BigDecimal hg;
@Schema(description = "")
private BigDecimal cd;
@Schema(description = "铬(六价)")
private BigDecimal cr6;
@Schema(description = "")
private BigDecimal pb;
@Schema(description = "氰化物")
private BigDecimal cn;
@Schema(description = "挥发酚")
private BigDecimal vlph;
@Schema(description = "石油类")
private BigDecimal oil;
@Schema(description = "阴离子表面活性剂")
private BigDecimal las;
@Schema(description = "硫化物")
private BigDecimal s2;
@Schema(description = "粪大肠菌群")
private BigDecimal fcg;
@Schema(description = "氯化物")
private BigDecimal cl;
@Schema(description = "硫酸盐")
private BigDecimal so4;
@Schema(description = "硝酸盐氮")
private BigDecimal no3;
@Schema(description = "总硬度")
private BigDecimal thrd;
@Schema(description = "电导率")
private BigDecimal cond;
@Schema(description = "")
private BigDecimal fe;
@Schema(description = "")
private BigDecimal mn;
@Schema(description = "")
private BigDecimal al;
@Schema(description = "叶绿素a")
private BigDecimal chla;
@Schema(description = "透明度")
private BigDecimal clarity;
@Schema(description = "浊度")
private BigDecimal tu;
@Schema(description = "总氧/总需氧量")
private BigDecimal tod;
@Schema(description = "蓝绿藻")
private BigDecimal cyano;
@Schema(description = "水质要素最小限值集合")
private List<Map<String, Object>> min;
@Schema(description = "水质要素最大限值集合")
private List<Map<String, Object>> max;
@Schema(description = "排序")
private Integer orderIndex;
private String engLctn1Code;
private String engLctn3Code;
public void setWqGrd(String wqGrd) {
this.wqGrd = wqGrd;
this.value = wqGrd;
}
public void setWqGrdName(String wqGrdName) {
this.wqGrdName = wqGrdName;
this.alias = wqGrdName;
}
}

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_base.entity.vo.BatchDeleteAo; import com.yfd.platform.qgc_base.entity.vo.BatchDeleteAo;
import com.yfd.platform.qgc_env.wq.entity.vo.WqBaseInfoVo; import com.yfd.platform.qgc_env.wq.entity.vo.WqBaseInfoVo;
import com.yfd.platform.qgc_env.wq.entity.vo.EnvWqAnchorPointVo;
import java.util.Map; import java.util.Map;
@ -42,4 +43,6 @@ public interface EnvWqDataService {
boolean updateWqRsData(Map<String, Object> updateData, String source); boolean updateWqRsData(Map<String, Object> updateData, String source);
boolean removeKendoByIds(BatchDeleteAo batchDeleteAo); boolean removeKendoByIds(BatchDeleteAo batchDeleteAo);
DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest);
} }

View File

@ -16,6 +16,7 @@ import com.yfd.platform.qgc_base.mapper.MsOperationLogMapper;
import com.yfd.platform.qgc_env.wq.entity.vo.*; import com.yfd.platform.qgc_env.wq.entity.vo.*;
import com.yfd.platform.qgc_env.wq.service.EnvWqDataService; import com.yfd.platform.qgc_env.wq.service.EnvWqDataService;
import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo; import com.yfd.platform.qgc_env.wt.entity.vo.WbsbVo;
import com.yfd.platform.qgc_env.wt.utils.SiteAvoidanceUtils;
import com.yfd.platform.utils.KendoUtil; import com.yfd.platform.utils.KendoUtil;
import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.QgcQueryWrapperUtil;
import com.yfd.platform.utils.RequestHolder; import com.yfd.platform.utils.RequestHolder;
@ -37,7 +38,9 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
@Service @Service
public class EnvWqDataServiceImpl implements EnvWqDataService { public class EnvWqDataServiceImpl implements EnvWqDataService {
@ -4539,4 +4542,205 @@ public class EnvWqDataServiceImpl implements EnvWqDataService {
")"; ")";
jdbcTemplate.update(mergeSql, stcd, startDate, endDate); jdbcTemplate.update(mergeSql, stcd, startDate, endDate);
} }
@Override
public DataSourceResult<EnvWqAnchorPointVo> getAnchorPointKendoListCust(DataSourceRequest dataSourceRequest) {
DataSourceResult<EnvWqAnchorPointVo> dataSourceResult = new DataSourceResult<>();
dataSourceResult.setAggregates(new HashMap<>());
if (dataSourceRequest == null) {
dataSourceResult.setData(new ArrayList<>());
dataSourceResult.setTotal(0L);
return dataSourceResult;
}
DataSourceLoadOptionsBase loadOptionsBase = dataSourceRequest.toDevRequest();
String sttpCode = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "sttpCode");
String time = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "tm");
String fhFlag = QgcQueryWrapperUtil.getFilterFieldValue(loadOptionsBase, "fhFlag");
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("t.STCD AS stcd, ")
.append("t.STNM AS stnm, ")
.append("t.STTP AS sttp, ")
.append("t.STTP AS sttpCode, ")
.append("t.LGTD AS lgtd, ")
.append("t.LTTD AS lttd, ")
.append("t.ELEV AS dtmel, ")
.append("t.STLC AS stlc, ")
.append("t.WWQTG AS wwqtg, ")
.append("t.DTIN_TYPE AS dtinType, ")
.append("t.RSTCD AS rstcd, ")
.append("t.FHSTCD AS fhstcd, ")
.append("t.ORDER_INDEX AS orderIndex, ")
.append("eng.ENNM AS ennm, ")
.append("hb.BASE_NAME AS baseName, ")
.append("hb.BASEID AS baseId, ")
.append("eng.HBRVCD AS hbrvcd, ")
.append("NVL(hbrv.NAME, '') AS hbrvcdName, ")
.append("NVL(rvcd.NAME, '') AS rvcdName, ")
.append("NVL(addvcd.NAME, '') AS addvcdName, ")
.append("NVL(along.ORDER_INDEX, 999999) AS rvcdStepSort, ")
.append("NVL(rstSort.SORT, 999999) AS rstcdStepSort, ")
.append("NVL(siteSort.SORT, 999999) AS siteStepSort, ")
.append("NVL(hb.ORDER_INDEX, 999999) AS baseStepSort, ")
.append("'' AS engLctn1Code, ")
.append("'' AS engLctn3Code ")
.append("FROM SD_WQ_B_H t ")
.append("LEFT JOIN SD_ENGINFO_B_H eng ON eng.STCD = t.RSTCD AND NVL(eng.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HYDROBASE hb ON hb.BASEID = eng.BASE_ID AND NVL(hb.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_HBRV_DIC hbrv ON hbrv.CODE = eng.HBRVCD AND NVL(hbrv.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_RVCD_DIC rvcd ON rvcd.CODE = eng.RVCD AND NVL(rvcd.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN SD_ADDVCD_DIC addvcd ON addvcd.CODE = eng.ADDVCD AND NVL(addvcd.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN MS_ALONG_B along ON along.RVCD = eng.HBRVCD AND along.CODE = 'common' AND NVL(along.IS_DELETED, 0) = 0 ")
.append("LEFT JOIN ( ")
.append(" SELECT det.SORT, cfg.RVCD, det.STCD ")
.append(" FROM MS_ALONGDET_B det ")
.append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ")
.append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ")
.append(") rstSort ON rstSort.RVCD = eng.HBRVCD AND rstSort.STCD = t.RSTCD ")
.append("LEFT JOIN ( ")
.append(" SELECT det.SORT, cfg.RVCD, det.STCD ")
.append(" FROM MS_ALONGDET_B det ")
.append(" INNER JOIN MS_ALONG_B cfg ON det.ALONG_ID = cfg.ID ")
.append(" WHERE NVL(det.IS_DELETED, 0) = 0 AND NVL(cfg.IS_DELETED, 0) = 0 AND cfg.CODE = 'common' ")
.append(") siteSort ON siteSort.RVCD = eng.HBRVCD AND siteSort.STCD = t.STCD ")
.append("WHERE NVL(t.IS_DELETED, 0) = 0 ")
.append("AND NVL(t.USFL, 1) = 1 ")
.append("AND t.LGTD IS NOT NULL ")
.append("AND t.LTTD IS NOT NULL ");
DataSourceLoadOptionsBase loadOptions = dataSourceRequest.toDevRequest();
Page<?> page = loadOptions == null ? null : QgcQueryWrapperUtil.buildPage(loadOptions, loadOptions.getSkip(), loadOptions.getTake());
List<EnvWqAnchorPointVo> wqVoList = microservicDynamicSQLMapper.pageAllListWithResultType(page, sql.toString(), new HashMap<>(), EnvWqAnchorPointVo.class);
if (CollectionUtils.isNotEmpty(wqVoList)) {
List<String> stcdList = wqVoList.stream()
.filter(w -> StrUtil.isNotBlank(w.getStcd()))
.map(w -> w.getStcd().trim())
.distinct()
.collect(Collectors.toList());
String wqDataSql = "SELECT STCD, TM, WQGRD, SFDB, WTMP, PH, DOX, CODMN, CODCR, BOD5, NH3N, TP, TN, CU, ZN, F, SE, ARS, HG, CD, CR6, PB, CN, VLPH, OIL, LAS, S2, FCG, CL, SO4, NO3, THRD, COND, FE, MN, AL, CHLA, CLARITY, TU, CYANO, TOD " +
"FROM ( " +
" SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.STCD ORDER BY t.TM DESC) AS rn " +
" FROM SD_WQ_R t " +
" WHERE t.STCD IN (" + String.join(",", stcdList.stream().map(s -> "'" + s + "'").collect(Collectors.toList())) + ") " +
" AND NVL(t.IS_DELETED, 0) = 0 " +
") WHERE rn = 1";
List<EnvWqDataVo> wqDataList = microservicDynamicSQLMapper.getAllListWithResultType(wqDataSql, new HashMap<>(), EnvWqDataVo.class);
Map<String, EnvWqDataVo> wqDataMap = wqDataList.stream()
.collect(Collectors.toMap(EnvWqDataVo::getStcd, Function.identity(), (oldValue, newValue) -> newValue));
for (EnvWqAnchorPointVo anchorPointVo : wqVoList) {
EnvWqDataVo wqData = wqDataMap.get(anchorPointVo.getStcd());
if (wqData != null) {
anchorPointVo.setTm(wqData.getTm());
anchorPointVo.setWqGrd(wqData.getWqgrd());
anchorPointVo.setSfdb(wqData.getSfdb());
anchorPointVo.setWtmp(wqData.getWtmp());
anchorPointVo.setPh(wqData.getPh());
anchorPointVo.setDox(wqData.getDox());
anchorPointVo.setCodmn(wqData.getCodmn());
anchorPointVo.setCodcr(wqData.getCodcr());
anchorPointVo.setBod5(wqData.getBod5());
anchorPointVo.setNh3n(wqData.getNh3n());
anchorPointVo.setTp(wqData.getTp());
anchorPointVo.setTn(wqData.getTn());
anchorPointVo.setCu(wqData.getCu());
anchorPointVo.setZn(wqData.getZn());
anchorPointVo.setF(wqData.getF());
anchorPointVo.setSe(wqData.getSe());
anchorPointVo.setArs(wqData.getArs());
anchorPointVo.setHg(wqData.getHg());
anchorPointVo.setCd(wqData.getCd());
anchorPointVo.setCr6(wqData.getCr6());
anchorPointVo.setPb(wqData.getPb());
anchorPointVo.setCn(wqData.getCn());
anchorPointVo.setVlph(wqData.getVlph());
anchorPointVo.setOil(wqData.getOil());
anchorPointVo.setLas(wqData.getLas());
anchorPointVo.setS2(wqData.getS2());
anchorPointVo.setFcg(wqData.getFcg());
anchorPointVo.setCl(wqData.getCl());
anchorPointVo.setSo4(wqData.getSo4());
anchorPointVo.setNo3(wqData.getNo3());
anchorPointVo.setThrd(wqData.getThrd());
anchorPointVo.setCond(wqData.getCond());
anchorPointVo.setFe(wqData.getFe());
anchorPointVo.setMn(wqData.getMn());
anchorPointVo.setAl(wqData.getAl());
anchorPointVo.setChla(wqData.getChla());
anchorPointVo.setClarity(wqData.getClarity());
anchorPointVo.setTu(wqData.getTu());
anchorPointVo.setCyano(wqData.getCyano());
anchorPointVo.setTod(wqData.getTod());
}
}
}
for (EnvWqAnchorPointVo anchorPointVo : wqVoList) {
anchorPointVo.setSttpMap(anchorPointVo.getSttp());
anchorPointVo.setTitleName(anchorPointVo.getStnm());
anchorPointVo.setAnchoPointState(getAnchorPoint(anchorPointVo));
if (StrUtil.isNotBlank(sttpCode) && "WQFB".equals(sttpCode)) {
anchorPointVo.setAnchoPointState("wqfb_legend");
}
if (StrUtil.isNotBlank(fhFlag)) {
anchorPointVo.setAnchoPointState("fhwq_legend");
}
}
SiteAvoidanceUtils.calcSiteMapLev(wqVoList,
EnvWqAnchorPointVo::getStcd,
EnvWqAnchorPointVo::getLgtd,
EnvWqAnchorPointVo::getLttd,
EnvWqAnchorPointVo::getAnchoPointState,
EnvWqAnchorPointVo::setDistance);
dataSourceResult.setData(wqVoList);
dataSourceResult.setTotal(page == null ? wqVoList.size() : page.getTotal());
return dataSourceResult;
}
private String getAnchorPoint(EnvWqAnchorPointVo anchorPointVo) {
Integer dtinType = anchorPointVo.getDtinType();
Integer sfdb = anchorPointVo.getSfdb();
if (dtinType == null) {
dtinType = 2;
}
if (sfdb == null) {
sfdb = 2;
}
if (dtinType == 0) {
if (sfdb == 0) {
return "wq_station_4";
} else if (sfdb == 1) {
return "wq_station_3";
} else {
return "wq_station_8";
}
} else if (dtinType == 1) {
if (sfdb == 0) {
return "wq_station_2";
} else if (sfdb == 1) {
return "wq_station_1";
} else {
return "wq_station_7";
}
} else {
if (sfdb == 0) {
return "wq_station_6";
} else if (sfdb == 1) {
return "wq_station_5";
} else {
return "wq_station_9";
}
}
}
} }