shenyijian
2024-06-13 815f941939ae89be55906eab57ce2d776f88426d
湖北水库:预警列表、预警数量角标
6 files modified
13 files added
1232 ■■■■■ changed files
skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/service/BladeUserDetailsServiceImpl.java 36 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/constant/LauncherConstant.java 2 ●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/entity/FsRAtmtnFrcstInf.java 54 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstDtDeatilVO.java 18 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstDtVO.java 21 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstInfVO.java 58 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/StStbprpBVO.java 38 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/WarningColorVO.java 21 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/WarningTypeVO.java 39 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml 4 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/DTO/WaterQueryDTO.java 25 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/controller/FsRAtmtnFrcstController.java 93 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/mapper/FsRAtmtnFrcstInfMapper.java 26 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/mapper/FsRAtmtnFrcstInfMapper.xml 133 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/service/FsRAtmtnFrcstService.java 24 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/service/impl/FsRAtmtnFrcstServiceImpl.java 610 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-prod.yml 12 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-test.yml 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-auth/src/main/java/cn/gistack/auth/service/BladeUserDetailsServiceImpl.java
@@ -205,24 +205,24 @@
            User loginUserInfo = userInfo.getUser();
//            获取解密后的Base64字符串
            R<ResultDTO> encryptRes = pwdClient.getDecrypt(loginUserInfo.getSm4iv(), loginUserInfo.getKeyindexs(),loginUserInfo.getEncdata());
            if (encryptRes.getCode() != 200){
                throw new UserDeniedAuthorizationException("获取密钥失败");
            }
            //解码Base64
            String JSONstr = Base64Utils.getBase64Decode(encryptRes.getData().getData());
            pwdClient.verify(loginUserInfo.getMaced(),loginUserInfo.getSm4iv(),loginUserInfo.getKeyindexs(),JSONstr,loginUserInfo.getId().toString(),"blade_user");
            UserSUPO userSUPO = JSONObject.parseObject(JSONstr, UserSUPO.class);
            //若登录用户的电话、角色、部门与原加密数据不符,登录失败
            if (!(loginUserInfo.getPhone().equals(userSUPO.getPhone())  && loginUserInfo.getRoleId().equals(userSUPO.getRoleId())  && loginUserInfo.getDeptId().equals(userSUPO.getDeptId())) ){
                throw new UserDeniedAuthorizationException("用户信息异常,请联系管理员");
            }
