Browse Source

Merge branch 'master' of http://124.70.58.209:3000/ytrd-project-management/GeoHazardMonitor

hexiao 2 years ago
parent
commit
8376f76f5c
38 changed files with 1472 additions and 234 deletions
  1. 0 5
      .idea/misc.xml
  2. 23 6
      business-service/src/main/java/com/ozs/service/entity/BaseUser.java
  3. 1 1
      business-service/src/main/java/com/ozs/service/entity/MsgAppPush.java
  4. 0 16
      business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatistic.java
  5. 36 0
      business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatisticResVo.java
  6. 105 0
      business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatisticVo.java
  7. 1 8
      business-service/src/main/java/com/ozs/service/entity/vo/MsgAlarmVo.java
  8. 1 1
      business-service/src/main/java/com/ozs/service/entity/vo/MsgAppPushVo.java
  9. 2 0
      business-service/src/main/java/com/ozs/service/mapper/BaseRailwayManagementMapper.java
  10. 2 0
      business-service/src/main/java/com/ozs/service/mapper/BaseUserMapper.java
  11. 9 0
      business-service/src/main/java/com/ozs/service/mapper/MsgAlarmMapper.java
  12. 21 0
      business-service/src/main/java/com/ozs/service/mapper/MsgAppPushMapper.java
  13. 5 0
      business-service/src/main/java/com/ozs/service/service/BaseCameraManagementService.java
  14. 4 0
      business-service/src/main/java/com/ozs/service/service/BaseRailwayManagementService.java
  15. 2 0
      business-service/src/main/java/com/ozs/service/service/BaseUserService.java
  16. 8 0
      business-service/src/main/java/com/ozs/service/service/MsgAlarmService.java
  17. 17 3
      business-service/src/main/java/com/ozs/service/service/MsgAppPushService.java
  18. 72 2
      business-service/src/main/java/com/ozs/service/service/impl/BaseCameraManagementServiceImpl.java
  19. 5 0
      business-service/src/main/java/com/ozs/service/service/impl/BaseRailwayManagementServiceImpl.java
  20. 5 0
      business-service/src/main/java/com/ozs/service/service/impl/BaseUserServiceImpl.java
  21. 37 0
      business-service/src/main/java/com/ozs/service/service/impl/MsgAlarmServiceImpl.java
  22. 17 0
      business-service/src/main/java/com/ozs/service/service/impl/MsgAppPushServiceImpl.java
  23. 9 0
      business-service/src/main/java/com/ozs/service/utils/DataPermissionUtils.java
  24. 3 0
      business-service/src/main/resources/mapper/service/BaseRailwayManagementMapper.xml
  25. 15 6
      business-service/src/main/resources/mapper/service/BaseUserMapper.xml
  26. 122 0
      business-service/src/main/resources/mapper/service/MsgAlarmMapper.xml
  27. 41 0
      business-service/src/main/resources/mapper/service/MsgAppPushMapper.xml
  28. 17 0
      hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java
  29. 5 1
      hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseRailwayManagementController.java
  30. 204 16
      hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java
  31. 14 3
      hazard-admin/src/main/java/com/ozs/web/controller/app/GeoHazardMineController.java
  32. 34 2
      hazard-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java
  33. 21 21
      hazard-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketConfig.java
  34. 131 129
      hazard-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketServer.java
  35. 23 0
      hazard-sdk/pom.xml
  36. 83 13
      hazard-sdk/src/main/java/com/ozs/controller/upload/GeoHazardMonitorTokenController.java
  37. 376 0
      hazard-sdk/src/main/java/com/ozs/jpush/JPushUtil.java
  38. 1 1
      hazard-sdk/src/main/java/com/ozs/websocket/WebSocketServer.java

+ 0 - 5
.idea/misc.xml

@@ -7,11 +7,6 @@
         <option value="$PROJECT_DIR$/pom.xml" />
       </list>
     </option>
-    <option name="ignoredFiles">
-      <set>
-        <option value="$PROJECT_DIR$/admin/pom.xml" />
-      </set>
-    </option>
   </component>
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
 </project>

+ 23 - 6
business-service/src/main/java/com/ozs/service/entity/BaseUser.java

@@ -43,21 +43,38 @@ public class BaseUser implements Serializable {
     /** 用户邮箱 */
     private String email;
 
-    /** 手机号码 */
+    /**
+     * 手机号码
+     */
     private String phoneNum;
 
-    /** 用户性别 */
+    /**
+     * 用户性别
+     */
     private Integer sex;
 
-    /** 用户头像 */
+    /**
+     * 用户头像
+     */
     private String avatar;
 
-    /** 密码 */
+    /**
+     * 密码
+     */
     private String password;
 
-    /** 帐号状态(0正常 1停用) */
+    /**
+     * 帐号状态(0正常 1停用)
+     */
     private Integer status;
 
-    /** 删除标志(0代表存在 2代表删除) */
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
     private Integer delFlag;
+
+    /**
+     * 数据权限 1:本人;2:本部门;3:本部门及下级部门;4:本人及本级部门;5:本人及本部门及下级部门;6:全部
+     */
+    private Integer dataPermission;
 }

+ 1 - 1
business-service/src/main/java/com/ozs/service/entity/MsgAppPush.java

@@ -39,7 +39,7 @@ public class MsgAppPush extends BaseEntity implements Serializable {
     /**
      * 接收人
      */
-    private Long recipient;
+    private String receiveBy;
 
     /**
      * 状态:0未读;1已读

+ 0 - 16
business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatistic.java

@@ -1,16 +0,0 @@
-package com.ozs.service.entity.vo;
-
-import lombok.Data;
-
-/**统计管理页面强求参数
- * @author wyy
- * @subject
- * @creat 2023/3/6
- */
-@Data
-public class AlarmStatistic {
-    /**
-     * 报警线路
-     */
-    private String alarmLine;
-}

+ 36 - 0
business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatisticResVo.java

@@ -0,0 +1,36 @@
+package com.ozs.service.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 统计管理页面强求参数
+ *
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Data
+public class AlarmStatisticResVo extends PageVo implements Serializable {
+    /**
+     * 线路
+     */
+    private String railwayCode;
+
+    /**
+     * 起始月份
+     */
+    private Integer startMonth;
+
+    /**
+     * 结束月份
+     */
+    private Integer endMonth;
+
+    /**
+     * 灾害类型
+     */
+    private String alarmType;
+}

+ 105 - 0
business-service/src/main/java/com/ozs/service/entity/vo/AlarmStatisticVo.java

@@ -0,0 +1,105 @@
+package com.ozs.service.entity.vo;
+
+import com.ozs.service.entity.BaseCameraManagement;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 统计管理页面实体类
+ *
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Data
+public class AlarmStatisticVo {
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 相机编码
+     */
+    private String cameraCode;
+
+    /**
+     * 报警时间
+     */
+    private Date alarmTime;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMile;
+
+    /**
+     * 报警内容
+     */
+    private String content;
+
+    /**
+     * 报警置信度(百分比)
+     */
+    private Integer alarmConfidence;
+
+    /**
+     * 报警行别(1上行2下行)
+     */
+    private Integer lineDir;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    private String imageUrl;
+
+    /**
+     * 解除人
+     */
+    private String releasedBy;
+
+    /**
+     * 解除时间
+     */
+    private Date releasedTime;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 月份
+     */
+    private Integer monthsta;
+
+    /**
+     * 次数
+     */
+    private Integer frequency;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private BaseCameraManagement baseCameraManagement;
+
+    public BaseCameraManagement getBaseCameraManagement() {
+        return baseCameraManagement;
+    }
+
+    public void setBaseCameraManagement(BaseCameraManagement baseCameraManagement) {
+        this.baseCameraManagement = baseCameraManagement;
+    }
+}

+ 1 - 8
business-service/src/main/java/com/ozs/service/entity/vo/MsgAlarmVo.java

@@ -1,15 +1,8 @@
 package com.ozs.service.entity.vo;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.ozs.common.annotation.Excel;
-import com.ozs.common.core.domain.BaseEntity;
+
 import com.ozs.common.vo.PageVo;
-import io.swagger.annotations.ApiModel;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 import java.util.Date;

+ 1 - 1
business-service/src/main/java/com/ozs/service/entity/vo/MsgAppPushVo.java

@@ -23,7 +23,7 @@ public class MsgAppPushVo extends PageVo implements Serializable {
     /**
      * 接收人
      */
-    private Long recipient;
+    private String receiveBy;
 
     /**
      * 状态:0未读;1已读

+ 2 - 0
business-service/src/main/java/com/ozs/service/mapper/BaseRailwayManagementMapper.java

@@ -3,6 +3,7 @@ package com.ozs.service.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.service.entity.BaseRailwayManagement;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -15,4 +16,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface BaseRailwayManagementMapper extends BaseMapper<BaseRailwayManagement> {
 
+    String getCameraNameByCameraCode(@Param("cameraCode") String cameraCode);
 }

+ 2 - 0
business-service/src/main/java/com/ozs/service/mapper/BaseUserMapper.java

@@ -29,4 +29,6 @@ public interface BaseUserMapper extends BaseMapper<BaseUser> {
     Set<String> getUserIdByDeptIdsBy5(@Param("deptList") List<Long> deptList);
 
     Set<String> getUserIdList6();
+
+    BaseUser getUser(@Param("userId") String userId);
 }

+ 9 - 0
business-service/src/main/java/com/ozs/service/mapper/MsgAlarmMapper.java

@@ -2,7 +2,12 @@ package com.ozs.service.mapper;
 
 import com.ozs.service.entity.MsgAlarm;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.service.entity.vo.AlarmStatisticVo;
+
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -14,5 +19,9 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface MsgAlarmMapper extends BaseMapper<MsgAlarm> {
+    //报警数据详情
+    List<AlarmStatisticVo> list(@Param("railwayCode") String railwayCode, @Param("startMonth") Integer startMonth, @Param("endMonth") Integer endMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
 
+    //报警月统计数据
+    List<AlarmStatisticVo> listMonth(@Param("railwayCode") String railwayCode, @Param("startMonth") Integer startMonth, @Param("endMonth") Integer endMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
 }

+ 21 - 0
business-service/src/main/java/com/ozs/service/mapper/MsgAppPushMapper.java

@@ -2,7 +2,11 @@ package com.ozs.service.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ozs.service.entity.MsgAppPush;
+import com.ozs.service.entity.vo.MsgAppPushVo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author wyy
@@ -11,5 +15,22 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface MsgAppPushMapper extends BaseMapper<MsgAppPush> {
+    /**
+     * app推送报警信息记录
+     *
+     * @param status
+     * @param
+     * @return
+     */
+    List<MsgAppPushVo> alarmPushMsg(Integer status);
 
+    /**
+     * app推送报警信息记录修改状态
+     *
+     * @param status
+     * @param id
+     * @param updateBy
+     * @return
+     */
+    public int update(@Param("id") Long id, @Param("status") Integer status, @Param("updateBy") String updateBy);
 }

+ 5 - 0
business-service/src/main/java/com/ozs/service/service/BaseCameraManagementService.java

@@ -17,9 +17,14 @@ import java.util.List;
 public interface BaseCameraManagementService extends IService<BaseCameraManagement> {
     /**
      * 相机台账管理表导入
+     *
      * @param accountManageList
      * @param updateSupport
      * @return
      */
     String importBaseAccountManagement(List<BaseCameraManagement> accountManageList, boolean updateSupport);
+
+    List<BaseCameraManagement> selectCameraAll(String userId);
+
+    List<String> getUserIds(String userId);
 }

+ 4 - 0
business-service/src/main/java/com/ozs/service/service/BaseRailwayManagementService.java

@@ -2,6 +2,7 @@ package com.ozs.service.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ozs.service.entity.BaseRailwayManagement;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -16,9 +17,12 @@ import java.util.List;
 public interface BaseRailwayManagementService extends IService<BaseRailwayManagement> {
     /**
      * 线路管理表导入
+     *
      * @param accountManageList
      * @param updateSupport
      * @return
      */
     String importBaseLineManagement(List<BaseRailwayManagement> accountManageList, boolean updateSupport);
+
+    String getCameraNameByCameraCode(String cameraCode);
 }

+ 2 - 0
business-service/src/main/java/com/ozs/service/service/BaseUserService.java

@@ -12,4 +12,6 @@ import java.util.Set;
 public interface BaseUserService extends IService<BaseUser> {
 
     Set<String> getUserIdList(String createBy, Long deptId);
+
+    BaseUser getUser(String userId);
 }

+ 8 - 0
business-service/src/main/java/com/ozs/service/service/MsgAlarmService.java

@@ -1,7 +1,11 @@
 package com.ozs.service.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ozs.service.entity.MsgAlarm;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.service.entity.vo.AlarmStatisticVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +16,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @since 2023-02-22
  */
 public interface MsgAlarmService extends IService<MsgAlarm> {
+    //web数据统计 报警数据详情
+    IPage<AlarmStatisticVo> list(String railwayCode, Integer startMonth, Integer endMonth, String alarmType, Integer pageNum, Integer pageSize, String userId);
 
+    //web数据统计 报警月统计数据
+    List<AlarmStatisticVo> getCount(String railwayCode, Integer startMonth, Integer endMonth, String alarmType, String userId);
 }

+ 17 - 3
business-service/src/main/java/com/ozs/service/service/MsgAppPushService.java

@@ -2,6 +2,10 @@ package com.ozs.service.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ozs.service.entity.MsgAppPush;
+import com.ozs.service.entity.vo.MsgAppPushVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @author wyy
@@ -10,11 +14,21 @@ import com.ozs.service.entity.MsgAppPush;
  */
 public interface MsgAppPushService extends IService<MsgAppPush> {
     /**
-     * 修改app推送报警信息记录为已读
-     * @param id
+     * app推送报警信息记录
+     *
+     * @param status
      * @param
      * @return
      */
-    //MsgAppPush updateStatus(Long id);
+    List<MsgAppPushVo> alarmPushMsg(Integer status);
 
+    /**
+     * app推送报警信息记录修改状态
+     *
+     * @param status
+     * @param id
+     * @param updateBy
+     * @return
+     */
+    int update(Long id, Integer status, String updateBy);
 }

+ 72 - 2
business-service/src/main/java/com/ozs/service/service/impl/BaseCameraManagementServiceImpl.java

@@ -3,13 +3,18 @@ package com.ozs.service.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.bean.BeanValidators;
 import com.ozs.service.entity.BaseCameraManagement;
 import com.ozs.service.entity.BaseDeviceDynamicManagement;
+import com.ozs.service.entity.BaseUser;
 import com.ozs.service.mapper.BaseCameraManagementMapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ozs.service.mapper.BaseDeviceDynamicManagementMapper;
+import com.ozs.service.mapper.BaseUserMapper;
 import com.ozs.service.service.BaseCameraManagementService;
+import com.ozs.service.service.BaseUserService;
+import com.ozs.service.utils.DataPermissionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
@@ -17,7 +22,9 @@ import org.springframework.util.ObjectUtils;
 import javax.annotation.Resource;
 import javax.validation.Validator;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -31,10 +38,14 @@ import java.util.List;
 public class BaseCameraManagementServiceImpl extends ServiceImpl<BaseCameraManagementMapper, BaseCameraManagement> implements BaseCameraManagementService {
     @Autowired
     protected Validator validator;
-    @Resource
-    BaseCameraManagementMapper baseCameraManagementMapper;
     @Autowired
     BaseDeviceDynamicManagementMapper baseDeviceDynamicManagementMapper;
+    @Resource
+    private BaseCameraManagementMapper baseCameraManagementMapper;
+    @Resource
+    private BaseUserService baseUserService;
+    @Resource
+    private BaseUserMapper baseUserMapper;
 
     /**
      * 相机台账管理表导入
@@ -99,4 +110,63 @@ public class BaseCameraManagementServiceImpl extends ServiceImpl<BaseCameraManag
         }
         return successMsg.toString();
     }
+
+    /**
+     * 获取相机列表+数据权限
+     *
+     * @return
+     */
+    @Override
+    public List<BaseCameraManagement> selectCameraAll(String userId) {
+        List<String> userIdList = getUserIds(userId);
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(userIdList)) {
+            lw.in(BaseCameraManagement::getCreateBy, userIdList);
+        }
+        List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementMapper.selectList(lw);
+        return baseCameraManagementList;
+    }
+
+    /**
+     * 根据当前登陆用户ID 查询当前用户数据权限
+     *
+     * @param userId
+     * @return
+     */
+    public List<String> getUserIds(String userId) {
+        BaseUser baseUser = baseUserService.getUser(userId);
+        if (StringUtils.isNull(baseUser) || StringUtils.isNull(baseUser.getDataPermission())
+                || StringUtils.isNull(baseUser.getDeptId())) {
+            return null;
+        }
+        // 数据权限 1:本人;2:本部门;3:本部门及下级部门;4:本人及本级部门;5:本人及本部门及下级部门;6:全部
+        Integer dataPermission = baseUser.getDataPermission();
+        Long deptId = baseUser.getDeptId();
+        Set<String> set = new HashSet<>();
+        if (1 == dataPermission) {
+            set = baseUserMapper.getUserIdList(userId);
+        } else if (2 == dataPermission) {
+            set = baseUserMapper.getUserIdByDeptId(deptId);
+        } else if (3 == dataPermission) {
+            // 获取部门数据
+            List<Long> deptList = baseUserMapper.getDeptId(deptId);
+            // 获取用户列表
+            set = baseUserMapper.getUserIdByDeptIds(deptList);
+        } else if (4 == dataPermission) {
+            set = baseUserMapper.getUserIdByDeptIdAndUserId(userId, deptId);
+        } else if (5 == dataPermission) {
+            // 获取本人
+            Set<String> setUser = baseUserMapper.getUserIdListBy5(userId);
+            // 获取部门数据
+            List<Long> deptList5 = baseUserMapper.getDeptId(deptId);
+            // 获取用户列表
+            Set<String> setUsers = baseUserMapper.getUserIdByDeptIdsBy5(deptList5);
+            set.addAll(setUser);
+            set.addAll(setUsers);
+        } else if (6 == dataPermission) {
+            set = baseUserMapper.getUserIdList6();
+        }
+        List<String> list = new ArrayList<>(set);
+        return list;
+    }
 }

+ 5 - 0
business-service/src/main/java/com/ozs/service/service/impl/BaseRailwayManagementServiceImpl.java

@@ -83,4 +83,9 @@ public class BaseRailwayManagementServiceImpl extends ServiceImpl<BaseRailwayMan
         }
         return successMsg.toString();
     }
+
+    @Override
+    public String getCameraNameByCameraCode(String cameraCode) {
+        return baseRailwayManagementMapper.getCameraNameByCameraCode(cameraCode);
+    }
 }

+ 5 - 0
business-service/src/main/java/com/ozs/service/service/impl/BaseUserServiceImpl.java

@@ -53,4 +53,9 @@ public class BaseUserServiceImpl extends ServiceImpl<BaseUserMapper, BaseUser> i
         set.addAll(set6);
         return set;
     }
+
+    @Override
+    public BaseUser getUser(String userId) {
+        return baseUserMapper.getUser(userId);
+    }
 }

+ 37 - 0
business-service/src/main/java/com/ozs/service/service/impl/MsgAlarmServiceImpl.java

@@ -1,11 +1,21 @@
 package com.ozs.service.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ozs.service.entity.MsgAlarm;
+import com.ozs.service.entity.vo.AlarmStatisticVo;
 import com.ozs.service.mapper.MsgAlarmMapper;
 import com.ozs.service.service.MsgAlarmService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 报警信息表 服务实现类
@@ -16,5 +26,32 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class MsgAlarmServiceImpl extends ServiceImpl<MsgAlarmMapper, MsgAlarm> implements MsgAlarmService {
+    @Autowired
+    MsgAlarmMapper msgAlarmMapper;
+
+    public static IPage listToPage(List list, int pageNum, int pageSize) {
+        List pageList = new ArrayList<>();
+        int curIdx = pageNum > 1 ? (pageNum - 1) * pageSize : 0;
+        for (int i = 0; i < pageSize && curIdx + i < list.size(); i++) {
+            pageList.add(list.get(curIdx + i));
+        }
+        IPage page = new Page<>(pageNum, pageSize);
+        page.setRecords(pageList);
+        page.setTotal(list.size());
+        return page;
+    }
+
+    //web数据统计 报警数据详情
+    @Override
+    public IPage<AlarmStatisticVo> list(String railwayCode, Integer startMonth, Integer endMonth, String alarmType, Integer pageNum, Integer pageSize, String userId) {
+        List<AlarmStatisticVo> list = msgAlarmMapper.list(railwayCode, startMonth, endMonth, alarmType, userId);
+        IPage listPage = listToPage(list, pageNum, pageSize);
+        return listPage;
+    }
 
+    @Override
+    public List<AlarmStatisticVo> getCount(String railwayCode, Integer startMonth, Integer endMonth, String alarmType, String userId) {
+        List<AlarmStatisticVo> list = msgAlarmMapper.listMonth(railwayCode, startMonth, endMonth, alarmType, userId);
+        return list;
+    }
 }

+ 17 - 0
business-service/src/main/java/com/ozs/service/service/impl/MsgAppPushServiceImpl.java

@@ -2,10 +2,14 @@ package com.ozs.service.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ozs.service.entity.MsgAppPush;
+import com.ozs.service.entity.vo.MsgAppPushVo;
 import com.ozs.service.mapper.MsgAppPushMapper;
 import com.ozs.service.service.MsgAppPushService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author wyy
  * @subject
@@ -13,5 +17,18 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class MsgAppPushServiceImpl extends ServiceImpl<MsgAppPushMapper, MsgAppPush> implements MsgAppPushService {
+    @Autowired
+    MsgAppPushMapper msgAppPushMapper;
+
+    @Override
+    public List<MsgAppPushVo> alarmPushMsg(Integer status) {
+        List<MsgAppPushVo> list = msgAppPushMapper.alarmPushMsg(status);
+        return list;
+    }
 
+    @Override
+    public int update(Long id, Integer status, String updateBy) {
+        int num = msgAppPushMapper.update(id, status, updateBy);
+        return num;
+    }
 }

+ 9 - 0
business-service/src/main/java/com/ozs/service/utils/DataPermissionUtils.java

@@ -0,0 +1,9 @@
+package com.ozs.service.utils;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/10 20:26
+ */
+public class DataPermissionUtils {
+
+}

+ 3 - 0
business-service/src/main/resources/mapper/service/BaseRailwayManagementMapper.xml

@@ -2,4 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ozs.service.mapper.BaseRailwayManagementMapper">
 
+    <select id="getCameraNameByCameraCode" resultType="java.lang.String" parameterType="java.lang.String">
+        select railway_name railwayName from base_railway_management where railway_code = #{cameraCode}
+    </select>
 </mapper>

+ 15 - 6
business-service/src/main/resources/mapper/service/BaseUserMapper.xml

@@ -19,14 +19,16 @@
     <select id="getDeptId" resultType="java.lang.Long" parameterType="java.lang.Long">
         select dept_id
         from sys_dept
-        where find_in_set(#{deptId}, ancestors)
+        where dept_id = #{deptId} or find_in_set(#{deptId}, ancestors)
     </select>
 
-    <select id="getUserIdByDeptIds" resultType="java.util.List" parameterType="java.lang.Long">
+    <select id="getUserIdByDeptIds" resultType="java.lang.String" parameterType="java.util.List">
         select user_id
         from sys_user
-        where dept_id in #{deptList}
-          and data_permission = 3
+        where data_permission = 3 and dept_id in
+        <foreach item="item" collection="deptList" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
     </select>
 
     <select id="getUserIdByDeptIdAndUserId" resultType="java.lang.String">
@@ -46,8 +48,11 @@
     <select id="getUserIdByDeptIdsBy5" resultType="java.util.List" parameterType="java.lang.Long">
         select user_id
         from sys_user
-        where dept_id in #{deptList}
-          and data_permission = 5
+        where dept_id in
+        <foreach item="item" collection="deptList" separator="," open="(" close=")" index="">
+            #{item}
+        </foreach>
+        and data_permission = 5
     </select>
 
     <select id="getUserIdList6" resultType="java.lang.String">
@@ -55,4 +60,8 @@
         from sys_user
         where data_permission = 6
     </select>
+
+    <select id="getUser" resultType="com.ozs.service.entity.BaseUser" parameterType="java.lang.String">
+        select user_id userId, dept_id deptId, data_permission dataPermission from sys_user where user_id = #{userId}
+    </select>
 </mapper>

+ 122 - 0
business-service/src/main/resources/mapper/service/MsgAlarmMapper.xml

@@ -1,5 +1,127 @@
 <?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="com.ozs.service.mapper.MsgAlarmMapper">
+    <resultMap id="AlarmStatisticVoResult" type="com.ozs.service.entity.vo.AlarmStatisticVo">
+        <id column="id" property="id"/>
+        <result column="alarm_id" property="alarmId"/>
+        <result column="camera_code" property="cameraCode"/>
+        <result column="alarm_time" property="alarmTime"/>
+        <result column="alarm_mile" property="alarmMile"/>
+        <result column="content" property="content"/>
+        <result column="alarm_confidence" property="alarmConfidence"/>
+        <result column="line_dir" property="lineDir"/>
+        <result column="alarm_type" property="alarmType"/>
+        <result column="alarm_attr" property="alarmAttr"/>
+        <result column="image_url" property="imageUrl"/>
+        <result column="released_by" property="releasedBy"/>
+        <result column="released_time" property="releasedTime"/>
+        <result column="is_lock" property="isLock"/>
+        <association property="baseCameraManagement" javaType="com.ozs.service.entity.BaseCameraManagement">
+            <id column="id" property="id"/>
+            <result column="railway_code" property="railwayCode"/>
+            <result column="channel" property="channel"/>
+            <result column="install_mile" property="installMile"/>
+            <result column="begin_mile" property="beginMile"/>
+            <result column="end_mile" property="endMile"/>
+            <result column="install_longitude" property="installLongitude"/>
+            <result column="install_latitude" property="installLatitude"/>
+        </association>
+    </resultMap>
 
+    <select id="list" resultMap="AlarmStatisticVoResult">
+        SELECT
+        a.alarm_id ,
+        a.camera_code ,
+        a.alarm_time ,
+        a.alarm_mile ,
+        a.content ,
+        a.alarm_confidence,
+        a.line_dir ,
+        a.alarm_type ,
+        a.alarm_attr ,
+        a.image_url ,
+        a.released_by ,
+        a.released_time,
+        a.is_lock ,
+        b.railway_code AS railway_code,
+        b.channel AS channel,
+        b.install_mile AS install_mile,
+        b.begin_mile AS begin_mile,
+        b.end_mile AS end_mile,
+        b.install_longitude AS install_longitude,
+        b.install_latitude AS install_latitude
+        FROM
+        msg_alarm AS a left join
+        base_camera_management AS b on a.camera_code=b.camera_code left join
+        msg_web_push m on a.alarm_id = m.alarm_id
+
+        <where>
+            <if test="railwayCode != null and railwayCode != ''">
+                and UPPER(b.railway_code) like UPPER(CONCAT('%',#{railwayCode},'%'))
+            </if>
+            <if test="startMonth != null and startMonth != 0">
+                <![CDATA[and MONTH(a.alarm_time) >=#{startMonth}]]>
+            </if>
+            <if test="endMonth != null and endMonth != 0">
+                <![CDATA[and MONTH(a.alarm_time) <=#{endMonth}]]>
+            </if>
+            <if test="alarmType != null and alarmType != ''">
+                and UPPER(a.alarm_type) like UPPER(CONCAT('%',#{alarmType},'%'))
+            </if>
+            <if test="userId != null and userId != ''">
+                and UPPER(m.receive_by) like UPPER(CONCAT('%',#{userId},'%'))
+            </if>
+        </where>
+        group by a.alarm_id
+    </select>
+
+    <select id="listMonth" resultMap="AlarmStatisticVoResult">
+        SELECT
+        a.alarm_id ,
+        MONTH(a.alarm_time) as monthsta,
+        count(DISTINCT a.alarm_id) as frequency,
+        a.camera_code ,
+        a.alarm_time ,
+        a.alarm_mile ,
+        a.content ,
+        a.alarm_confidence,
+        a.line_dir ,
+        a.alarm_type ,
+        a.alarm_attr ,
+        a.image_url ,
+        a.released_by ,
+        a.released_time,
+        a.is_lock ,
+        b.railway_code AS railway_code,
+        b.channel AS channel,
+        b.install_mile AS install_mile,
+        b.begin_mile AS begin_mile,
+        b.end_mile AS end_mile,
+        b.install_longitude AS install_longitude,
+        b.install_latitude AS install_latitude
+        FROM
+        msg_alarm AS a left join
+        base_camera_management AS b on a.camera_code=b.camera_code left join
+        msg_web_push m on a.alarm_id = m.alarm_id
+
+        <where>
+            <if test="railwayCode != null and railwayCode != ''">
+                and UPPER(b.railway_code) like UPPER(CONCAT('%',#{railwayCode},'%'))
+            </if>
+            <if test="startMonth != null and startMonth != 0">
+                <![CDATA[and MONTH(a.alarm_time) >=#{startMonth}]]>
+            </if>
+            <if test="endMonth != null and endMonth != 0">
+                <![CDATA[and MONTH(a.alarm_time) <=#{endMonth}]]>
+            </if>
+            <if test="alarmType != null and alarmType != ''">
+                and UPPER(a.alarm_type) like UPPER(CONCAT('%',#{alarmType},'%'))
+            </if>
+            <if test="userId != null and userId != ''">
+                and UPPER(m.receive_by) like UPPER(CONCAT('%',#{userId},'%'))
+            </if>
+        </where>
+        group by a.alarm_id,MONTH(a.alarm_time)
+
+    </select>
 </mapper>

+ 41 - 0
business-service/src/main/resources/mapper/service/MsgAppPushMapper.xml

@@ -0,0 +1,41 @@
+<?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="com.ozs.service.mapper.MsgAppPushMapper">
+    <resultMap id="MsgAppPushVoResult" type="com.ozs.service.entity.vo.MsgAppPushVo">
+        <id column="id" property="id"/>
+        <result column="alarm_id" property="alarmId"/>
+        <result column="receive_by" property="receiveBy"/>
+        <result column="status" property="status"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <select id="alarmPushMsg" resultMap="MsgAppPushVoResult">
+        select
+        alarm_id,
+        receive_by,
+        status,
+        create_by,
+        create_time,
+        update_by,
+        update_time,
+        remark
+        from msg_app_push
+        <where>
+            <if test="status != null and status != 0">
+                and UPPER(status) like UPPER(CONCAT('%',#{status},'%'))
+            </if>
+        </where>
+    </select>
+    <update id="update" parameterType="com.ozs.service.entity.MsgAppPush">
+        update msg_app_push
+        <set>
+            <if test="status != null and status != 0">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = sysdate()
+        </set>
+        where id = #{id}
+    </update>
+</mapper>

+ 17 - 0
hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java

@@ -8,6 +8,8 @@ import com.ozs.common.config.BaseConfig;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.entity.SysDept;
+import com.ozs.common.core.domain.entity.SysUser;
+import com.ozs.common.core.domain.model.LoginUser;
 import com.ozs.common.exception.base.BaseException;
 import com.ozs.common.utils.AppendUtils;
 import com.ozs.common.utils.StringUtils;
@@ -84,6 +86,17 @@ public class BaseCameraManagementController extends BaseController {
     @Autowired
     private CaneraConfig caneraConfig;
 
+    /**
+     * 所有相机列表+权限
+     */
+    @ApiOperation(value = "相机台账管理分页")
+    @GetMapping("/selectCameraAll")
+    public AjaxResult selectCameraAll() {
+        String userId = getUserId();
+        List<BaseCameraManagement> baseCameraManagements = baseCameraManagementService.selectCameraAll(userId);
+        return AjaxResult.success(baseCameraManagements);
+    }
+
     /**
      * 相机台账管理分页
      *
@@ -93,7 +106,11 @@ public class BaseCameraManagementController extends BaseController {
     @ApiOperation(value = "相机台账管理分页")
     @PostMapping("/list")
     public AjaxResult selectBaseAccountManagement(@RequestBody BaseCameraManagementVo baseCameraManagementVo) {
+        List<String> userIds = baseCameraManagementService.getUserIds(getUserId());
         LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(userIds)) {
+            lw.in(BaseCameraManagement::getCreateBy, userIds);
+        }
         if (!ObjectUtils.isEmpty(baseCameraManagementVo.getLineDir()) && baseCameraManagementVo.getLineDir() != 0) {
             lw.eq(BaseCameraManagement::getLineDir, baseCameraManagementVo.getLineDir());
         }

+ 5 - 1
hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseRailwayManagementController.java

@@ -68,11 +68,15 @@ public class BaseRailwayManagementController extends BaseController {
     @ApiOperation(value = "线路管理表分页")
     @PostMapping("/list")
     public AjaxResult selectBaseLineManagement(@RequestBody BaseRailwayManagementVo baseRailwayManagementVo) {
+        List<String> userIds = baseCameraManagementService.getUserIds(getUserId());
         LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(userIds)) {
+            lw.in(BaseRailwayManagement::getCreateBy, userIds);
+        }
         if (!StringUtils.isBlank(baseRailwayManagementVo.getRailwayCode())) {
             lw.like(BaseRailwayManagement::getRailwayCode, "%" + baseRailwayManagementVo.getRailwayCode() + "%");
         }
-        if (!ObjectUtils.isEmpty(baseRailwayManagementVo.getRailwayType())) {
+        if (!ObjectUtils.isEmpty(baseRailwayManagementVo.getRailwayType()) && baseRailwayManagementVo.getRailwayType() != 0) {
             lw.eq(BaseRailwayManagement::getRailwayType, baseRailwayManagementVo.getRailwayType());
         }
         IPage<BaseRailwayManagement> page = baseRailwayManagementService.page(new Page<BaseRailwayManagement>(baseRailwayManagementVo.getPageNum(), baseRailwayManagementVo.getPageSize()), lw);

+ 204 - 16
hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java

@@ -7,21 +7,31 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.utils.AppendUtils;
+import com.ozs.common.utils.StringUtils;
 import com.ozs.service.entity.BaseCameraManagement;
 import com.ozs.service.entity.BaseRailwayManagement;
 import com.ozs.service.entity.MsgAlarm;
 import com.ozs.service.entity.MsgAlarmFrequency;
-import com.ozs.service.entity.vo.MsgAlarmResp;
-import com.ozs.service.entity.vo.MsgAlarmVo;
+import com.ozs.service.entity.vo.*;
+import com.ozs.service.mapper.MsgAlarmMapper;
 import com.ozs.service.service.BaseCameraManagementService;
 import com.ozs.service.service.BaseRailwayManagementService;
 import com.ozs.service.service.MsgAlarmFrequencyService;
 import com.ozs.service.service.MsgAlarmService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -32,8 +42,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -52,13 +64,13 @@ public class MsgAlarmController extends BaseController {
     @Resource
     MsgAlarmService msgAlarmService;
     @Resource
+    MsgAlarmMapper msgAlarmMapper;
+    @Resource
     MsgAlarmFrequencyService msgAlarmFrequencyService;
     @Autowired
     BaseCameraManagementService baseCameraManagementService;
     @Autowired
     BaseRailwayManagementService baseRailwayManagementService;
-    @Value("${base.imgUrl:http://124.71.171.71:18801/picbucket}")
-    private String imgUrl; 
 
     /**
      * 测试消息推送
@@ -128,13 +140,6 @@ public class MsgAlarmController extends BaseController {
         IPage<MsgAlarm> page = msgAlarmService.page(new Page<>(msgAlarmVo.getPageNum(), msgAlarmVo.getPageSize()), lw);
         if(!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getRecords())){
             List<MsgAlarm> dto1 = page.getRecords().stream().map(o -> {
-                ArrayList<String> objects = new ArrayList<>();
-                String[] split = o.getImageUrl().split(";");
-                for (String s : split) {
-                    s=imgUrl+s;
-                    objects.add(s);
-                }
-                o.setImageUrls(objects);
                 LambdaQueryWrapper<BaseCameraManagement> cameraManagementLambdaQueryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
                 if (!ObjectUtils.isEmpty(o.getCameraCode())) {
                     cameraManagementLambdaQueryWrapper.eq(BaseCameraManagement::getCameraCode, o.getCameraCode());
@@ -211,14 +216,197 @@ public class MsgAlarmController extends BaseController {
         return AjaxResult.success(list);
     }
 
-    @GetMapping(value = "/videoHistoricalAlarm/{alarmId}")
+    @GetMapping(value = "/videoHistoricalAlarm/{cameraCode}")
     @ApiOperation("视频服务历史报警信息")
-    public AjaxResult videoHistoricalAlarm(@PathVariable Long alarmId) {
+    public AjaxResult videoHistoricalAlarm(@PathVariable String cameraCode) {
         QueryWrapper<MsgAlarm> wrapper = new QueryWrapper<>();
-        wrapper.eq("alarm_id", alarmId);
+        wrapper.eq("camera_code", cameraCode);
         wrapper.orderByDesc("alarm_time");
         List<MsgAlarm> list = msgAlarmService.list(wrapper);
         return AjaxResult.success(list);
     }
+
+    /**
+     * web数据统计
+     *
+     * @param alarmStatisticResVo
+     * @return
+     */
+    @PostMapping("/dataStatistic")
+    @ApiOperation(value = "web数据统计 报警数据详情")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "startMonth", value = "起始月份"),
+            @ApiImplicitParam(paramType = "query", name = "endMonth", value = "结束月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public AjaxResult dataStatistic(@RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        Integer pageNum = alarmStatisticResVo.getPageNum().intValue();
+        Integer pageSize = alarmStatisticResVo.getPageSize().intValue();
+        String userId = getUserId();
+        if ("1".equals(userId)) {
+            userId = "";
+        }
+        IPage<AlarmStatisticVo> page = msgAlarmService.list(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getStartMonth(),
+                alarmStatisticResVo.getEndMonth(), alarmStatisticResVo.getAlarmType(), pageNum, pageSize, userId);
+        return AjaxResult.success(page);
+    }
+
+    /**
+     * web数据统计
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/alarmMonthStatistic")
+    @ApiOperation(value = "web数据统计 报警月统计数据")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "startMonth", value = "起始月份"),
+            @ApiImplicitParam(paramType = "query", name = "endMonth", value = "结束月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public AjaxResult alarmMonthStatistic(@RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        String userId = getUserId();
+        if ("1".equals(userId)) {
+            userId = "";
+        }
+        List<AlarmStatisticVo> list = msgAlarmService.getCount(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getStartMonth(),
+                alarmStatisticResVo.getEndMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        return AjaxResult.success(list);
+    }
+
+
+    /**
+     * web数据统计 数据导出
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/exportDataStatistic")
+    @ApiOperation(value = "web数据统计")
+    public void exportDataStatistic(HttpServletRequest request, HttpServletResponse response, @RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        //创建Excel文件
+        Workbook wb = new HSSFWorkbook();
+        //生成sheet
+        Sheet sheet = wb.createSheet("报警数据详情");
+        //创建行
+        Row row = null;
+        //创建列
+        Cell cell = null;
+        //创建表头单元格样式
+        CellStyle cs_header = wb.createCellStyle();
+        //设置字体样式
+        Font boldFont = wb.createFont();
+        //设置文字类型
+        boldFont.setFontName("宋体");
+        //设置加粗
+        boldFont.setBold(true);
+        //设置文字大小
+        boldFont.setFontHeightInPoints((short) 16);
+        //应用设置的字体
+        cs_header.setFont(boldFont);
+        //设置边框下、左、右、上
+        cs_header.setBorderBottom(BorderStyle.THIN);
+        cs_header.setBorderLeft(BorderStyle.THIN);
+        cs_header.setBorderRight(BorderStyle.THIN);
+        cs_header.setBorderTop(BorderStyle.THIN);
+        //水平居中
+        cs_header.setAlignment(HorizontalAlignment.CENTER);
+        //垂直居中
+        cs_header.setVerticalAlignment(VerticalAlignment.CENTER);
+        //前景填充色
+        cs_header.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);
+        //设置前景填充样式
+        cs_header.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        //设置标题
+        row = sheet.createRow(0);
+        //设置单元格行高
+        row.setHeightInPoints(24);
+        //设置标题
+        String[] headers = new String[]{
+                "线路", "时间", "行别", "报警类型", "里程位置", "里程起始范围km", "里程结束范围km"
+        };
+        //逐个设置标题样式
+        for (int i = 0; i < headers.length; i++) {
+            //创建单元格
+            cell = row.createCell(i);
+            //设置单元格内容
+            cell.setCellValue(headers[i]);
+            //设置单元格样式
+            cell.setCellStyle(cs_header);
+        }
+        //创建文本单元格样式
+        CellStyle cs_text = wb.createCellStyle();
+        //创建文字设置
+        Font textFont = wb.createFont();
+        //设置文字类型
+        textFont.setFontName("Consolas");
+        //设置文字大小
+        textFont.setFontHeightInPoints((short) 10);
+        //应用设置
+        cs_text.setFont(textFont);
+        //设置边框
+        cs_text.setBorderBottom(BorderStyle.THIN);
+        cs_text.setBorderLeft(BorderStyle.THIN);
+        cs_text.setBorderRight(BorderStyle.THIN);
+        cs_text.setBorderTop(BorderStyle.THIN);
+        //水平居中
+        cs_text.setAlignment(HorizontalAlignment.CENTER);
+        //垂直居中
+        cs_text.setVerticalAlignment(VerticalAlignment.CENTER);
+        String userId = "1";//getUserId();
+        if ("1".equals(userId)) {
+            userId = "";
+        }
+        //调取数据
+        List<AlarmStatisticVo> list = msgAlarmMapper.list(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getStartMonth(),
+                alarmStatisticResVo.getEndMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        //将数据写入表格
+        for (int i = 0; i < list.size(); i++) {
+            row = sheet.createRow(i + 1);
+            AlarmStatisticVo vo = list.get(i);
+            // 第四步,创建单元格,并设置值
+            if (StringUtils.isNotEmpty(vo.getBaseCameraManagement().getRailwayCode())) {
+                row.createCell(0).setCellValue(vo.getBaseCameraManagement().getRailwayCode());
+            }
+            if (vo.getAlarmTime() != null) {
+                row.createCell(1).setCellValue(vo.getAlarmTime());
+            }
+            if (vo.getLineDir() != null) {
+                row.createCell(2).setCellValue(vo.getLineDir());
+            }
+            if (vo.getAlarmType() != null) {
+                row.createCell(3).setCellValue(vo.getAlarmType());
+            }
+            if (vo.getBaseCameraManagement().getInstallMile() != null) {
+                row.createCell(4).setCellValue(vo.getBaseCameraManagement().getInstallMile());
+            }
+            if (vo.getBaseCameraManagement().getBeginMile() != null) {
+                row.createCell(5).setCellValue(vo.getBaseCameraManagement().getBeginMile());
+            }
+            if (vo.getBaseCameraManagement().getEndMile() != null) {
+                row.createCell(6).setCellValue(vo.getBaseCameraManagement().getEndMile());
+            }
+        }
+        //设置中文文件名称
+        String fileName = "报警数据详情";//URLEncoder.encode("POIExcel下载测试","UTF-8");
+        //浏览器默认服务器传过去的是html,不是excel文件
+        //设置响应类型:传输内容是流,并支持中文
+        response.setContentType("application/octet-stream;charset=UTF-8");
+        //设置响应头信息header,下载时以文件附件下载
+        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
+        //输出流对象
+        OutputStream os;
+        try {
+            os = response.getOutputStream();
+            //强制刷新
+            os.flush();
+            os.close();
+            wb.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }
 

+ 14 - 3
hazard-admin/src/main/java/com/ozs/web/controller/app/GeoHazardMineController.java

@@ -24,6 +24,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.util.List;
 import java.util.UUID;
 
 /**
@@ -98,9 +99,19 @@ public class GeoHazardMineController extends BaseController {
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ApiOperation("app推送报警信息记录分页显示(全部信息)")
     public AjaxResult list(@RequestBody MsgAppPushVo msgAppPushVo) {
-        QueryWrapper<MsgAppPush> queryWrapper = new QueryWrapper<MsgAppPush>();
-        IPage<MsgAppPush> page = msgAppPushService.page(new Page<>(msgAppPushVo.getPageNum(), msgAppPushVo.getPageSize()), queryWrapper);
-        return AjaxResult.success(page);
+        List<MsgAppPushVo> list = msgAppPushService.alarmPushMsg(msgAppPushVo.getStatus());
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * app推送报警信息记录修改状态
+     */
+    @RequestMapping(value = "/update", method = RequestMethod.POST)
+    @ApiOperation("app推送报警信息记录分页显示(全部信息)")
+    public AjaxResult update(@RequestBody MsgAppPush msgAppPush) {
+        String userName = getUsername();
+        msgAppPushService.update(msgAppPush.getId(), msgAppPush.getStatus(), userName);
+        return AjaxResult.success();
     }
 }
 

+ 34 - 2
hazard-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java

@@ -1,11 +1,16 @@
 package com.ozs.web.controller.system;
 
+import java.io.InputStream;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ozs.common.utils.file.FileUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -34,6 +39,7 @@ import com.ozs.system.service.ISysUserService;
  */
 @RestController
 @RequestMapping("/system/user")
+@Slf4j
 public class SysUserController extends BaseController {
     @Autowired
     private ISysUserService userService;
@@ -73,8 +79,8 @@ public class SysUserController extends BaseController {
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
         ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
         List<SysUser> userList = util.importExcel(file.getInputStream());
-        String operName = getUsername();
-        String message = userService.importUser(userList, updateSupport, operName);
+        String userId = getUserId();
+        String message = userService.importUser(userList, updateSupport, userId);
         return success(message);
     }
 
@@ -84,6 +90,19 @@ public class SysUserController extends BaseController {
         util.importTemplateExcel(response, "用户数据");
     }
 
+    @ApiOperation("用户管理信息模板下载")
+    @GetMapping("/downloaExcel")
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/SysUser.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "用户管理信息模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
     /**
      * 根据用户编号获取详细信息
      */
@@ -232,4 +251,17 @@ public class SysUserController extends BaseController {
     public AjaxResult deptTree(SysDept dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
+
+    /**
+     * 数据权限分配
+     */
+    @GetMapping("/dataPermission/{id}/{dataPermission}")
+    @ApiOperation("数据权限分配")
+    public AjaxResult dataPermission(@PathVariable("id") Long id,@PathVariable("dataPermission") Integer dataPermission) {
+        if (userService.dataPermission(id,dataPermission)){
+            return success();
+        }else {
+            return error();
+        }
+    }
 }

+ 21 - 21
hazard-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketConfig.java

@@ -1,21 +1,21 @@
-//package com.ozs.web.controller.websocket;
-//
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.web.socket.server.standard.ServerEndpointExporter;
-//
-///**
-// * @Author : sunhh
-// * @create 2023/3/7 16:17
-// */
-//@Configuration
-//public class WebSocketConfig {
-//    /**
-//     * 	注入ServerEndpointExporter,
-//     * 	这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
-//     */
-//    @Bean
-//    public ServerEndpointExporter serverEndpointExporter() {
-//        return new ServerEndpointExporter();
-//    }
-//}
+package com.ozs.web.controller.websocket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/7 16:17
+ */
+@Configuration
+public class WebSocketConfig {
+    /**
+     * 注入ServerEndpointExporter,
+     * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
+     */
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 131 - 129
hazard-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketServer.java

@@ -1,129 +1,131 @@
-//package com.ozs.web.controller.websocket;
-//
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.stereotype.Component;
-//
-//import javax.websocket.*;
-//import javax.websocket.server.PathParam;
-//import javax.websocket.server.ServerEndpoint;
-//import java.util.HashMap;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.concurrent.ConcurrentHashMap;
-//import java.util.concurrent.CopyOnWriteArraySet;
-//
-///**
-// * @Author : sunhh
-// * @create 2023/3/7 16:15
-// */
-//@Slf4j
-//@Component
-//@ServerEndpoint("/websocket/{userId}")  // 接口路径 ws://localhost:8087/webSocket/userId;
-//public class WebSocketServer {
-//
-//    //与某个客户端的连接会话,需要通过它来给客户端发送数据
-//    private Session session;
-//    /**
-//     * 用户ID
-//     */
-//    private String userId;
-//
-//    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
-//    //虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。
-//    //  注:底下WebSocket是当前类名
-//    private static CopyOnWriteArraySet<WebSocketServer> webSockets =new CopyOnWriteArraySet<>();
-//    // 用来存在线连接用户信息
-//    private static ConcurrentHashMap<String,Session> sessionPool = new ConcurrentHashMap<String,Session>();
-//
-//    /**
-//     * 链接成功调用的方法
-//     */
-//    @OnOpen
-//    public void onOpen(Session session, @PathParam(value="userId")String userId) {
-//        try {
-//            this.session = session;
-//            this.userId = userId;
-//            webSockets.add(this);
-//            sessionPool.put(userId, session);
-//            log.info("【websocket消息】有新的连接,总数为:"+webSockets.size());
-//        } catch (Exception e) {
-//        }
-//    }
-//
-//    /**
-//     * 链接关闭调用的方法
-//     */
-//    @OnClose
-//    public void onClose() {
-//        try {
-//            webSockets.remove(this);
-//            sessionPool.remove(this.userId);
-//            log.info("【websocket消息】连接断开,总数为:"+webSockets.size());
-//        } catch (Exception e) {
-//        }
-//    }
-//    /**
-//     * 收到客户端消息后调用的方法
-//     *
-//     * @param message
-//     */
-//    @OnMessage
-//    public void onMessage(String message) {
-//        log.info("【websocket消息】收到客户端消息:"+message);
-//    }
-//
-//    /** 发送错误时的处理
-//     * @param session
-//     * @param error
-//     */
-//    @OnError
-//    public void onError(Session session, Throwable error) {
-//
-//        log.error("用户错误,原因:"+error.getMessage());
-//        error.printStackTrace();
-//    }
-//
-//
-//    // 此为广播消息
-//    public void sendAllMessage(String message) {
-//        log.info("【websocket消息】广播消息:"+message);
-//        for(WebSocketServer webSocket : webSockets) {
-//            try {
-//                if(webSocket.session.isOpen()) {
-//                    webSocket.session.getAsyncRemote().sendText(message);
-//                }
-//            } catch (Exception e) {
-//                e.printStackTrace();
-//            }
-//        }
-//    }
-//
-//    // 此为单点消息
-//    public void sendOneMessage(String userId, String message) {
-//        Session session = sessionPool.get(userId);
-//        if (session != null&&session.isOpen()) {
-//            try {
-//                log.info("【websocket消息】 单点消息:"+message);
-//                session.getAsyncRemote().sendText(message);
-//            } catch (Exception e) {
-//                e.printStackTrace();
-//            }
-//        }
-//    }
-//
-//    // 此为单点消息(多人)
-//    public void sendMoreMessage(String[] userIds, String message) {
-//        for(String userId:userIds) {
-//            Session session = sessionPool.get(userId);
-//            if (session != null&&session.isOpen()) {
-//                try {
-//                    log.info("【websocket消息】 单点消息:"+message);
-//                    session.getAsyncRemote().sendText(message);
-//                } catch (Exception e) {
-//                    e.printStackTrace();
-//                }
-//            }
-//        }
-//
-//    }
-//}
+package com.ozs.web.controller.websocket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/7 16:15
+ */
+@Slf4j
+@Component
+@ServerEndpoint("/websocket/{userId}")  // 接口路径 ws://localhost:8087/webSocket/userId;
+public class WebSocketServer {
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
+    //虽然@Component默认是单例模式的,但springboot还是会为每个websocket连接初始化一个bean,所以可以用一个静态set保存起来。
+    //  注:底下WebSocket是当前类名
+    private static CopyOnWriteArraySet<WebSocketServer> webSockets = new CopyOnWriteArraySet<>();
+    // 用来存在线连接用户信息
+    private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<String, Session>();
+    //与某个客户端的连接会话,需要通过它来给客户端发送数据
+    private Session session;
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 链接成功调用的方法
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "userId") String userId) {
+        try {
+            this.session = session;
+            this.userId = userId;
+            webSockets.add(this);
+            sessionPool.put(userId, session);
+            log.info("【websocket消息】有新的连接,总数为:" + webSockets.size());
+        } catch (Exception e) {
+        }
+    }
+
+    /**
+     * 链接关闭调用的方法
+     */
+    @OnClose
+    public void onClose() {
+        try {
+            webSockets.remove(this);
+            sessionPool.remove(this.userId);
+            log.info("【websocket消息】连接断开,总数为:" + webSockets.size());
+        } catch (Exception e) {
+        }
+    }
+
+    /**
+     * 收到客户端消息后调用的方法
+     *
+     * @param message
+     */
+    @OnMessage
+    public void onMessage(String message) {
+        log.info("【websocket消息】收到客户端消息:" + message);
+    }
+
+    /**
+     * 发送错误时的处理
+     *
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+
+        log.error("用户错误,原因:" + error.getMessage());
+        error.printStackTrace();
+    }
+
+
+    // 此为广播消息
+    public void sendAllMessage(String message) {
+        log.info("【websocket消息】广播消息:" + message);
+        for (WebSocketServer webSocket : webSockets) {
+            try {
+                if (webSocket.session.isOpen()) {
+                    webSocket.session.getAsyncRemote().sendText(message);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息
+    public void sendOneMessage(String userId, String message) {
+        Session session = sessionPool.get(userId);
+        if (session != null && session.isOpen()) {
+            try {
+                log.info("【websocket消息】 单点消息:" + message);
+                session.getAsyncRemote().sendText(message);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息(多人)
+    public void sendMoreMessage(String[] userIds, String message) {
+        for (String userId : userIds) {
+            Session session = sessionPool.get(userId);
+            if (session != null && session.isOpen()) {
+                try {
+                    log.info("【websocket消息】 单点消息:" + message);
+                    session.getAsyncRemote().sendText(message);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+}

+ 23 - 0
hazard-sdk/pom.xml

@@ -25,6 +25,29 @@
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
 
+        <!-- 极光推送 -->
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.3.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jmessage-client</artifactId>
+            <version>1.1.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jiguang-common</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>io.netty</groupId>-->
+<!--            <artifactId>netty-all</artifactId>-->
+<!--            <version>4.1.6.Final</version>-->
+<!--            <scope>compile</scope>-->
+<!--        </dependency>-->
+
         <!--lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>

+ 83 - 13
hazard-sdk/src/main/java/com/ozs/controller/upload/GeoHazardMonitorTokenController.java

@@ -7,20 +7,18 @@ import com.ozs.common.core.domain.Result;
 import com.ozs.common.core.domain.entity.SysUser;
 import com.ozs.common.utils.ApiTokenUtils;
 import com.ozs.common.utils.AppTokenUtils;
+import com.ozs.common.utils.AppendUtils;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.stateSecrets.SM4Utils;
+import com.ozs.jpush.JPushUtil;
 import com.ozs.service.entity.BaseCameraManagement;
 import com.ozs.service.entity.BaseDeviceDynamicManagement;
 import com.ozs.service.entity.MsgAlarm;
 import com.ozs.service.entity.MsgAlarmFrequency;
 import com.ozs.service.entity.SvcAddress;
+import com.ozs.service.entity.vo.MsgAlarmResp;
 import com.ozs.service.mapper.BaseUserMapper;
-import com.ozs.service.service.BaseCameraManagementService;
-import com.ozs.service.service.BaseDeviceDynamicManagementService;
-import com.ozs.service.service.BaseUserService;
-import com.ozs.service.service.MsgAlarmFrequencyService;
-import com.ozs.service.service.MsgAlarmService;
-import com.ozs.service.service.SvcAddressService;
+import com.ozs.service.service.*;
 import com.ozs.vo.ReqDeviceVo;
 import com.ozs.vo.ReqMsgAlarmVo;
 import com.ozs.vo.RespGeoHazardMonitorVo;
@@ -65,6 +63,57 @@ public class GeoHazardMonitorTokenController {
     private WebSocketServer webSocketServer;
     @Autowired
     private BaseUserService baseUserService;
+    @Resource
+    private BaseRailwayManagementService baseRailwayManagementService;
+
+    /**
+     * 测试app消息推送
+     *
+     * @return
+     */
+    @PostMapping("/appjiguang")
+    public String appjiguang(@RequestBody SvcAddress svcAddress) {
+        List<String> alias = new ArrayList<String>();
+        alias.add("sunhh");
+//        alias.add("wangyy");
+        //sendToRegistrationId(alias, "中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+        //sendToRegistrationId2(alias,"中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+//        sendToAllAndroid("中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
+        JPushUtil.sendToAllIos("中奖通知", "中奖通知", "恭喜你中了100个亿", "https://www.baidu.com");
+        // sendToAll("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+        //sendToAll2("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+        return "推送成功!";
+    }
+
+    /**
+     * 测试webSocket消息推送
+     *
+     * @return
+     */
+    @PostMapping("/webSocketT")
+    public String webSocketT(@RequestBody SvcAddress svcAddress) {
+        // 获取推送人ID列表
+//        Set<String> set = baseUserService.getUserIdList(baseCameraManagement.getCreateBy(), baseCameraManagement.getDeptId());
+//        String[] list = set.toArray(new String[set.size()]);
+        List<String> list = new ArrayList<>();
+        list.add("1");
+
+        // 初始化 -> 运行中 -> 成功或失败
+        try {
+            // 1、初始化
+            webSocketServer.sendMoreMessage(list, objStrString("消息推送", 1));
+            Thread.sleep(3 * 1000);
+            // 2、运行中
+            webSocketServer.sendMoreMessage(list, objStrString("消息推送", 2));
+            Thread.sleep(5 * 1000);
+            // 3、成功或失败
+            webSocketServer.sendMoreMessage(list, Math.random() * 10 > 5 ? objStrString("消息推送", 6) : objStrString("消息推送", 7));
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            throw new RuntimeException("构建失败");
+        }
+        return "推送成功!";
+    }
 
     /**
      * 获取web访问令牌
@@ -135,23 +184,37 @@ public class GeoHazardMonitorTokenController {
             BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(wrapper);
             // 获取推送人ID列表
             Set<String> set = baseUserService.getUserIdList(baseCameraManagement.getCreateBy(), baseCameraManagement.getDeptId());
-            // List<String> list = new ArrayList<>(set);
-            String[] list = set.toArray(new String[set.size()]);
+            List<String> list = new ArrayList<>(set);
+//            String[] list = set.toArray(new String[set.size()]);
+            MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+            String begin = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
+            String end = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
+            String endMile = begin + "-" + end;
+            msgAlarmResp.setBeginMile(endMile);
+            String mile = AppendUtils.stringAppend(baseCameraManagement.getInstallMile());
+            msgAlarmResp.setAlarmMile(mile);
+            String cameraCode = baseCameraManagement.getCameraCode();
+            String cameraName = baseRailwayManagementService.getCameraNameByCameraCode(cameraCode);
+            msgAlarmResp.setRailwayName(cameraName);
             // 推送消息reqMsgAlarmVo
             // 初始化 -> 运行中 -> 成功或失败
             try {
                 // 1、初始化
-                webSocketServer.sendMoreMessage(list, objStr(baseCameraManagement, 1));
+                webSocketServer.sendMoreMessage(list, objStr(msgAlarmResp, 1));
                 Thread.sleep(3 * 1000);
                 // 2、运行中
-                webSocketServer.sendMoreMessage(list, objStr(baseCameraManagement, 2));
+                webSocketServer.sendMoreMessage(list, objStr(msgAlarmResp, 2));
                 Thread.sleep(5 * 1000);
                 // 3、成功或失败
-                webSocketServer.sendMoreMessage(list, Math.random() * 10 > 5 ? objStr(baseCameraManagement, 6) : objStr(baseCameraManagement, 7));
+                webSocketServer.sendMoreMessage(list, Math.random() * 10 > 5 ? objStr(msgAlarmResp, 6) : objStr(msgAlarmResp, 7));
             } catch (InterruptedException e) {
                 e.printStackTrace();
                 throw new RuntimeException("构建失败");
             }
+            // app 消息推送
+            List<String> alias = new ArrayList<String>();
+            alias.add("sunhh");
+            JPushUtil.sendToRegistrationId(alias, "中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
             log.info("baseCameraManagement:{}", baseCameraManagement);
             if (ObjectUtils.isEmpty(reqMsgAlarmVo.getLineDir())) {
                 reqMsgAlarmVo.setLineDir(baseCameraManagement.getLineDir());
@@ -215,9 +278,16 @@ public class GeoHazardMonitorTokenController {
         }
     }
 
-    private String objStr(BaseCameraManagement baseCameraManagement, int status) {
+    private String objStr(MsgAlarmResp msgAlarmResp, int status) {
+        JSONObject obj = new JSONObject();
+        obj.put("pipelineId", msgAlarmResp); //流水线ID
+        obj.put("status", status);
+        return obj.toJSONString();
+    }
+
+    private String objStrString(String msgAlarmResp, int status) {
         JSONObject obj = new JSONObject();
-        obj.put("pipelineId", baseCameraManagement); //流水线ID
+        obj.put("pipelineId", msgAlarmResp); //流水线ID
         obj.put("status", status);
         return obj.toJSONString();
     }

+ 376 - 0
hazard-sdk/src/main/java/com/ozs/jpush/JPushUtil.java

@@ -0,0 +1,376 @@
+package com.ozs.jpush;
+
+import cn.jiguang.common.resp.APIConnectionException;
+import cn.jiguang.common.resp.APIRequestException;
+import cn.jpush.api.JPushClient;
+import cn.jpush.api.push.PushResult;
+import cn.jpush.api.push.model.Message;
+import cn.jpush.api.push.model.Options;
+import cn.jpush.api.push.model.Platform;
+import cn.jpush.api.push.model.PushPayload;
+import cn.jpush.api.push.model.audience.Audience;
+import cn.jpush.api.push.model.notification.AndroidNotification;
+import cn.jpush.api.push.model.notification.IosNotification;
+import cn.jpush.api.push.model.notification.Notification;
+import cn.jpush.api.schedule.ScheduleResult;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/13 11:19
+ */
+@Slf4j
+@Component
+public class JPushUtil {
+
+//    AppKey : 1712ced750e33d75d18cb577
+//    Master Secret : e4b8ba2eda2acd0f75177b88
+    private final static String APPKER = "1712ced750e33d75d18cb577";
+    private final static String MASTERSECRET = "e4b8ba2eda2acd0f75177b88";
+//    private final static String APPKER = "2a59ed096611fb4b82f08a44";
+//    private final static String MASTERSECRET = "a121413e4b89b0a4b3998fe0";
+
+    /**
+     * 推送给设备标识参数的用户
+     */
+    public static int sendToRegistrationId(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAllAliasAlertWithTitle(alias, notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 推送给设备标识参数的用户(定时)
+     */
+    public static int sendToRegistrationId2(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam, String time) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAllAliasAlertWithTitle(alias, notification_title, msg_title, msg_content, extrasparam);
+            ScheduleResult scheduleResult = jPushClient.createSingleSchedule("测试", time, pushPayload);
+            if (scheduleResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]ScheduleResult result is " + scheduleResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有安卓用户
+     */
+    public static int sendToAllAndroid(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAllAlertWithTitle(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有IOS用户
+     */
+    public static int sendToAllIos(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectIosAllAlertWithTitle(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有用户
+     */
+    public static int sendToAll(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAndIos(notification_title, msg_title, msg_content, extrasparam);
+            PushResult pushResult = jPushClient.sendPush(pushPayload);
+            if (pushResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]PushResult result is " + pushResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 发送给所有用户(定时推送)
+     */
+    public static int sendToAll2(String notification_title, String msg_title, String msg_content, String extrasparam, String time) {
+        JPushClient jPushClient = new JPushClient(MASTERSECRET, APPKER);
+        int result = 0;
+        try {
+            PushPayload pushPayload = JPushUtil.buildPushObjectAndroidAndIos(notification_title, msg_title, msg_content, extrasparam);
+            ScheduleResult scheduleResult = jPushClient.createSingleSchedule("测试", time, pushPayload);
+            if (scheduleResult.getResponseCode() == 200) {
+                result = 1;
+            }
+            log.info("[极光推送]scheduleResult result is " + scheduleResult);
+        } catch (APIConnectionException e) {
+            log.error("[极光推送]Connection error. Should retry later. ", e);
+        } catch (APIRequestException e) {
+            log.error("[极光推送]Error response from JPush server. Should review and fix it. ", e);
+            log.info("[极光推送]HTTP Status: " + e.getStatus());
+            log.info("[极光推送]Error Code: " + e.getErrorCode());
+            log.info("[极光推送]Error Message: " + e.getErrorMessage());
+        }
+        return result;
+    }
+
+    public static PushPayload buildPushObjectAndroidAndIos(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        return PushPayload.newBuilder()
+                .setPlatform(Platform.android_ios())
+                .setAudience(Audience.all())
+                .setNotification(Notification.newBuilder()
+                        .setAlert(msg_content)
+                        .addPlatformNotification(AndroidNotification.newBuilder()
+                                .setAlert(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build()
+                        )
+                        .addPlatformNotification(IosNotification.newBuilder()
+                                //传一个IosAlert对象,指定apns title、title、subtitle等
+                                .setAlert(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
+                                // .setContentAvailable(true)
+                                .build()
+                        )
+                        .build()
+                )
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msg_content)
+                        .setTitle(msg_title)
+                        .addExtra("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build()
+                )
+                .build();
+    }
+
+    private static PushPayload buildPushObjectAllAliasAlertWithTitle(List<String> alias, String notification_title, String msg_title, String msg_content, String extrasparam) {
+        //创建一个IosAlert对象,可指定APNs的alert、title等字段
+        //IosAlert iosAlert =  IosAlert.newBuilder().setTitleAndBody("title", "alert body").build();
+        return PushPayload.newBuilder()
+                //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
+                .setPlatform(Platform.all())
+                //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
+                .setAudience(Audience.registrationId(alias))
+//                .setAudience(Audience.registrationId(registrationId))
+                //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
+                .setNotification(Notification.newBuilder()
+                        //指定当前推送的android通知
+                        .addPlatformNotification(AndroidNotification.newBuilder()
+                                .setAlert(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build())
+                        //指定当前推送的iOS通知
+                        .addPlatformNotification(IosNotification.newBuilder()
+                                //传一个IosAlert对象,指定apns title、title、subtitle等
+                                .setAlert(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
+                                //取消此注释,消息推送时ios将无法在锁屏情况接收
+                                // .setContentAvailable(true)
+                                .build())
+                        .build())
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msg_content)
+                        .setTitle(msg_title)
+                        .addExtra("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天;
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+    private static PushPayload buildPushObjectAndroidAllAlertWithTitle(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        return PushPayload.newBuilder()
+                //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
+                .setPlatform(Platform.android())
+                //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
+                .setAudience(Audience.all())
+                //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
+                .setNotification(Notification.newBuilder()
+                        //指定当前推送的android通知
+                        .addPlatformNotification(AndroidNotification.newBuilder()
+                                .setAlert(msg_content)
+                                .setTitle(notification_title)
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                .build())
+                        .build()
+                )
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msg_content)
+                        .setTitle(msg_title)
+                        .addExtra("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+    private static PushPayload buildPushObjectIosAllAlertWithTitle(String notification_title, String msg_title, String msg_content, String extrasparam) {
+        return PushPayload.newBuilder()
+                //指定要推送的平台,all代表当前应用配置了的所有平台,也可以传android等具体平台
+                .setPlatform(Platform.ios())
+                //指定推送的接收对象,all代表所有人,也可以指定已经设置成功的tag或alias或该应应用客户端调用接口获取到的registration id
+                .setAudience(Audience.all())
+                //jpush的通知,android的由jpush直接下发,iOS的由apns服务器下发,Winphone的由mpns下发
+                .setNotification(Notification.newBuilder()
+                        //指定当前推送的android通知
+                        .addPlatformNotification(IosNotification.newBuilder()
+                                //传一个IosAlert对象,指定apns title、title、subtitle等
+                                .setAlert(msg_content)
+                                //直接传alert
+                                //此项是指定此推送的badge自动加1
+                                .incrBadge(1)
+                                //此字段的值default表示系统默认声音;传sound.caf表示此推送以项目里面打包的sound.caf声音来提醒,
+                                // 如果系统没有此音频则以系统默认声音提醒;此字段如果传空字符串,iOS9及以上的系统是无声音提醒,以下的系统是默认声音
+                                .setSound("sound.caf")
+                                //此字段为透传字段,不会显示在通知栏。用户可以通过此字段来做一些定制需求,如特定的key传要指定跳转的页面(value)
+                                .addExtra("url", extrasparam)
+                                //此项说明此推送是一个background推送,想了解background看:http://docs.jpush.io/client/ios_tutorials/#ios-7-background-remote-notification
+                                // .setContentAvailable(true)
+                                .build())
+                        .build()
+                )
+                //Platform指定了哪些平台就会像指定平台中符合推送条件的设备进行推送。 jpush的自定义消息,
+                // sdk默认不做任何处理,不会有通知提示。建议看文档http://docs.jpush.io/guideline/faq/的
+                // [通知与自定义消息有什么区别?]了解通知和自定义消息的区别
+                .setMessage(Message.newBuilder()
+                        .setMsgContent(msg_content)
+                        .setTitle(msg_title)
+                        .addExtra("url", extrasparam)
+                        .build())
+                .setOptions(Options.newBuilder()
+                        //此字段的值是用来指定本推送要推送的apns环境,false表示开发,true表示生产;对android和自定义消息无意义
+                        .setApnsProduction(true)
+                        //此字段是给开发者自己给推送编号,方便推送者分辨推送记录
+                        .setSendno(1)
+                        //此字段的值是用来指定本推送的离线保存时长,如果不传此字段则默认保存一天,最多指定保留十天,单位为秒
+                        .setTimeToLive(86400)
+                        .build())
+                .build();
+    }
+
+//    public static void main(String[] args) {
+//        List<String> alias = new ArrayList<String>();
+//        alias.add("sunhh");
+////        alias.add("wangyy");
+//        //sendToRegistrationId(alias, "中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+//        //sendToRegistrationId2(alias,"中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+////        sendToAllAndroid("中奖通知!!!!", "中奖通知!!!!!", "恭喜你中了100000000个亿!!!!", "https://www.baidu.com");
+//         sendToAllIos("中奖通知", "中奖通知", "恭喜你中了100个亿", "https://www.baidu.com");
+//         // sendToAll("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com");
+//        //sendToAll2("中奖通知", "中奖通知", "恭喜你中了100个亿!", "https://www.baidu.com","2021-07-14 17:54:00");
+//    }
+}

+ 1 - 1
hazard-sdk/src/main/java/com/ozs/websocket/WebSocketServer.java

@@ -112,7 +112,7 @@ public class WebSocketServer {
     }
 
     // 此为单点消息(多人)
-    public void sendMoreMessage(String[] userIds, String message) {
+    public void sendMoreMessage(List<String> userIds, String message) {
         for(String userId:userIds) {
             Session session = sessionPool.get(userId);
             if (session != null&&session.isOpen()) {