降雨信息,水库水位

master
wany 2024-07-08 17:41:17 +08:00
parent f2987e8b3c
commit cb175aa022
16 changed files with 1504 additions and 4 deletions

View File

@ -0,0 +1,59 @@
package com.gunshi.project.xyt.controller;
import com.gunshi.core.annotation.Post;
import com.gunshi.core.result.R;
import com.gunshi.project.xyt.entity.so.DataQueryCommonSo;
import com.gunshi.project.xyt.entity.so.ReservoirWaterCommonSo;
import com.gunshi.project.xyt.entity.vo.AttResBaseVo;
import com.gunshi.project.xyt.entity.vo.AttResMonitorVo;
import com.gunshi.project.xyt.entity.vo.StRsvrVo;
import com.gunshi.project.xyt.model.StImgRReal;
import com.gunshi.project.xyt.service.ReservoirWaterService;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Description:
* Created by wanyan on 2024/2/20
*
* @author wanyan
* @version 1.0
*/
@RestController
@RequestMapping("/reservoir/water")
@Tag(name = "水库水情")
public class ReservoirWaterController {
@Autowired
private ReservoirWaterService reservoirWaterService;
@Post(path = "/rz", summary = "水库水位")
public R<StRsvrVo> rz(@RequestBody ReservoirWaterCommonSo reservoirWaterCommonSo) {
return R.ok(reservoirWaterService.rz(reservoirWaterCommonSo));
}
@Post(path = "/list", summary = "水库水情列表")
public R<List<AttResBaseVo>> list() {
return R.ok(reservoirWaterService.list());
}
@Post(path = "/real/img", summary = "水库实时图像")
public R<List<StImgRReal>> realImg(@RequestBody ReservoirWaterCommonSo reservoirWaterCommonSo) {
return R.ok(reservoirWaterService.realImg(reservoirWaterCommonSo));
}
@Post(path = "/monitor/data", summary = "监测数据")
public R<List<AttResMonitorVo>> monitorData(@RequestBody @Validated DataQueryCommonSo dataQueryCommonSo) {
return R.ok(reservoirWaterService.monitorData(dataQueryCommonSo));
}
}

View File

@ -0,0 +1,33 @@
package com.gunshi.project.xyt.entity.so;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
/**
*
* Created by wanyan on 2024/2/2.
*
* @author wanyan
* @version 1.0
*/
@Data
@Schema(description = "查询条件")
public class DataQueryCommonSo {
@Schema(description="测站编码")
@NotEmpty(message = "测站编码不可为空")
private String stcd;
@Schema(description = "开始时间")
@NotEmpty(message = "开始时间不能为空")
@Pattern(regexp = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$", message = "时间格式应为yyyy-MM-dd HH:mm:ss")
private String stm;
@Schema(description = "结束时间")
@NotEmpty(message = "结束时间不能为空")
@Pattern(regexp = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$", message = "时间格式应为yyyy-MM-dd HH:mm:ss")
private String etm;
}

View File

@ -0,0 +1,22 @@
package com.gunshi.project.xyt.entity.so;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
/**
*
* Created by wanyan on 2024/2/2.
*
* @author wanyan
* @version 1.0
*/
@Data
@Schema(description = "水库代码查询条件")
public class ReservoirWaterCommonSo {
@Schema(description="水库代码")
@NotEmpty(message = "水库代码不可为空")
private String resCode;
}

View File

@ -0,0 +1,226 @@
package com.gunshi.project.xyt.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.gunshi.core.dateformat.DateFormatString;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
*
* Created by wanyan on 2024/2/20
*
* @author wanyan
* @version 1.0
*/
@Data
public class AttResBaseVo {
/**
*
*/
@Schema(description = "测站编码")
private String stcd;
/**
*
*/
@Schema(description = "测站名称")
private String stnm;
/**
*
*/
@Schema(description = "站类(RR水库水文站 ZQ,ZP河道水文站)")
private String sttp;
/**
*
*/
@Schema(description = "来源")
private String source;
/**
*
*/
@Schema(description = "水库代码")
private String resCode;
/**
*
*/
@Schema(description = "经度")
private BigDecimal lgtd;
/**
*
*/
@Schema(description = "纬度")
private BigDecimal lttd;
/**
*
*/
@Schema(description="行政区划代码")
private String adcd;
/**
*
*/
@Schema(description="行政区划名称")
private String adnm;
/**
*
*/
@Schema(description="站址")
private String stlc;
/**
*
*/
@Schema(description = "主汛期防洪限制水位")
private BigDecimal flLowLimLev;
/**
*
*/
@Schema(description = "总库容")
private BigDecimal totCap;
/**
*
*/
@Schema(description="流域名称")
private String lyname;
/**
*
*/
@Schema(description="监测时间")
@JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8")
private Date tm;
/**
*
*/
@Schema(description="监测水位")
private BigDecimal rz;
/**
*
*/
@Schema(description="超讯限")
private BigDecimal aFsltdz;
/**
*
*/
@Schema(description="水位涨跌情况0无变化 1涨 2跌")
private Integer state;
/**
*
*/
@Schema(description="设计洪水位")
private BigDecimal desFloodLev;
/**
*
*/
@Schema(description = "校核洪水位")
private BigDecimal calFloodLev;
/**
*
*/
@Schema(description = "正常蓄水位")
private BigDecimal normWatLev;
/**
*
*/
@Schema(description = "死水位")
private BigDecimal deadLev;
/**
*
*/
@Schema(description = "坝顶高程")
private BigDecimal crestElev;
/**
*
*/
@Schema(description = "兴利库容")
private BigDecimal benResCap;
/**
*
*/
@Schema(description = "水库当前库容")
private BigDecimal nowCap;
/**
*
*/
@Schema(description="雨量时间")
@JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8")
private Date drpTm;
/**
*
*/
@Schema(description="小时雨量")
private BigDecimal h1;
/**
* 3
*/
@Schema(description="3小时雨量")
private BigDecimal h3;
/**
* 6
*/
@Schema(description="6小时雨量")
private BigDecimal h6;
/**
* 12
*/
@Schema(description="12小时雨量")
private BigDecimal h12;
/**
* 24
*/
@Schema(description="24小时雨量")
private BigDecimal h24;
/**
*
*/
@Schema(description="今日雨量")
private BigDecimal today;
@Schema(description = "是否超校核水位0否 1是")
private Integer calState;
@Schema(description = "是否超设计水位0否 1是")
private Integer desState;
@Schema(description = "是否超汛限水位0否 1是")
private Integer flState;
@Schema(description = "建站日期")
private String esstym;
}

View File

@ -0,0 +1,59 @@
package com.gunshi.project.xyt.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.gunshi.core.dateformat.DateFormatString;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
*
* Created by wanyan on 2024/2/20
*
* @author wanyan
* @version 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AttResMonitorVo {
/**
*
*/
@Schema(description = "测站编码")
private String stcd;
/**
*
*/
@Schema(description="监测时间")
@JsonFormat(pattern = DateFormatString.YYYY_MM_DD_HH_MM_SS, timezone = "GMT+8")
private Date tm;
/**
*
*/
@Schema(description="雨量")
private BigDecimal drp;
/**
*
*/
@Schema(description="监测水位")
private BigDecimal rz;
/**
*
*/
@Schema(description="库容")
private BigDecimal w;
}

View File

@ -0,0 +1,25 @@
package com.gunshi.project.xyt.entity.vo;
import com.gunshi.project.xyt.model.StRsvrR;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
*
* Created by wanyan on 2024/2/20
*
* @author wanyan
* @version 1.0
*/
@Data
public class StRsvrVo {
@Schema(description = "汛限水位")
private BigDecimal flLowLimLev;
@Schema(description = "库水位")
private List<StRsvrR> list;
}

View File

@ -0,0 +1,90 @@
package com.gunshi.project.xyt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gunshi.project.xyt.entity.so.DataQueryCommonSo;
import com.gunshi.project.xyt.entity.vo.AttResBaseVo;
import com.gunshi.project.xyt.entity.vo.AttResMonitorVo;
import com.gunshi.project.xyt.model.AttResBase;
import com.gunshi.project.xyt.model.StImgRReal;
import com.gunshi.project.xyt.model.StRsvrR;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface AttResBaseMapper extends BaseMapper<AttResBase> {
int updateBatch(List<AttResBase> list);
int updateBatchSelective(List<AttResBase> list);
int batchInsert(@Param("list") List<AttResBase> list);
int insertOrUpdate(AttResBase record);
int insertOrUpdateSelective(AttResBase record);
@Select("""
<script>
select t.stcd,t.stnm,COALESCE(t.clgtd,t.lgtd) lgtd,COALESCE(t.clttd,t.lttd) lttd,t.source,t.sttp,t.stlc,t.adcd,t.esstym,s.res_code,s.fl_low_lim_lev,
s.tot_cap,s.ben_res_cap,s.norm_wat_lev,s.crest_elev,s.des_flood_lev,s.dead_lev,s.cal_flood_lev,sad.adnm,
m.tm,m.rz,(m.rz-s.fl_low_lim_lev) as aFsltdz,sprr.tm as drpTm,sprr.h1,sprr.h3,sprr.h6,sprr.h12,sprr.h24,sprr.today,
case when s.cal_flood_lev is not null and m.rz-s.cal_flood_lev &gt; 0 then 1 else 0 end as calState,
case when s.des_flood_lev is not null and m.rz-s.des_flood_lev &gt; 0 then 1 else 0 end as desState,
case when s.fl_low_lim_lev is not null and m.rz-s.fl_low_lim_lev &gt; 0 then 1 else 0 end as flState
from public.st_stbprp_b t
left join public.att_res_base s on t.stcd = s.stcd
left join public.st_addvcd_d sad on t.adcd = sad.adcd
left join public.st_rsvr_r_real m on t.stcd = m.stcd
left join public.st_pptn_r_real sprr on t.stcd = sprr.stcd
where t.sttp = 'RR'
order by aFsltdz desc nulls last
</script>
""")
List<AttResBaseVo> queryList();
@Select("""
<script>
select t.stcd,t.tm,t.drp from public.st_pptn_r t
where t.stcd = #{obj.stcd}
and t.tm <![CDATA[>=]]> to_timestamp(#{obj.stm},'YYYY-MM-DD HH24:MI:SS')
and t.tm <![CDATA[<=]]> to_timestamp(#{obj.etm},'YYYY-MM-DD HH24:MI:SS')
order by t.tm desc
</script>
""")
List<AttResMonitorVo> drpData(@Param("obj") DataQueryCommonSo dataQueryCommonSo);
@Select("""
<script>
select t.stcd,t.tm,t.rz from public.st_rsvr_r t
where t.stcd = #{obj.stcd}
and t.tm <![CDATA[>=]]> to_timestamp(#{obj.stm},'YYYY-MM-DD HH24:MI:SS')
and t.tm <![CDATA[<=]]> to_timestamp(#{obj.etm},'YYYY-MM-DD HH24:MI:SS')
and TRIM(TO_CHAR(t.tm, 'MI:SS')) = '00:00'
order by t.tm desc
</script>
""")
List<AttResMonitorVo> rzData(@Param("obj") DataQueryCommonSo dataQueryCommonSo);
@Select("""
<script>
select t.stcd,t.tm,t.img_path from public.st_img_r_real t
where t.stcd in (select stcd from public.st_stbprp_b where res_code = #{resCode}
and sttp = 'TX')
</script>
""")
List<StImgRReal> realImg(@Param("resCode") String resCode);
@Select("""
<script>
select t.stcd,t.tm,t.rz from public.st_rsvr_r t
where t.stcd = #{stcd}
and t.tm <![CDATA[>=]]> to_timestamp(#{stm},'YYYY-MM-DD HH24:MI:SS')
and t.tm <![CDATA[<=]]> to_timestamp(#{etm},'YYYY-MM-DD HH24:MI:SS')
order by t.tm desc
</script>
""")
List<StRsvrR> queryRzList(@Param("stcd") String stcd,@Param("stm") String startTime,@Param("etm") String endTime);
}

View File

@ -21,12 +21,12 @@ public interface RescueGoodsMapper extends BaseMapper<RescueGoodsB> {
from public.rescue_goods_b t
<where>
<if test="obj.goodsName != null and obj.goodsName !=''">
and t.goods_name LIKE concat('%',#{obj.goodsName},'%')
</if>
<if test="obj.sortField != null and obj.sortField !=''">
order by ${obj.sortField} asc
t.goods_name LIKE concat('%',#{obj.goodsName},'%')
</if>
</where>
<if test="obj.sortField != null and obj.sortField !=''">
order by t.${obj.sortField} asc
</if>
</script>
""")
Page<RescueGoodsB> pageQuery(@Param("page") Page<RescueGoodsB> page,@Param("obj") RescueGoodsPageSo RescueGoodsPageSo);

View File

@ -0,0 +1,23 @@
package com.gunshi.project.xyt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gunshi.project.xyt.model.StZvarlB;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface StZvarlBMapper extends BaseMapper<StZvarlB> {
int updateBatch(List<StZvarlB> list);
int updateBatchSelective(List<StZvarlB> list);
int batchInsert(@Param("list") List<StZvarlB> list);
int insertOrUpdate(StZvarlB record);
int insertOrUpdateSelective(StZvarlB record);
}

View File

@ -0,0 +1,340 @@
package com.gunshi.project.xyt.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.gunshi.core.dateformat.DateFormatString;
import com.gunshi.project.xyt.validate.markers.Insert;
import com.gunshi.project.xyt.validate.markers.Update;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
*
*/
@Schema(description = "水库基本信息表")
@Data
@TableName(value = "public.att_res_base")
public class AttResBase implements Serializable {
/**
*
*/
@TableId(value = "res_code", type = IdType.INPUT)
@Schema(description = "水库代码")
@Size(max = 18, message = "水库代码最大长度要小于 18")
@NotBlank(message = "水库代码不能为空", groups = {Insert.class, Update.class})
private String resCode;
/**
*
*/
@TableField(value = "res_name")
@Schema(description = "水库名称")
@Size(max = 100, message = "水库名称最大长度要小于 100")
@NotBlank(message = "水库名称不能为空", groups = {Insert.class, Update.class})
private String resName;
@Schema(description = "左下角经度")
@TableField(value = "low_left_long")
private BigDecimal lowLeftLong;
@Schema(description = "左下角纬度")
@TableField(value = "low_left_lat")
private BigDecimal lowLeftLat;
@Schema(description = "右上角经度")
@TableField(value = "up_right_long")
private BigDecimal upRightLong;
@Schema(description = "右上角纬度")
@TableField(value = "up_right_lat")
private BigDecimal upRightLat;
@Schema(description = "水库所在位置")
@TableField(value = "res_loc")
private String resLoc;
@Schema(description = "水库类型 山丘水库 1 平原水库 2 地下水库 3")
@TableField(value = "res_type")
private String resType;
@Schema(description = "工程等别 1 Ⅱ 2 Ⅲ 3 Ⅳ 4 5")
@TableField(value = "eng_grad")
private String engGrad;
@Schema(description = "工程规模 大 (1)型 1 大 (2)型 2 中型 3 小 (1)型 4 小 (2)型 5 其他 9")
@TableField(value = "eng_scal")
@NotBlank(message = "工程规模不能为空", groups = {Insert.class, Update.class})
private String engScal;
@Schema(description = "坝址控制流域面积")
@TableField(value = "wat_shed_area")
private BigDecimal watShedArea;
@Schema(description = "防洪高水位")
@TableField(value = "upp_lev_flco")
private BigDecimal uppLevFlco;
@Schema(description = "正常蓄水位")
@TableField(value = "norm_wat_lev")
private BigDecimal normWatLev;
@Schema(description = "正常蓄水位相应水面面积")
@TableField(value = "norm_pool_stag_area")
private BigDecimal normPoolStagArea;
@Schema(description = "正常蓄水位相应库容")
@TableField(value = "norm_pool_stag_cap")
private BigDecimal normPoolStagCap;
@Schema(description = "主汛期防洪限制水位")
@TableField(value = "fl_low_lim_lev")
private BigDecimal flLowLimLev;
@Schema(description = "防洪限制水位库容")
@TableField(value = "fl_low_lim_lev_cap")
private BigDecimal flLowLimLevCap;
@Schema(description = "死水位")
@TableField(value = "dead_lev")
private BigDecimal deadLev;
@Schema(description = "总库容")
@TableField(value = "tot_cap")
private BigDecimal totCap;
@Schema(description = "兴利库容")
@TableField(value = "ben_res_cap")
private BigDecimal benResCap;
@Schema(description = "死库容")
@TableField(value = "dead_cap")
private BigDecimal deadCap;
@Schema(description = "调洪库容")
@TableField(value = "stor_fl_cap")
private BigDecimal storFlCap;
@Schema(description = "防洪库容")
@TableField(value = "flco_cap")
private BigDecimal flcoCap;
@Schema(description = "工程建设情况 在建 0 已建 1")
@TableField(value = "eng_stat")
private String engStat;
@Schema(description = "开工时间")
@TableField(value = "start_date")
private Date startDate;
@Schema(description = "建成时间")
@TableField(value = "comp_date")
private Date compDate;
@Schema(description = "归口管理部门 水利部门 1 电力部门 2 农业部门 3 林业部门 4 城建部门 5 航运部门 6 环保部门 7 其他部门 9")
@TableField(value = "adm_dep")
private String admDep;
@Schema(description = "备注")
@TableField(value = "note")
private String note;
@Schema(description = "记录生效时间")
@TableField(value = "eff_date")
private Date effDate;
@Schema(description = "记录失效时间")
@TableField(value = "expr_date")
private Date exprDate;
@Schema(description = "所在行政区划 行政区划名称 格式:省-市-县-镇")
@TableField(value = "adnm")
@NotBlank(message = "所属行政位置不能为空", groups = {Insert.class, Update.class})
private String adnm;
@Schema(description = "所在流域 流域名称")
@TableField(value = "bas_name")
private String basName;
@Schema(description = "所在水系 水系名称")
@TableField(value = "ws_name")
private String wsName;
@Schema(description = "所在河流名称")
@TableField(value = "rv_name")
private String rvName;
@Schema(description = "注册时间")
@TableField(value = "reg_time")
@JsonFormat(pattern = DateFormatString.YYYY_MM_DD, timezone = "GMT+8")
private Date regTime;
@Schema(description = "注册登记号")
@TableField(value = "reg_sn")
private String regSn;
@Schema(description = "管理单位 管理单位名称")
@TableField(value = "manag_name")
private String managName;
@Schema(description = "高程基准面 基面名称")
@TableField(value = "elev_dat")
private String elevDat;
@Schema(description = "水库功能 功能名称")
@TableField(value = "rsv_function")
private String rsvFunction;
@Schema(description = "溢洪道是否有闸 1有 0无")
@TableField(value = "spillway_gate")
private String spillwayGate;
@Schema(description = "校核洪水位")
@TableField(value = "cal_flood_lev")
private BigDecimal calFloodLev;
@Schema(description = "设计洪水位")
@TableField(value = "des_flood_lev")
private BigDecimal desFloodLev;
@Schema(description = "坝顶高程")
@TableField(value = "crest_elev")
private BigDecimal crestElev;
@Schema(description = "最大坝高")
@TableField(value = "max_dam_heig")
private BigDecimal maxDamHeig;
@Schema(description = "设计洪水位时最大下泄流量")
@TableField(value = "max_des_flood_flow")
private BigDecimal maxDesFloodFlow;
@Schema(description = "校核洪水位时最大下泄流量")
@TableField(value = "max_cal_flood_flow")
private BigDecimal maxCalFloodFlow;
@Schema(description = "下游河道安全流量")
@TableField(value = "ds_saft_flow")
private BigDecimal dsSaftFlow;
@Schema(description = "工程概况")
@TableField(value = "proj_overview")
private String projOverview;
@Schema(description = "关联测站")
@TableField(value = "stcd")
private String stcd;
@Schema(description = "是否病险")
@TableField(value = "is_danger")
private Integer isDanger;
@Schema(description = "病险概况")
@TableField(value = "danger_overview")
private String dangerOverview;
@Schema(description = "重点水库")
@TableField(value = "is_important")
private Integer isImportant;
@Schema(description = "经度 (°)")
@TableField(value = "lgtd")
@NotNull(message = "经度不能为空", groups = {Insert.class, Update.class})
private BigDecimal lgtd;
@Schema(description = "纬度 (°)")
@TableField(value = "lttd")
@NotNull(message = "纬度不能为空", groups = {Insert.class, Update.class})
private BigDecimal lttd;
@Schema(description = "是否有大坝安监数据")
@TableField(value = "has_wypress")
private Integer hasWypress;
@TableField(value = "adcd")
@Schema(description="行政区划代码")
private String adcd;
private static final long serialVersionUID = 1L;
public static final String COL_RES_CODE = "res_code";
public static final String COL_RES_NAME = "res_name";
public static final String COL_LOW_LEFT_LONG = "low_left_long";
public static final String COL_LOW_LEFT_LAT = "low_left_lat";
public static final String COL_UP_RIGHT_LONG = "up_right_long";
public static final String COL_UP_RIGHT_LAT = "up_right_lat";
public static final String COL_RES_LOC = "res_loc";
public static final String COL_RES_TYPE = "res_type";
public static final String COL_ENG_GRAD = "eng_grad";
public static final String COL_ENG_SCAL = "eng_scal";
public static final String COL_WAT_SHED_AREA = "wat_shed_area";
public static final String COL_UPP_LEV_FLCO = "upp_lev_flco";
public static final String COL_NORM_WAT_LEV = "norm_wat_lev";
public static final String COL_NORM_POOL_STAG_AREA = "norm_pool_stag_area";
public static final String COL_NORM_POOL_STAG_CAP = "norm_pool_stag_cap";
public static final String COL_FL_LOW_LIM_LEV = "fl_low_lim_lev";
public static final String COL_FL_LOW_LIM_LEV_CAP = "fl_low_lim_lev_cap";
public static final String COL_DEAD_LEV = "dead_lev";
public static final String COL_TOT_CAP = "tot_cap";
public static final String COL_BEN_RES_CAP = "ben_res_cap";
public static final String COL_DEAD_CAP = "dead_cap";
public static final String COL_STOR_FL_CAP = "stor_fl_cap";
public static final String COL_FLCO_CAP = "flco_cap";
public static final String COL_ENG_STAT = "eng_stat";
public static final String COL_START_DATE = "start_date";
public static final String COL_COMP_DATE = "comp_date";
public static final String COL_ADM_DEP = "adm_dep";
public static final String COL_NOTE = "note";
public static final String COL_EFF_DATE = "eff_date";
public static final String COL_EXPR_DATE = "expr_date";
public static final String COL_IS_DANGER = "is_danger";
public static final String COL_DANGER_OVERVIEW = "danger_overview";
public static final String COL_STCD = "stcd";
public static final String COL_IS_IMPORTANT = "is_important";
public static final String COL_LGTD = "lgtd";
public static final String COL_LTTD = "lttd";
}

View File

@ -0,0 +1,67 @@
package com.gunshi.project.xyt.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Schema
@Data
@TableName(value = "st_img_r_real")
public class StImgRReal implements Serializable {
@TableField(value = "stcd")
@MppMultiId
@Schema(description="")
@Size(max = 20,message = "最大长度要小于 20")
@NotBlank(message = "不能为空")
private String stcd;
@TableField(value = "tm")
@MppMultiId
@Schema(description="")
@NotNull(message = "不能为null")
private Date tm;
@TableField(value = "chtm")
@Schema(description="")
@NotNull(message = "不能为null")
private Date chtm;
@TableField(value = "img_path")
@Schema(description="")
@Size(max = 256,message = "最大长度要小于 256")
@NotBlank(message = "不能为空")
private String imgPath;
@TableField(value = "chid")
@Schema(description="")
@Size(max = 10,message = "最大长度要小于 10")
@NotBlank(message = "不能为空")
private String chid;
@TableField(value = "\"source\"")
@Schema(description="")
@Size(max = 50,message = "最大长度要小于 50")
private String source;
private static final long serialVersionUID = 1L;
public static final String COL_STCD = "stcd";
public static final String COL_TM = "tm";
public static final String COL_CHTM = "chtm";
public static final String COL_IMG_PATH = "img_path";
public static final String COL_CHID = "chid";
public static final String COL_SOURCE = "source";
}

View File

@ -0,0 +1,119 @@
package com.gunshi.project.xyt.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Schema
@Data
@TableName(value = "st_rsvr_r")
public class StRsvrR implements Serializable {
@TableField(value = "stcd")
@MppMultiId
@Schema(description="")
@Size(max = 20,message = "最大长度要小于 20")
@NotBlank(message = "不能为空")
private String stcd;
@TableField(value = "tm")
@MppMultiId
@Schema(description="")
@NotNull(message = "不能为null")
private Date tm;
@TableField(value = "rz")
@Schema(description="")
private BigDecimal rz;
@TableField(value = "inq")
@Schema(description="")
private BigDecimal inq;
@TableField(value = "w")
@Schema(description="")
private BigDecimal w;
@TableField(value = "blrz")
@Schema(description="")
private BigDecimal blrz;
@TableField(value = "otq")
@Schema(description="")
private BigDecimal otq;
@TableField(value = "rwchrcd")
@Schema(description="")
@Size(max = 4,message = "最大长度要小于 4")
private String rwchrcd;
@TableField(value = "rwptn")
@Schema(description="")
@Size(max = 4,message = "最大长度要小于 4")
private String rwptn;
@TableField(value = "inqdr")
@Schema(description="")
private BigDecimal inqdr;
@TableField(value = "msqmt")
@Schema(description="")
@Size(max = 4,message = "最大长度要小于 4")
private String msqmt;
@TableField(value = "chtm")
@Schema(description="")
private Date chtm;
@TableField(value = "sendtm")
@Schema(description="")
private Date sendtm;
@TableField(value = "receivetm")
@Schema(description="")
private Date receivetm;
@TableField(value = "source_int")
@Schema(description="")
private Short sourceInt;
private static final long serialVersionUID = 1L;
public static final String COL_STCD = "stcd";
public static final String COL_TM = "tm";
public static final String COL_RZ = "rz";
public static final String COL_INQ = "inq";
public static final String COL_W = "w";
public static final String COL_BLRZ = "blrz";
public static final String COL_OTQ = "otq";
public static final String COL_RWCHRCD = "rwchrcd";
public static final String COL_RWPTN = "rwptn";
public static final String COL_INQDR = "inqdr";
public static final String COL_MSQMT = "msqmt";
public static final String COL_CHTM = "chtm";
public static final String COL_SENDTM = "sendtm";
public static final String COL_RECEIVETM = "receivetm";
public static final String COL_SOURCE_INT = "source_int";
}

View File

@ -0,0 +1,96 @@
package com.gunshi.project.xyt.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* ( )线
*/
@Schema(description="库( 湖)容曲线表")
@Data
@TableName(value = "public.st_zvarl_b")
public class StZvarlB implements Serializable {
/**
*
*/
@MppMultiId
@TableField(value = "stcd")
@Schema(description="测站编码")
@Size(max = 8,message = "测站编码最大长度要小于 8")
@NotBlank(message = "测站编码不能为空")
private String stcd;
/**
*
*/
@MppMultiId
@TableField(value = "mstm")
@Schema(description="施测时间")
@NotNull(message = "施测时间不能为null")
private Date mstm;
/**
*
*/
@MppMultiId
@TableField(value = "ptno")
@Schema(description="点序号")
@NotNull(message = "点序号不能为null")
private Integer ptno;
/**
*
*/
@TableField(value = "rz")
@Schema(description="库水位")
@NotNull(message = "库水位不能为null")
private BigDecimal rz;
/**
*
*/
@TableField(value = "w")
@Schema(description="蓄水量")
@NotNull(message = "蓄水量不能为null")
private BigDecimal w;
/**
*
*/
@TableField(value = "wsfa")
@Schema(description="水面面积")
private Integer wsfa;
/**
*
*/
@TableField(value = "moditime")
@Schema(description="时间戳")
private Date moditime;
private static final long serialVersionUID = 1L;
public static final String COL_STCD = "stcd";
public static final String COL_MSTM = "mstm";
public static final String COL_PTNO = "ptno";
public static final String COL_RZ = "rz";
public static final String COL_W = "w";
public static final String COL_WSFA = "wsfa";
public static final String COL_MODITIME = "moditime";
}

View File

@ -0,0 +1,164 @@
package com.gunshi.project.xyt.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gunshi.project.xyt.entity.so.DataQueryCommonSo;
import com.gunshi.project.xyt.entity.so.ReservoirWaterCommonSo;
import com.gunshi.project.xyt.entity.vo.AttResBaseVo;
import com.gunshi.project.xyt.entity.vo.AttResMonitorVo;
import com.gunshi.project.xyt.entity.vo.StRsvrVo;
import com.gunshi.project.xyt.mapper.AttResBaseMapper;
import com.gunshi.project.xyt.mapper.StZvarlBMapper;
import com.gunshi.project.xyt.model.AttResBase;
import com.gunshi.project.xyt.model.StImgRReal;
import com.gunshi.project.xyt.model.StZvarlB;
import com.gunshi.project.xyt.util.DataHandleUtil;
import com.gunshi.project.xyt.util.DateUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* Description:
* Created by wanyan on 2024/7/8
*
* @author wanyan
* @version 1.0
*/
@Service
@Slf4j
public class ReservoirWaterService {
@Resource
private AttResBaseMapper attResBaseMapper;
@Resource
private StZvarlBMapper stZvarlBMapper;
public List<AttResBaseVo> list() {
List<AttResBaseVo> attResBaseVos = attResBaseMapper.queryList();
if(CollectionUtils.isEmpty(attResBaseVos)){
return attResBaseVos;
}
attResBaseVos.stream().map(o->{
if(o.getCalState() == 1){
o.setDesState(0);
o.setFlState(0);
}else if(o.getCalState() == 0 && o.getDesState() ==1){
o.setFlState(0);
}
return o;
}).collect(Collectors.toList());
//查询所有测站的库容曲线
List<StZvarlB> zvarlList = queryZval(attResBaseVos.stream().map(AttResBaseVo::getStcd).collect(Collectors.toList()));
Map<String, List<StZvarlB>> zvalMap = zvarlList.stream().collect(Collectors.groupingBy(StZvarlB::getStcd));
for(AttResBaseVo vo : attResBaseVos){
String stcd = vo.getStcd();
BigDecimal rz = vo.getRz();
//计算当前库容
List<StZvarlB> zvarlBS = zvalMap.get(stcd);
if(rz != null && CollectionUtils.isNotEmpty(zvarlBS)){
BigDecimal maxRz = zvarlBS.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz();
BigDecimal minRz = zvarlBS.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz();
if(rz.compareTo(minRz) < 0 || rz.compareTo(maxRz) > 0){
continue;
}
Map<BigDecimal, BigDecimal> stZvalMap = zvarlBS.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
List<BigDecimal> list = zvarlBS.stream().map(StZvarlB::getRz).collect(Collectors.toList());
vo.setNowCap(DataHandleUtil.calcData(rz,stZvalMap,list));
}
}
return attResBaseVos;
}
private List<StZvarlB> queryZval(List<String> stcdList) {
LambdaQueryWrapper<StZvarlB> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.in(StZvarlB::getStcd, stcdList);
return stZvarlBMapper.selectList(queryWrapper);
}
public List<StImgRReal> realImg(ReservoirWaterCommonSo reservoirWaterCommonSo) {
return attResBaseMapper.realImg(reservoirWaterCommonSo.getResCode());
}
public List<StZvarlB> zvarl(String stcd) {
LambdaQueryWrapper<StZvarlB> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(StZvarlB::getStcd, stcd)
.orderByAsc(StZvarlB::getPtno);
return stZvarlBMapper.selectList(queryWrapper);
}
public List<AttResMonitorVo> monitorData(DataQueryCommonSo dataQueryCommonSo) {
String stcd = dataQueryCommonSo.getStcd();
//雨量数据
List<AttResMonitorVo> drpData = attResBaseMapper.drpData(dataQueryCommonSo);
//水位数据
List<AttResMonitorVo> rzData = attResBaseMapper.rzData(dataQueryCommonSo);
//获取库容曲线关系,算出库容
List<StZvarlB> zvarl = zvarl(stcd);
if(CollectionUtils.isNotEmpty(zvarl)){
calcTqData(rzData,zvarl);
}
//根据监测时间合并雨量和水位数据
return bindData(stcd,drpData,rzData);
}
private void calcTqData(List<AttResMonitorVo> rzData, List<StZvarlB> zqrl) {
BigDecimal maxRz = zqrl.stream().max(Comparator.comparing(StZvarlB::getRz)).get().getRz();
BigDecimal minRz = zqrl.stream().min(Comparator.comparing(StZvarlB::getRz)).get().getRz();
Map<BigDecimal, BigDecimal> map = zqrl.stream().collect(Collectors.toMap(StZvarlB::getRz, StZvarlB::getW));
/**
* 线
* 1.线
* 2.109-114-5
* 1/2 = x/1 x=0.5 =4+0.5=4.5
*/
List<BigDecimal> list = zqrl.stream().map(StZvarlB::getRz).collect(Collectors.toList());
for (AttResMonitorVo vo : rzData) {
BigDecimal rz = vo.getRz();
if (rz.compareTo(minRz) < 0 || rz.compareTo(maxRz) > 0) {
continue;
}
vo.setW(DataHandleUtil.calcData(rz, map, list));
}
}
private List<AttResMonitorVo> bindData(String stcd,List<AttResMonitorVo> drpData, List<AttResMonitorVo> rzData) {
HashSet<Date> strings = new HashSet<>();
drpData.stream().forEach(v1 -> strings.add(v1.getTm()));
rzData.stream().forEach(v1 -> strings.add(v1.getTm()));
ArrayList<AttResMonitorVo> result = new ArrayList<>();
strings.stream().forEach(v1 -> result.add(AttResMonitorVo.builder().stcd(stcd).tm(v1).build()));
List<AttResMonitorVo> list = result.stream().map(v1 -> {
drpData.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> {
v1.setDrp(v2.getDrp());
});
rzData.stream().filter(v2 -> v1.getTm().equals(v2.getTm())).forEach(v2 -> {
v1.setRz(v2.getRz());
v1.setW(v2.getW());
});
return v1;
}).collect(Collectors.toList());
return list.stream().sorted(Comparator.comparing(AttResMonitorVo::getTm).reversed()).collect(Collectors.toList());
}
public StRsvrVo rz(ReservoirWaterCommonSo reservoirWaterCommonSo) {
StRsvrVo vo = new StRsvrVo();
String resCode = reservoirWaterCommonSo.getResCode();
AttResBase attResBase = attResBaseMapper.selectById(resCode);
vo.setFlLowLimLev(attResBase.getFlLowLimLev());
//默认查询近一周水位
String endTime = DateUtil.convertDateToString(new Date());
String startTime = DateUtil.getMinusTime(endTime, 7 * 24);
vo.setList(attResBaseMapper.queryRzList(attResBase.getStcd(),startTime,endTime));
return vo;
}
}

View File

@ -0,0 +1,37 @@
package com.gunshi.project.xyt.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Map;
public class DataHandleUtil {
public static BigDecimal calcData(BigDecimal rz, Map<BigDecimal, BigDecimal> map,List<BigDecimal> list) {
//库容曲线中最近的一组水位
BigDecimal lowerRz = new BigDecimal(0);
BigDecimal upperRz = new BigDecimal(0);
//库容曲线中最近的一组水位对应的库容
BigDecimal lowerW = new BigDecimal(0);
BigDecimal upperW = new BigDecimal(0);
for(int i=0;i<list.size();i++){
if (rz.compareTo(list.get(i)) >= 0 && rz.compareTo(list.get(i+1)) <= 0) {
lowerRz = list.get(i);
upperRz = list.get(i+1);
lowerW = map.get(lowerRz);
upperW = map.get(upperRz);
break;
}
}
BigDecimal diff = rz.subtract(lowerRz);
return lowerW.add(diff.multiply(upperW.subtract(lowerW)).divide(upperRz.subtract(lowerRz),2,RoundingMode.UP));
}
}

View File

@ -0,0 +1,140 @@
package com.gunshi.project.xyt.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Optional;
/**
* Description:
* Created by wanyan on 2024/2/28
*
* @author wanyan
* @version 1.0
*/
public class DateUtil {
private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd日HH时");
private static DateTimeFormatter ym = DateTimeFormatter.ofPattern("YYYYMM");
public static Date convertStringToDate(String str){
try {
return df.parse(str);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
public static String convertDateToString(Date date){
return sdf.format(date);
}
public static String convertDateToMDSString(Date date){
return df.format(date);
}
/**
*
* @param year
* @return
*/
public static LocalDateTime beginningOfYear(Integer year){
return LocalDateTime.of(year, 1, 1, 0, 0, 0, 0);
}
/**
*
* @param year
* @return
*/
public static LocalDateTime endOfYear(Integer year){
return beginningOfYear(year).plusYears(1).minusSeconds(1);
}
/**
* DateLocalDateTime.
*
* @param date Date
* @return LocalDateTime
*/
public static Optional<LocalDateTime> convertFromDate(Date date) {
if (date == null) {
throw new IllegalArgumentException("date is null");
}
Instant instant = date.toInstant();
return Optional.of(instant.atZone(ZoneId.systemDefault()).toLocalDateTime());
}
public static String getIntegerTime(){
LocalDateTime now = LocalDateTime.now();
LocalDateTime roundedTime = now.withMinute(0).withSecond(0).withNano(0);
return roundedTime.format(formatter);
}
public static String getMinusIntegerTime(){
LocalDateTime yesterday = LocalDateTime.now().minusDays(1);
LocalDateTime roundedTime = yesterday.withMinute(0).withSecond(0).withNano(0);
return roundedTime.format(formatter);
}
public static String convertDH(String str){
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
return dateTime.format(dtf);
}
public static String getMinusTime(String str,long hour){
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
LocalDateTime minusTime = dateTime.minusHours(hour);
return minusTime.format(formatter);
}
public static String getPlusTime(String str,long hour){
LocalDateTime dateTime = LocalDateTime.parse(str, formatter);
LocalDateTime minusTime = dateTime.plusHours(hour);
return minusTime.format(formatter);
}
public static String getTodayEight(){
LocalDateTime now = LocalDateTime.now();
LocalDateTime roundedTime = now.withHour(8).withMinute(0).withSecond(0).withNano(0);
return roundedTime.format(formatter);
}
public static Integer getMD(int year, int month) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
return 31;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else if (month == 2) {
//判断是否是闰年
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
return 29;
} else {
return 28;
}
}
return 31;
}
public static String getYM() {
LocalDateTime now = LocalDateTime.now();
return now.format(ym);
}
}