////            获取解密后的Base64字符串
//            R<ResultDTO> encryptRes = pwdClient.getDecrypt(loginUserInfo.getSm4iv(), loginUserInfo.getKeyindexs(),loginUserInfo.getEncdata());
//
//            if (encryptRes.getCode() != 200){
//                throw new UserDeniedAuthorizationException("获取密钥失败");
//            }
//
//            //解码Base64
//            String JSONstr = Base64Utils.getBase64Decode(encryptRes.getData().getData());
//
//            pwdClient.verify(loginUserInfo.getMaced(),loginUserInfo.getSm4iv(),loginUserInfo.getKeyindexs(),JSONstr,loginUserInfo.getId().toString(),"blade_user");
//
//            UserSUPO userSUPO = JSONObject.parseObject(JSONstr, UserSUPO.class);
//
//            //若登录用户的电话、角色、部门与原加密数据不符,登录失败
//            if (!(loginUserInfo.getPhone().equals(userSUPO.getPhone())  && loginUserInfo.getRoleId().equals(userSUPO.getRoleId())  && loginUserInfo.getDeptId().equals(userSUPO.getDeptId())) ){
//                throw new UserDeniedAuthorizationException("用户信息异常,请联系管理员");
//            }
            return new BladeUserDetails(user.getId(),
                user.getTenantId(), StringPool.EMPTY, user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/constant/LauncherConstant.java
@@ -50,7 +50,7 @@
    String NACOS_USERNAME = "nacos";
    String NACOS_PASSWORD = "nacos";
    String NACOS_PASSWORD = "1qaz!QAZ";
    /**
     * nacos test 地址
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/entity/FsRAtmtnFrcstInf.java
New file
@@ -0,0 +1,54 @@
package cn.gistack.alerts.alarmRule.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
 * 预报发布信息表
 */
@Data
@TableName("FS_R_ATMTN_FRCST_INF")
public class FsRAtmtnFrcstInf  implements Serializable {
    /**
     *预报id主键
     */
    private String frcstCd;
    /**
     *预报站点
     */
    private String STCD;
    /**
     *预报员id
     */
    private String frcstUsrId;
    /**
     *预报员姓名
     */
    private String frcstUsrNm;
    /**
     *发布单位
     */
    private String pblshUnt;
    /**
     *类型:1:日常化预报;2:洪水预报
     */
    private Integer pblshTyp;
    /**
     *依据条件
     */
    private String cndtn;
    /**
     *预报时间
     */
    private String frcstTm;
    /**
     *发布时间
     */
    private String pblshTm;
    /**
     *发布单位id
     */
    private String pblshId;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstDtDeatilVO.java
New file
@@ -0,0 +1,18 @@
package cn.gistack.alerts.alarmRule.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.checkerframework.checker.units.qual.A;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FsRAtmtnFrcstDtDeatilVO implements Serializable {
    private String type;
    private String value;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstDtVO.java
New file
@@ -0,0 +1,21 @@
package cn.gistack.alerts.alarmRule.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FsRAtmtnFrcstDtVO implements Serializable {
    private String FRCST_CD;
    private String TM;
    private Float TZ;
    private Float TQ;
    private List<FsRAtmtnFrcstDtDeatilVO> list;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/FsRAtmtnFrcstInfVO.java
New file
@@ -0,0 +1,58 @@
package cn.gistack.alerts.alarmRule.vo;
import cn.gistack.alerts.alarmRule.entity.FsRAtmtnFrcstInf;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FsRAtmtnFrcstInfVO extends FsRAtmtnFrcstInf {
    /**
     * 流量
     */
    private List<FsRAtmtnFrcstDtVO> frcstDtVOS;
    /**
     * 站点名
     */
    private String STNM;
    /**
     * 河流
     */
    private String RVNM;
    /**
     * 警戒水位
     */
    private String WRZ;
    /**
     * 保证水位
     */
    private String GRZ;
    /**
     * 讯限水位
     */
    private String FSLTDZ;
    /**
     * 设防水位
     */
    private String SFLZ;
    private String FZ;//洪峰水位
    private String FZTM;//发生时间
    private String FQ;//洪峰流量
    private String FQTM;//峰现时间
    private String RUNOFF;    //洪量
    private String CTM;//预报依据截止时间
    private String RF;//是否滚动预报
    private String FRCST_CD;
    private String TM;
    private Float TZ;
    private Float TQ;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/StStbprpBVO.java
New file
@@ -0,0 +1,38 @@
package cn.gistack.alerts.alarmRule.vo;
import lombok.Data;
/**
 * 站点水文信息
 */
@Data
public class StStbprpBVO {
    /**
     * 站点编码
     */
    private String    STCD;
    /**
     * 站点名
     */
    private String    STNM;
    /**
     * 河流
     */
    private String    RVNM;
    /**
     * 警戒水位
     */
    private String    WRZ;
    /**
     *保证水位
     */
    private String    GRZ;
    /**
     * 讯限水位
     */
    private String    FSLTDZ;
    /**
     * 设防水位
     */
    private String    SFLZ;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/WarningColorVO.java
New file
@@ -0,0 +1,21 @@
package cn.gistack.alerts.alarmRule.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WarningColorVO {
    /**
     * 颜色
     */
    private String colorName;
    /**
     * 条数
     */
    private Integer colorWarningNum;
}
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/alarmRule/vo/WarningTypeVO.java
New file
@@ -0,0 +1,39 @@
package cn.gistack.alerts.alarmRule.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WarningTypeVO {
    /**
     * 预警类型
     */
    private String warningType;
    /**
     * 预警条数
     */
    private String warningNum;
    /**
     * 预警种类数量
     */
    private String typeNum;
    /**
     * 颜色
     */
    private String color;
    /**
     * 子类型
     */
    List<WarningTypeVO> childList;
    /**
     * 预警颜色
     */
    private List<WarningColorVO> colorVOList;
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
@@ -72,12 +72,12 @@
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>23.2.0.0</version>
            <version>19.23.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.nls</groupId>
            <artifactId>orai18n</artifactId>
            <version>23.2.0.0</version>
            <version>19.23.0.0</version>
        </dependency>
    </dependencies>
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/DTO/WaterQueryDTO.java
New file
@@ -0,0 +1,25 @@
package cn.gistack.alerts.alarmRule.DTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.checkerframework.checker.units.qual.A;
/**
 * 水量预警查询实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WaterQueryDTO {
    private String tsEdTm;
    private String flag;
    private String wiustTp;
    private String tsBgTm;
    private String tradTp;
    private String wiuNm;
    private String adlCd;
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/controller/FsRAtmtnFrcstController.java
New file
@@ -0,0 +1,93 @@
package cn.gistack.alerts.alarmRule.controller;
import cn.gistack.alerts.alarmRule.service.FsRAtmtnFrcstService;
import cn.gistack.alerts.alarmRule.vo.AlarmRecordVO;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 预警信息控制层
 */
@RestController
@RequestMapping("/fsratmtnfrcst")
public class FsRAtmtnFrcstController {
    @Autowired
    private FsRAtmtnFrcstService fsRAtmtnFrcstService;
    /**
     * 预告列表
     * @return
     */
    @ApiOperation(value="告警记录-自定义分页列表查询", notes="告警记录-自定义分页列表查询")
    @GetMapping(value = "/get_atmtnInfo")
    public R getAtmtnInfo(String STCM,Integer type) {
        return R.data(fsRAtmtnFrcstService.getAtmtnInfo(STCM,type));
    }
    /**
     * 预告统计
     * @return
     */
    @ApiOperation(value="告警记录-预告统计", notes="告警记录-预告统计")
    @GetMapping(value = "/count_atmtnInfo")
    public R countAtmtnInfo() {
        return R.data(fsRAtmtnFrcstService.countAtmtnInfo());
    }
    /**
     * 预警数量统计-所有类型统计
     * @return
     */
    @ApiOperation(value="预警数量统计-所有类型统计", notes="预警数量统计-所有类型统计")
    @GetMapping(value = "/warning_statistics")
    public R warningStatistics( ) {
        return R.data(fsRAtmtnFrcstService.warningStatistics());
    }
    /**
     * 预警数量统计-水库统计
     * @return
     */
    @ApiOperation(value="预警数量统计", notes="预警数量统计")
    @GetMapping(value = "/warning_statistics_sk")
    public R warningStatisticsSK( ) {
        return R.data(fsRAtmtnFrcstService.warningStatisticsSK());
    }
    /**
     * 预警数量统计-水文统计
     * @return
     */
    @ApiOperation(value="预警数量统计", notes="预警数量统计")
    @GetMapping(value = "/warning_statistics_sw")
    public R warningStatisticsSW( ) {
        return R.data(fsRAtmtnFrcstService.warningStatisticsSW());
    }
    /**
     * 预警数量统计-山洪统计
     * @return
     */
    @ApiOperation(value="预警数量统计", notes="预警数量统计")
    @GetMapping(value = "/warning_statistics_sh")
    public R warningStatisticsSH( ) {
        return R.data(fsRAtmtnFrcstService.warningStatisticsSH());
    }
    /**
     * 预警数量统计-水资源统计
     * @return
     */
    @ApiOperation(value="预警数量统计", notes="预警数量统计")
    @GetMapping(value = "/warning_statistics_szy")
    public R warningStatisticsSZY( ) {
        return R.data(fsRAtmtnFrcstService.warningStatisticsSZY());
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/mapper/FsRAtmtnFrcstInfMapper.java
New file
@@ -0,0 +1,26 @@
package cn.gistack.alerts.alarmRule.mapper;
import cn.gistack.alerts.alarmRule.entity.AlarmRecordDetail;
import cn.gistack.alerts.alarmRule.vo.AlarmRecordVO;
import cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstInfVO;
import cn.gistack.alerts.alarmRule.vo.StStbprpBVO;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface FsRAtmtnFrcstInfMapper extends BaseMapper<AlarmRecordDetail> {
    @DS("swyj")
    List<FsRAtmtnFrcstInfVO> getAtmtnInfo(@Param("type") Integer type,@Param("stcds") List<String> stcds);
    @DS("swyj")
    List<FsRAtmtnFrcstInfVO> getAtmtnInfo1(@Param("type") Integer type,@Param("stcds") List<String> stcds);
    @DS("zdsw")
    List<StStbprpBVO> getStationInfo(@Param("stcds") List<String> stcDs);
    @DS("zdsw")
    List<String> getStcdS(@Param("STCM") String stcm);
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/mapper/FsRAtmtnFrcstInfMapper.xml
New file
@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.gistack.alerts.alarmRule.mapper.FsRAtmtnFrcstInfMapper">
    <select id="getAtmtnInfo" resultType="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstInfVO">
        SELECT
            inf.FRCST_CD as frcstCd,
            inf.STCD,
            inf.FRCST_TM as frcstTm,
            inf.PBLSH_TM as pblshTm,
            inf.CNDTN ,
            inf.FRCST_USR_NM as frcstUsrNm,
            inf.PBLSH_UNT as pblshUnt,
            inf.PBLSH_TYP as pblshTyp,
            dt.TM,
            NVL( dt.Z, 0 ) AS TZ,
            NVL( dt.Q, 0 ) AS TQ
        FROM
            FRCST_SYS.FS_R_ATMTN_FRCST_DT dt
                LEFT JOIN FRCST_SYS.FS_R_ATMTN_FRCST_INF inf  ON dt.FRCST_CD = inf.FRCST_CD
        WHERE
            dt.TM BETWEEN SYSDATE
                AND SYSDATE + 3
        <if test="stcds != null and stcds.size()>0">
            AND inf.STCD in
            <foreach collection="stcds" index="index" item="item" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        ORDER BY
            dt.TM DESC
    </select>
    <select id="getAtmtnInfo1" resultType="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstInfVO">
        SELECT
            inf.FRCST_CD,
            inf.STCD,
            inf.FRCST_TM,
            inf.PBLSH_TM,
            inf.CNDTN,
            inf.FRCST_USR_NM,
            inf.PBLSH_UNT,
            inf.PBLSH_TYP,
            dt.TM,
            NVL( dt.Z, 0 ) AS TZ,
            NVL( dt.Q, 0 ) AS TQ,
            fl.FZ,
            fl.FZTM,
            fl.FQ,
            fl.FQTM,
            fl.RUNOFF,
            fl.CTM,
            fl.RF
        FROM
            FRCST_SYS.FS_R_ATMTN_FRCST_FLOODDT dt
                LEFT JOIN FRCST_SYS.FS_R_ATMTN_FRCST_INF inf  ON dt.FRCST_CD = inf.FRCST_CD
                LEFT JOIN FRCST_SYS.FS_R_ATMTN_FRCST_FLOOD fl ON dt.FRCST_CD = fl.FRCST_CD
        WHERE
            dt.TM BETWEEN SYSDATE
                AND SYSDATE + 3
          <if test="stcds != null and stcds.size()>0">
              AND inf.STCD in
              <foreach collection="stcds" index="index" item="item" open="(" separator="," close=")">
                  #{item}
              </foreach>
          </if>
        ORDER BY
            dt.TM DESC
    </select>
    <resultMap id="resultMap" type="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstInfVO">
        <id column="FRCST_CD" property="FRCST_CD"/>
        <result column="FRCST_CD" property="FRCST_CD"/>
        <result column="STCD" property="STCD"/>
        <result column="FRCST_USR_ID" property="FRCST_USR_ID"/>
        <result column="FRCST_USR_NM" property="FRCST_USR_NM"/>
        <result column="PBLSH_UNT" property="PBLSH_UNT"/>
        <result column="PBLSH_TYP" property="PBLSH_TYP"/>
        <result column="CNDTN" property="CNDTN"/>
        <result column="FRCST_TM" property="FRCST_TM"/>
        <result column="PBLSH_TM" property="PBLSH_TM"/>
        <result column="PBLSH_ID" property="PBLSH_ID"/>
        <result column="FZ" property="FZ"/>
        <result column="FZTM" property="FZTM"/>
        <result column="FQ" property="FQ"/>
        <result column="FQTM" property="FQTM"/>
        <result column="RUNOFF" property="RUNOFF"/>
        <result column="CTM" property="CTM"/>
        <result column="RF" property="RF"/>
<!--        <collection property="frcstDtVOS" ofType="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstDtVO" >-->
<!--            <id property="FRCST_CD" column="FRCST_CD"/>-->
<!--            <result column="TM" property="TM"/>-->
<!--            <result column="TZ" property="TZ"/>-->
<!--            <result column="TQ" property="TQ"/>-->
<!--        </collection>-->
        <collection property="frcstDtVOS" ofType="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstDtVO" column="FRCST_CD"  select="getFsRAtmtnFrcstDtVOs"/>
    </resultMap>
    <select id="getFsRAtmtnFrcstDtVOs" resultType="cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstDtVO">
        select dt.TM, NVL(dt.Z,0) AS TZ, NVL(dt.Q,0) AS TQ from FRCST_SYS.FS_R_ATMTN_FRCST_FLOODDT dt where dt.FRCST_CD = #{FRCST_CD}
    </select>
    <select id="getStationInfo" resultType="cn.gistack.alerts.alarmRule.vo.StStbprpBVO">
        SELECT
            b.STCD,
            b.STNM,
            b.RVNM,
            NVL( rb.WRZ, 0 ) AS WRZ,
            NVL( rb.GRZ, 0 ) AS GRZ,
            NVL( srb.FSLTDZ, 0 )AS FSLTDZ ,
            NVL( chb.DSFLZ, 0 ) AS DSFLZ
        FROM
            RWDBSYSDBA.ST_STBPRP_B b
                LEFT JOIN RWDBSYSDBA.ST_RVFCCH_B rb ON b.STCD = rb.STCD
                LEFT JOIN RWDBSYSDBA.ST_RSVRFSR_B srb ON b.STCD = srb.STCD
                LEFT JOIN RWDBSYSDBA.ST_RSVRFCCH_B chb ON b.STCD = chb.STCD
            where 1=1
              <if test="stcds != null and stcds.size()>0">
                  AND b.STCD in
                  <foreach collection="stcds" index="index" item="item" open="(" separator="," close=")">
                      #{item}
                  </foreach>
              </if>
    </select>
    <select id="getStcdS" resultType="java.lang.String">
        SELECT
            b.STCD
        FROM
            RWDBSYSDBA.ST_STBPRP_B b where 1=1
            <if test="STCM != null and STCM != ''">
               and b.STNM LIKE '%${STCM}%' ;
            </if>
    </select>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/service/FsRAtmtnFrcstService.java
New file
@@ -0,0 +1,24 @@
package cn.gistack.alerts.alarmRule.service;
import cn.gistack.alerts.alarmRule.vo.AlarmRecordVO;
import cn.gistack.alerts.alarmRule.vo.FsRAtmtnFrcstInfVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
public interface FsRAtmtnFrcstService {
    Object getAtmtnInfo(String STCM,Integer type);
    Object warningStatistics();
    Object warningStatisticsSK();
    Object warningStatisticsSW();
    Object warningStatisticsSH();
    Object warningStatisticsSZY();
    Object countAtmtnInfo();
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/alarmRule/service/impl/FsRAtmtnFrcstServiceImpl.java
New file
@@ -0,0 +1,610 @@
package cn.gistack.alerts.alarmRule.service.impl;
import cn.gistack.alerts.alarmRule.DTO.WaterQueryDTO;
import cn.gistack.alerts.alarmRule.entity.FsRAtmtnFrcstInf;
import cn.gistack.alerts.alarmRule.mapper.FsRAtmtnFrcstInfMapper;
import cn.gistack.alerts.alarmRule.service.FsRAtmtnFrcstService;
import cn.gistack.alerts.alarmRule.vo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StopWatch;
import java.io.InputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Slf4j
public class FsRAtmtnFrcstServiceImpl implements FsRAtmtnFrcstService {
    @Autowired
    private FsRAtmtnFrcstInfMapper fsRAtmtnFrcstInfMapper;
    private static final ObjectMapper objectMapper = new ObjectMapper();
    private static final String apikey = "F1DBECD719108635189480CF60E6553ADB3109616426BD537F25A430DFC613B491A025C4A51E77FD08C6E5B7CBE05917A461286E7B6D69F1AB1B14F946149D2065B0C675F8FEDF4B9B05C1496881BC5A";
    private static final String cookie = "userobj=%7B%22_id%22%3A%225adfd17ddd000ba4188c53e0%22%2C%22name%22%3A%22%E9%98%B2%E6%B1%9B%E5%80%BC%E7%8F%AD%22%2C%22phone%22%3A%2213612345678%22%2C%22utype%22%3A0%2C%22dept%22%3A%22%E7%9C%81%E6%B0%B4%E5%88%A9%E5%8E%85%22%2C%22tm%22%3A%222018-04-25T00%3A53%3A17.147Z%22%2C%22token%22%3A%224e30701b3ac0996c60569e7f4c65ca5d%22%2C%22chkc%22%3Afalse%2C%22ywjk%22%3Afalse%2C%22yywh%22%3Afalse%7D";
    private static final HttpClient client = HttpClient.newHttpClient();
    @Override
    public Object getAtmtnInfo(String STCM, Integer type) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("查询预报信息");
        List<String> stcds = new ArrayList<>();
        if (StringUtils.isNotBlank(STCM)){
             stcds = fsRAtmtnFrcstInfMapper.getStcdS(STCM);
        }
        List<FsRAtmtnFrcstInfVO> atmtnInfo = new ArrayList<>();
        List<FsRAtmtnFrcstInfVO> result = new ArrayList<>();
            if (type==1){
                atmtnInfo = fsRAtmtnFrcstInfMapper.getAtmtnInfo(type,stcds);
            }else if (type==2){
                atmtnInfo = fsRAtmtnFrcstInfMapper.getAtmtnInfo1(type,stcds);
            }
        Map<String, List<FsRAtmtnFrcstInfVO>> map = atmtnInfo.stream().filter(s->s.getSTCD()!=null).collect(Collectors.groupingBy(FsRAtmtnFrcstInf::getSTCD));
            if (!map.isEmpty()){
                for (Map.Entry<String, List<FsRAtmtnFrcstInfVO>> entry : map.entrySet()) {
                    List<FsRAtmtnFrcstInfVO> value = entry.getValue();
                    List<FsRAtmtnFrcstDtVO> dtVOList = value.stream().map(s -> FsRAtmtnFrcstDtVO.builder().TM(s.getTM()).TZ(s.getTZ()).TQ(s.getTQ()).build()).collect(Collectors.toList());
                    FsRAtmtnFrcstInfVO fsRAtmtnFrcstInfVO = value.get(0);
                    fsRAtmtnFrcstInfVO.setFrcstDtVOS(dtVOList);
                    result.add(fsRAtmtnFrcstInfVO);
                }
            }
        stopWatch.stop();
        stopWatch.start("查询站点信息");
        List<String> STCDs = result.stream().map(FsRAtmtnFrcstInf::getSTCD).collect(Collectors.toList());
        List<StStbprpBVO> stationInfos = fsRAtmtnFrcstInfMapper.getStationInfo(STCDs);
        stopWatch.stop();
        stopWatch.start("封装数据");
        Map<String, StStbprpBVO> stationMap = stationInfos.stream().collect(Collectors.toMap(StStbprpBVO::getSTCD, bvo -> bvo, (oldValue, newValue) -> oldValue));  // 合并函数:如果键冲突,选择保留哪个值(这里保留旧值)
        if (CollectionUtils.isNotEmpty(result)){
            for (FsRAtmtnFrcstInfVO infVO : result) {
                StStbprpBVO bvo = stationMap.get(infVO.getSTCD());
                if (Objects.nonNull(bvo)){
                    infVO.setGRZ(bvo.getGRZ());
                    infVO.setRVNM(bvo.getRVNM()==null?null: bvo.getRVNM().replaceAll(" ",""));
                    infVO.setSTNM(bvo.getSTNM()==null?null:bvo.getSTNM().replaceAll(" ",""));
                    infVO.setWRZ(bvo.getWRZ());
                    infVO.setFSLTDZ(bvo.getFSLTDZ());
                    infVO.setSFLZ(bvo.getSFLZ());
                }
                for (FsRAtmtnFrcstDtVO dtVO : infVO.getFrcstDtVOS()) {
                    List<FsRAtmtnFrcstDtDeatilVO> list = new ArrayList<>();
                    list.add(new FsRAtmtnFrcstDtDeatilVO("水位", dtVO.getTZ()==0?null:dtVO.getTZ().toString()));
                    list.add(new FsRAtmtnFrcstDtDeatilVO("流量", dtVO.getTQ()==0?null:dtVO.getTQ().toString()));
                    dtVO.setList(list);
                }
            }
        }
        stopWatch.stop();
        log.info(stopWatch.prettyPrint());
        return  result;
    }
    @Override
    public List<WarningTypeVO> warningStatistics() {
        List<WarningTypeVO> result = new ArrayList<>();
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("水库统计");
        //水库统计
        Map<String,String> map = new HashMap<>();
        map.put("name","apikey");
        map.put("value",apikey);
        JsonNode jsonNode = doRequest("GET", "https://sk.hubeishuiyi.cn/services/1234567890ABCDEFGHIJKLMN/res_over_flpr_des_rain/api", map, null);
        JsonNode shuikuNode =  jsonNode.get("data").get("data");
        List<WarningTypeVO> shuikuChild = new ArrayList<>();
        for (JsonNode node : shuikuNode) {
            String overType = String.valueOf(node.get("over_type"));
            shuikuChild.add(WarningTypeVO.builder().warningType(overType.substring(1, overType.length() - 1)).warningNum(String.valueOf(node.get("over_number"))).build());
        }
        WarningTypeVO shuiku = WarningTypeVO.builder().warningType("水库").childList(shuikuChild).warningNum(String.valueOf(shuikuChild.stream().mapToInt(s -> Integer.parseInt(s.getWarningNum())).sum())).build();
        for (WarningTypeVO vo : shuikuChild) {
            if (vo.getWarningType().equals("超设计洪水位")||vo.getWarningType().equals("超防洪高水位")){
                shuiku.setColor("红色");
            }else if (vo.getWarningType().equals("暴雨")){
                shuiku.setColor("黄色");
            }
        }
        result.add(shuiku);
        stopWatch.stop();
        stopWatch.start("水文统计");
        //水文统计
        List<WarningTypeVO> shuiziyuanChild = new ArrayList<>();
        JsonNode jsonNode1 = doRequest("GET", "https://hfc.mwr.cn/warn-release-api/api/warninfo.custom/4MTAOTM1MzEyQHFxLmNvbQ==", new HashMap<>(), null);
        JsonNode data = jsonNode1.get("Data");
        List<WarningColorVO> hsChild = new ArrayList<>();
        List<WarningColorVO> ghChild = new ArrayList<>();
        for (JsonNode datum : data) {
            String wrType = datum.get("WRType").toString();
            wrType = wrType.substring(1,wrType.length()-1);
            String WRLevel = datum.get("WRLevel").toString();
            WRLevel = WRLevel.substring(1,WRLevel.length()-1);
            if (wrType.equals("洪水")){
                hsChild.add(WarningColorVO.builder().colorName(WRLevel).build());
            }else {
                ghChild.add(WarningColorVO.builder().colorName(WRLevel).build());
            }
        }
        WarningTypeVO hs = WarningTypeVO.builder().warningType("洪水预警").warningNum(String.valueOf(hsChild.size())).build();
        List<WarningColorVO> totals = hsChild.stream()
            .collect(Collectors.groupingBy(WarningColorVO::getColorName, Collectors.counting()))
            .entrySet().stream()
            .map(entry -> new WarningColorVO(entry.getKey(), Math.toIntExact(entry.getValue())))
            .collect(Collectors.toList());
        hs.setColorVOList(totals);
        WarningTypeVO gh = WarningTypeVO.builder().warningType("干旱预警").warningNum(String.valueOf(ghChild.size())).build();
        List<WarningColorVO> totals1 = ghChild.stream()
            .collect(Collectors.groupingBy(WarningColorVO::getColorName, Collectors.counting()))
            .entrySet().stream()
            .map(entry -> new WarningColorVO(entry.getKey(), Math.toIntExact(entry.getValue())))
            .collect(Collectors.toList());
        gh.setColorVOList(totals1);
        shuiziyuanChild.add(hs);
        shuiziyuanChild.add(gh);
        WarningTypeVO shuiwen = WarningTypeVO.builder().warningType("水文").childList(shuiziyuanChild).warningNum(String.valueOf(shuiziyuanChild.stream().mapToInt(s -> Integer.parseInt(s.getWarningNum())).sum())).build();
        totals.addAll(totals1);
        if (CollectionUtils.isNotEmpty(totals)){
            for (WarningColorVO vo : totals) {
                String colorName = vo.getColorName();
                if (colorName.equals("红色")){
                    shuiwen.setColor("红色");
                }else if (colorName.equals("橙色")){
                    shuiwen.setColor("橙色");
                }else if (colorName.equals("黄色")){
                    shuiwen.setColor("黄色");
                }else if (colorName.equals("蓝色")){
                    shuiwen.setColor("蓝色");
                }
            }
        }
        result.add(shuiwen);
        stopWatch.stop();
        stopWatch.start("山洪");
        //山洪
        List<WarningTypeVO> shList = new ArrayList<>();
        Map<String,String> map1 = new HashMap<>();
        map1.put("name","cookie");
        map1.put("value",cookie);
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH");
        String time = format.format(date);
        String type = "sh";
        JsonNode jsonNode2 = doRequest("GET", "https://sk.hubeishuiyi.cn/contourcale/hour6?tm="+time+"&type="+type, map1, null);
        JsonNode results = jsonNode2.get("results");
        int cnt = 0,wb = 0,nb = 0;
        for (JsonNode node : results) {
            JsonNode warnmap = node.get("warnmap");
            if (warnmap!=null){
                Iterator<JsonNode> elements = warnmap.elements();
                JsonNode jsonNode3  = elements.next();
                String cnt1 = jsonNode3.get("cnt").toString();
                cnt +=  Integer.parseInt(cnt1);
                String nbcnt1 = jsonNode3.get("nbcnt").toString();
                nb +=  Integer.parseInt(nbcnt1);
                String wbcnt1 = jsonNode3.get("wbcnt").toString();
                wb +=  Integer.parseInt(wbcnt1);
            }
        }
        shList.add(WarningTypeVO.builder().warningType("总数").warningNum(String.valueOf(cnt)).build());
        shList.add(WarningTypeVO.builder().warningType("内部预警").warningNum(String.valueOf(nb)).build());
        shList.add(WarningTypeVO.builder().warningType("外部预警").warningNum(String.valueOf(wb)).build());
        WarningTypeVO shanhong = WarningTypeVO.builder().warningType("山洪").childList(shList).warningNum(String.valueOf(cnt)).build();
        if (wb>0){
            shanhong.setColor("红色");
        }else if (nb>0){
            shanhong.setColor("黄色");
        }
        result.add(shanhong);
        stopWatch.stop();
        stopWatch.start("生态激流");
        //水资源
        //生态激流
        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy");
        String format1 = format.format(date);
        String format2 = dateFormat1.format(date);
        List<WarningTypeVO> szyList = new ArrayList<>();
        String dtBgTm = format2+"-01-01 00:00:00";
        String dtEdTm = format1+" 23:59:59";
        JsonNode jsonNode3 = doRequest("GET", "http://113.57.190.43:31700/api-szy-0.0.1/api/szy/v0.1/stjl/statis/b/queryBaseFlowList?addvcd=42", new HashMap<>(), null);
        JsonNode result1 = jsonNode3.get("result");
        int red = 0 , blue = 0;
        for (JsonNode node : result1) {
            if (node.get("Q")!=null){
                String s = node.get("Q").toString();
                if (!s.equals("null")){
                    String base_flow = node.get("BASE_FLOW").toString();
                    String blue_alert = node.get("WATER_LEVEL_BLUE_ALERT").toString();
                    double q = Double.parseDouble(s);
                    double flow = Double.parseDouble(base_flow.equals("null")?"0":base_flow.substring(1,base_flow.length()-1));
                    double alert = Double.parseDouble(blue_alert.equals("null")?"0":blue_alert.substring(1,blue_alert.length()-1));
                    if (q<flow){
                        red++;
                    }else if (q<alert){
                        blue++;
                    }
                }
            }else {
                String z = node.get("Z").toString();
                if (!z.equals("null")){
                    String water_level = node.get("WATER_LEVEL").toString();
                    String blueAlert = node.get("WATER_LEVEL_BLUE_ALERT").toString();
                    double Z = Double.parseDouble(z.substring(1,z.length()-1));
                    double level = Double.parseDouble(water_level.equals("null")?"0": water_level.substring(1,water_level.length()-1));
                    double alert = Double.parseDouble(blueAlert.equals("null")?"0": blueAlert.substring(1,blueAlert.length()-1));
                    if (Z>0){
                        if (Z>level){
                            red++;
                        }else if (Z>alert){
                            blue++;
                        }
                    }
                }
            }
        }
        List<WarningColorVO> stjl = new ArrayList<>();
        stjl.add(WarningColorVO.builder().colorName("红色").colorWarningNum(red).build());
        stjl.add(WarningColorVO.builder().colorName("蓝色").colorWarningNum(blue).build());
        szyList.add(WarningTypeVO.builder().warningNum(String.valueOf(red+blue)).colorVOList(stjl).warningType("河湖断面生态流量").build());
        stopWatch.stop();
        stopWatch.start("水量");
        //水量
        WaterQueryDTO queryDTO = WaterQueryDTO.builder().wiustTp("1").adlCd("42").tsBgTm(format2+"-01-01 00:00:00").tsEdTm(format1+" 00:00:00").build();
        int red1 = 0 , or = 0,blue1 = 0;
        try {
            String s = objectMapper.writeValueAsString(queryDTO);
            JsonNode jsonNode4 = doRequest("POST", "http://113.57.190.43:31700/api-szy-0.0.1/api/szy/v0.1/wr/wiu/b/list", new HashMap<>(), s);
            JsonNode result2 = jsonNode4.get("result");
            for (JsonNode node : result2) {
                String ratio = node.get("RATIO").toString();
                double r = Double.parseDouble(ratio.equals("null") ? "0" : ratio);
                if (r>1){
                    red1++;
                }else if (r>0.9&& r<=1){
                    or++;
                }else if (r>0.8&& r<=0.9){
                    blue1++;
                }
            }
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        List<WarningColorVO> sl = new ArrayList<>();
        sl.add(WarningColorVO.builder().colorName("红色").colorWarningNum(red1).build());
        sl.add(WarningColorVO.builder().colorName("橙色").colorWarningNum(or).build());
        sl.add(WarningColorVO.builder().colorName("蓝色").colorWarningNum(blue1).build());
        szyList.add(WarningTypeVO.builder().warningNum(String.valueOf(red1+or+blue1)).colorVOList(sl).warningType("水量").build());
        stopWatch.stop();
        System.out.println(stopWatch.prettyPrint());
        WarningTypeVO shuiziyuan = WarningTypeVO.builder().warningType("水资源").childList(szyList).warningNum(String.valueOf(cnt)).build();
        result.add(shuiziyuan);
        if (red1>0||red>0){
            shuiziyuan.setColor("红色");
        }else if (or>0){
            shuiziyuan.setColor("橙色");
        }else if (blue1>0||blue>0){
            shuiziyuan.setColor("蓝色");
        }
        return result;
    }
    @Override
    public WarningTypeVO warningStatisticsSK() {
        StopWatch stopWatch = new StopWatch();
        //水库统计
        Map<String,String> map = new HashMap<>();
        map.put("name","apikey");
        map.put("value",apikey);
        stopWatch.start("调用水库远程接口");
        JsonNode jsonNode = doRequest("GET", "https://sk.hubeishuiyi.cn/services/1234567890ABCDEFGHIJKLMN/res_over_flpr_des_rain/api", map, null);
        stopWatch.stop();
        stopWatch.start("封装水库统计数据");
        JsonNode shuikuNode =  jsonNode.get("data").get("data");
        List<WarningTypeVO> shuikuChild = new ArrayList<>();
        int typeNum = 0;
        for (JsonNode node : shuikuNode) {
            String overType = String.valueOf(node.get("over_type"));
            JsonNode overNumber = node.get("over_number");
            if (overNumber!=null){
            if (Integer.parseInt(overNumber.toString())>0){
                typeNum++;
            };
            }
            shuikuChild.add(WarningTypeVO.builder().warningType(overType.substring(1, overType.length() - 1)).warningNum(String.valueOf(node.get("over_number"))).build());
        }
        WarningTypeVO shuiku = WarningTypeVO.builder().warningType("水库").childList(shuikuChild).warningNum(String.valueOf(shuikuChild.stream().mapToInt(s -> Integer.parseInt(s.getWarningNum())).sum())).build();
        for (WarningTypeVO vo : shuikuChild) {
            if (vo.getWarningType().equals("超设计洪水位")||vo.getWarningType().equals("超防洪高水位")){
                shuiku.setColor("红色");
            }else if (vo.getWarningType().equals("暴雨")){
                shuiku.setColor("黄色");
            }
        }
        shuiku.setTypeNum(String.valueOf(typeNum) );
        stopWatch.stop();
        log.info(stopWatch.prettyPrint());
        return shuiku;
    }
    @Override
    public WarningTypeVO warningStatisticsSW() {
        //水文统计
        List<WarningTypeVO> shuiziyuanChild = new ArrayList<>();
        JsonNode jsonNode1 = doRequest("GET", "https://hfc.mwr.cn/warn-release-api/api/warninfo.custom/4MTAOTM1MzEyQHFxLmNvbQ==", new HashMap<>(), null);
        JsonNode data = jsonNode1.get("Data");
        List<WarningColorVO> hsChild = new ArrayList<>();
        List<WarningColorVO> ghChild = new ArrayList<>();
        for (JsonNode datum : data) {
            String wrType = datum.get("WRType").toString();
            wrType = wrType.substring(1,wrType.length()-1);
            String WRLevel = datum.get("WRLevel").toString();
            WRLevel = WRLevel.substring(1,WRLevel.length()-1);
            if (wrType.equals("洪水")){
                hsChild.add(WarningColorVO.builder().colorName(WRLevel).build());
            }else {
                ghChild.add(WarningColorVO.builder().colorName(WRLevel).build());
            }
        }
        WarningTypeVO hs = WarningTypeVO.builder().warningType("洪水预警").warningNum(String.valueOf(hsChild.size())).build();
        List<WarningColorVO> totals = hsChild.stream()
            .collect(Collectors.groupingBy(WarningColorVO::getColorName, Collectors.counting()))
            .entrySet().stream()
            .map(entry -> new WarningColorVO(entry.getKey(), Math.toIntExact(entry.getValue())))
            .collect(Collectors.toList());
        hs.setColorVOList(totals);
        WarningTypeVO gh = WarningTypeVO.builder().warningType("干旱预警").warningNum(String.valueOf(ghChild.size())).build();
        List<WarningColorVO> totals1 = ghChild.stream()
            .collect(Collectors.groupingBy(WarningColorVO::getColorName, Collectors.counting()))
            .entrySet().stream()
            .map(entry -> new WarningColorVO(entry.getKey(), Math.toIntExact(entry.getValue())))
            .collect(Collectors.toList());
        gh.setColorVOList(totals1);
        shuiziyuanChild.add(hs);
        shuiziyuanChild.add(gh);
        WarningTypeVO shuiwen = WarningTypeVO.builder().warningType("水文").childList(shuiziyuanChild).warningNum(String.valueOf(shuiziyuanChild.stream().mapToInt(s -> Integer.parseInt(s.getWarningNum())).sum())).build();
        totals.addAll(totals1);
        if (CollectionUtils.isNotEmpty(totals)){
            for (WarningColorVO vo : totals) {
                String colorName = vo.getColorName();
                if (colorName.equals("红色")){
                    shuiwen.setColor("红色");
                }else if (colorName.equals("橙色")){
                    shuiwen.setColor("橙色");
                }else if (colorName.equals("黄色")){
                    shuiwen.setColor("黄色");
                }else if (colorName.equals("蓝色")){
                    shuiwen.setColor("蓝色");
                }
            }
        }
        shuiwen.setTypeNum(shuiwen.getWarningNum());
        return shuiwen;
    }
    @Override
    public WarningTypeVO warningStatisticsSH() {
        List<WarningTypeVO> shList = new ArrayList<>();
        Map<String,String> map1 = new HashMap<>();
        map1.put("name","cookie");
        map1.put("value",cookie);
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH");
        String time = format.format(date);
        String type = "sh";
        JsonNode jsonNode2 = doRequest("GET", "https://sk.hubeishuiyi.cn/contourcale/hour6?tm="+time+"&type="+type, map1, null);
        JsonNode results = jsonNode2.get("results");
        int cnt = 0,wb = 0,nb = 0;
        for (JsonNode node : results) {
            JsonNode warnmap = node.get("warnmap");
            if (warnmap!=null){
                Iterator<JsonNode> elements = warnmap.elements();
                JsonNode jsonNode3  = elements.next();
                String cnt1 = jsonNode3.get("cnt").toString();
                cnt +=  Integer.parseInt(cnt1);
                String nbcnt1 = jsonNode3.get("nbcnt").toString();
                nb +=  Integer.parseInt(nbcnt1);
                String wbcnt1 = jsonNode3.get("wbcnt").toString();
                wb +=  Integer.parseInt(wbcnt1);
            }
        }
        shList.add(WarningTypeVO.builder().warningType("总数").warningNum(String.valueOf(cnt)).build());
        shList.add(WarningTypeVO.builder().warningType("内部预警").warningNum(String.valueOf(nb)).build());
        shList.add(WarningTypeVO.builder().warningType("外部预警").warningNum(String.valueOf(wb)).build());
        WarningTypeVO shanhong = WarningTypeVO.builder().warningType("山洪").childList(shList).warningNum(String.valueOf(cnt)).build();
        if (wb>0){
            shanhong.setColor("红色");
        }else if (nb>0){
            shanhong.setColor("黄色");
        }
        shanhong.setTypeNum(shanhong.getWarningNum());
        return shanhong;
    }
    @Override
    public WarningTypeVO warningStatisticsSZY() {
        StopWatch stopWatch = new StopWatch();
        //水资源
        //生态激流
        Date date = new Date();
        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String format1 = format.format(date);
        String format2 = dateFormat1.format(date);
        List<WarningTypeVO> szyList = new ArrayList<>();
        String dtBgTm = format2+"-01-01 00:00:00";
        String dtEdTm = format1+" 23:59:59";
        stopWatch.start("调用生态激流接口");
        JsonNode jsonNode3 = doRequest("GET", "http://113.57.190.43:31700/api-szy-0.0.1/api/szy/v0.1/stjl/statis/b/queryBaseFlowList?addvcd=42", new HashMap<>(), null);
        stopWatch.stop();
        stopWatch.start("封装生态激流数据");
        JsonNode result1 = jsonNode3.get("result");
        int red = 0 , blue = 0;
        for (JsonNode node : result1) {
            if (node.get("Q")!=null){
                String s = node.get("Q").toString();
                if (!s.equals("null")){
                    String base_flow = node.get("BASE_FLOW").toString();
                    String blue_alert = node.get("WATER_LEVEL_BLUE_ALERT").toString();
                    float q = Float.parseFloat(s);
                    float flow = Float.parseFloat(base_flow.equals("null")?"0":base_flow.substring(1,base_flow.length()-1));
                    float alert = Float.parseFloat(blue_alert.equals("null")?"0":blue_alert.substring(1,blue_alert.length()-1));
                    if (q>=0&&q<flow){
                        red++;
                    }else if (q<alert){
                        blue++;
                    }
                }
            }else {
                String z = node.get("Z").toString();
                if (!z.equals("null")){
                    String water_level = node.get("WATER_LEVEL").toString();
                    String blueAlert = node.get("WATER_LEVEL_BLUE_ALERT").toString();
                    float Z = Float.parseFloat(z.substring(1,z.length()-1));
                    float level = Float.parseFloat(water_level.equals("null")?"0": water_level.substring(1,water_level.length()-1));
                    float alert = Float.parseFloat(blueAlert.equals("null")?"0": blueAlert.substring(1,blueAlert.length()-1));
                    if (Z>=0){
                        if (Z>level){
                            red++;
                        }else if (Z>alert){
                            blue++;
                        }
                    }
                }
            }
        }
        List<WarningColorVO> stjl = new ArrayList<>();
        stjl.add(WarningColorVO.builder().colorName("红色").colorWarningNum(red).build());
        stjl.add(WarningColorVO.builder().colorName("蓝色").colorWarningNum(blue).build());
        szyList.add(WarningTypeVO.builder().warningNum(String.valueOf(red+blue)).colorVOList(stjl).warningType("河湖断面生态流量").build());
        int typeNum = 0;
        if (red>0||blue>0){
            typeNum += 1;
        }
        stopWatch.stop();
        //水量
        WaterQueryDTO queryDTO = WaterQueryDTO.builder().wiustTp("1").adlCd("42").tsBgTm(format2+"-01-01 00:00:00").tsEdTm(format1+" 00:00:00").build();
        int red1 = 0 , or = 0,blue1 = 0;
        try {
            String s = objectMapper.writeValueAsString(queryDTO);
            stopWatch.start("调用水量接口");
            JsonNode jsonNode4 = doRequest("POST", "http://113.57.190.43:31700/api-szy-0.0.1/api/szy/v0.1/wr/wiu/b/list", new HashMap<>(), s);
            stopWatch.stop();
            stopWatch.start("封装水量数据");
            JsonNode result2 = jsonNode4.get("result");
            for (JsonNode node : result2) {
                String ratio = node.get("RATIO").toString();
                double r = Double.parseDouble(ratio.equals("null") ? "0" : ratio);
                if (r>1){
                    red1++;
                }else if (r>0.9&& r<=1){
                    or++;
                }else if (r>0.8&& r<=0.9){
                    blue1++;
                }
            }
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        List<WarningColorVO> sl = new ArrayList<>();
        sl.add(WarningColorVO.builder().colorName("红色").colorWarningNum(red1).build());
        sl.add(WarningColorVO.builder().colorName("橙色").colorWarningNum(or).build());
        sl.add(WarningColorVO.builder().colorName("蓝色").colorWarningNum(blue1).build());
        szyList.add(WarningTypeVO.builder().warningNum(String.valueOf(red1+or+blue1)).colorVOList(sl).warningType("水量").build());
        WarningTypeVO shuiziyuan = WarningTypeVO.builder().warningType("水资源").childList(szyList).warningNum(String.valueOf(red1+or+blue1+red+blue)).build();
        if (red1>0||blue1>0||or>0){
            typeNum += 1;
        }
        if (red1>0||red>0){
            shuiziyuan.setColor("红色");
        }else if (or>0){
            shuiziyuan.setColor("橙色");
        }else if (blue1>0||blue>0){
            shuiziyuan.setColor("蓝色");
        }
        shuiziyuan.setTypeNum(String.valueOf(typeNum));
        stopWatch.stop();
        log.info(stopWatch.prettyPrint());
        return shuiziyuan;
    }
    @Override
    public Object countAtmtnInfo() {
        Map<String,String> map = new HashMap<>();
        List<FsRAtmtnFrcstInfVO> atmtnInfo = fsRAtmtnFrcstInfMapper.getAtmtnInfo1(null, null);
//        atmtnInfo.addAll(fsRAtmtnFrcstInfMapper.getAtmtnInfo1(null,null));
        List<String> STCDs = atmtnInfo.stream().map(FsRAtmtnFrcstInf::getSTCD).collect(Collectors.toList());
        List<StStbprpBVO> stationInfos = fsRAtmtnFrcstInfMapper.getStationInfo(STCDs);
        Map<String, StStbprpBVO> stationMap = stationInfos.stream().collect(Collectors.toMap(StStbprpBVO::getSTCD, bvo -> bvo, (oldValue, newValue) -> oldValue));
        Integer num = 0;
        if (CollectionUtils.isNotEmpty(atmtnInfo)){
            for (FsRAtmtnFrcstInfVO vo : atmtnInfo) {
                StStbprpBVO stbprpBVO = stationMap.get(vo.getSTCD());
                if (vo.getTQ()> Float.parseFloat(stbprpBVO.getWRZ()) ){
                    num++;
                }
            }
        }
        map.put("warningNum",String.valueOf(num));
        if (num>0){
            map.put("color","红色");
        }else {
            map.put("color","");
        }
        return map;
    }
    /**
     *处理远程请求
     */
    private static JsonNode doRequest(String method,String url,Map<String,String> headerParam,String param) {
        HttpRequest.Builder builder = HttpRequest.newBuilder();
        if (method.equals("GET")){
            builder.GET();
        }else {
            builder.POST(HttpRequest.BodyPublishers.ofString(param));
        }
        builder.uri(URI.create(url))
            .header("Accept", "application/json").header("Content-Type","application/json");
        if (!headerParam.isEmpty()){
            builder.header(headerParam.get("name"),headerParam.get("value"));
        }
        try {
            Instant requestS = Instant.now();
            HttpResponse<InputStream> response = client.send(builder.build(), HttpResponse.BodyHandlers.ofInputStream());
            Instant requestE= Instant.now();
            long requestTime = Duration.between(requestS, requestE).toMillis();
            log.info("请求时长为: " + requestTime + " milliseconds");
            Instant writeDataS = Instant.now();
            JsonNode jsonNode = objectMapper.readTree(response.body());
            Instant writeDataE = Instant.now();
            long writeDataTime = Duration.between(writeDataS, writeDataE).toMillis();
            log.info("接受数据时长: " + writeDataTime + " milliseconds");
            return jsonNode;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
@@ -45,11 +45,18 @@
          url: ${blade.datasource.dev.znwh.url}
          username: ${blade.datasource.dev.znwh.username}
          password: ${blade.datasource.dev.znwh.password}
        #水文预警(oracle)
        swyj:
          driver-class-name: ${blade.datasource.dev.swyj.driver-class-name}
          url: ${blade.datasource.dev.swyj.url}
          username: ${blade.datasource.dev.swyj.username}
          password: ${blade.datasource.dev.swyj.password}
        #站点水文信息(oracle)
        zdsw:
          driver-class-name: ${blade.datasource.dev.zdsw.driver-class-name}
          url: ${blade.datasource.dev.zdsw.url}
          username: ${blade.datasource.dev.zdsw.username}
          password: ${blade.datasource.dev.zdsw.password}
  main:
    allow-circular-references: true
getui:
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-prod.yml
@@ -43,6 +43,18 @@
          url: ${blade.datasource.prod.znwh.url}
          username: ${blade.datasource.prod.znwh.username}
          password: ${blade.datasource.prod.znwh.password}
          #水文预警(oracle)
        swyj:
          driver-class-name: ${blade.datasource.prod.swyj.driver-class-name}
          url: ${blade.datasource.prod.swyj.url}
          username: ${blade.datasource.prod.swyj.username}
          password: ${blade.datasource.prod.swyj.password}
        #站点水文信息(oracle)
        zdsw:
          driver-class-name: ${blade.datasource.prod.zdsw.driver-class-name}
          url: ${blade.datasource.prod.zdsw.url}
          username: ${blade.datasource.prod.zdsw.username}
          password: ${blade.datasource.prod.zdsw.password}
  main:
    allow-circular-references: true
getui:
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-test.yml
@@ -43,6 +43,17 @@
          url: ${blade.datasource.test.znwh.url}
          username: ${blade.datasource.test.znwh.username}
          password: ${blade.datasource.test.znwh.password}
        swyj:
          driver-class-name: ${blade.datasource.test.swyj.driver-class-name}
          url: ${blade.datasource.test.swyj.url}
          username: ${blade.datasource.test.swyj.username}
          password: ${blade.datasource.test.swyj.password}
        #站点水文信息(oracle)
        zdsw:
          driver-class-name: ${blade.datasource.test.zdsw.driver-class-name}
          url: ${blade.datasource.test.zdsw.url}
          username: ${blade.datasource.test.zdsw.username}
          password: ${blade.datasource.test.zdsw.password}
  main:
    allow-circular-references: true
getui: