Browse Source

代码复制

sunhh 2 years ago
parent
commit
a0603edbe1
69 changed files with 6519 additions and 0 deletions
  1. 18 0
      business-service/pom.xml
  2. 151 0
      business-service/src/main/java/com/ozs/entity/BaseCameraManagement.java
  3. 65 0
      business-service/src/main/java/com/ozs/entity/BaseDept.java
  4. 72 0
      business-service/src/main/java/com/ozs/entity/BaseDeviceDynamicManagement.java
  5. 66 0
      business-service/src/main/java/com/ozs/entity/BaseRailwayManagement.java
  6. 75 0
      business-service/src/main/java/com/ozs/entity/BaseUser.java
  7. 28 0
      business-service/src/main/java/com/ozs/entity/CameraTree.java
  8. 239 0
      business-service/src/main/java/com/ozs/entity/MsgAlarm.java
  9. 97 0
      business-service/src/main/java/com/ozs/entity/MsgAlarmFrequency.java
  10. 78 0
      business-service/src/main/java/com/ozs/entity/MsgAppPush.java
  11. 75 0
      business-service/src/main/java/com/ozs/entity/MsgWebPush.java
  12. 50 0
      business-service/src/main/java/com/ozs/entity/SvcAddress.java
  13. 21 0
      business-service/src/main/java/com/ozs/entity/UserRegistrationid.java
  14. 151 0
      business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticDto.java
  15. 60 0
      business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticMonthDto.java
  16. 36 0
      business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticResVo.java
  17. 129 0
      business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticVo.java
  18. 57 0
      business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementDto.java
  19. 152 0
      business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementHomeVo.java
  20. 56 0
      business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementVo.java
  21. 94 0
      business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementVos.java
  22. 47 0
      business-service/src/main/java/com/ozs/entity/vo/BaseCameraResVo.java
  23. 32 0
      business-service/src/main/java/com/ozs/entity/vo/BaseRailwayManagementVo.java
  24. 34 0
      business-service/src/main/java/com/ozs/entity/vo/CameraTreeVo.java
  25. 29 0
      business-service/src/main/java/com/ozs/entity/vo/HistoricalAlarmVo.java
  26. 119 0
      business-service/src/main/java/com/ozs/entity/vo/MsgAlarmResp.java
  27. 94 0
      business-service/src/main/java/com/ozs/entity/vo/MsgAlarmVo.java
  28. 108 0
      business-service/src/main/java/com/ozs/entity/vo/MsgAppPushVo.java
  29. 25 0
      business-service/src/main/java/com/ozs/mapper/BaseCameraManagementMapper.java
  30. 22 0
      business-service/src/main/java/com/ozs/mapper/BaseDeptMapper.java
  31. 23 0
      business-service/src/main/java/com/ozs/mapper/BaseDeviceDynamicManagementMapper.java
  32. 98 0
      business-service/src/main/java/com/ozs/mapper/BaseDictDataMapper.java
  33. 20 0
      business-service/src/main/java/com/ozs/mapper/BaseRailwayManagementMapper.java
  34. 42 0
      business-service/src/main/java/com/ozs/mapper/BaseUserMapper.java
  35. 18 0
      business-service/src/main/java/com/ozs/mapper/MsgAlarmFrequencyMapper.java
  36. 53 0
      business-service/src/main/java/com/ozs/mapper/MsgAlarmMapper.java
  37. 39 0
      business-service/src/main/java/com/ozs/mapper/MsgAppPushMapper.java
  38. 30 0
      business-service/src/main/java/com/ozs/mapper/MsgWebPushMapper.java
  39. 18 0
      business-service/src/main/java/com/ozs/mapper/SvcAddressMapper.java
  40. 21 0
      business-service/src/main/java/com/ozs/mapper/UserRegistrationidMapper.java
  41. 39 0
      business-service/src/main/java/com/ozs/service/BaseCameraManagementService.java
  42. 19 0
      business-service/src/main/java/com/ozs/service/BaseDeviceDynamicManagementService.java
  43. 27 0
      business-service/src/main/java/com/ozs/service/BaseRailwayManagementService.java
  44. 24 0
      business-service/src/main/java/com/ozs/service/BaseUserService.java
  45. 16 0
      business-service/src/main/java/com/ozs/service/MsgAlarmFrequencyService.java
  46. 57 0
      business-service/src/main/java/com/ozs/service/MsgAlarmService.java
  47. 34 0
      business-service/src/main/java/com/ozs/service/MsgAppPushService.java
  48. 25 0
      business-service/src/main/java/com/ozs/service/MsgWebPushService.java
  49. 16 0
      business-service/src/main/java/com/ozs/service/SvcAddressService.java
  50. 16 0
      business-service/src/main/java/com/ozs/service/UserRegistrationidService.java
  51. 306 0
      business-service/src/main/java/com/ozs/service/impl/BaseCameraManagementServiceImpl.java
  52. 101 0
      business-service/src/main/java/com/ozs/service/impl/BaseDeviceDynamicManagementServiceImpl.java
  53. 105 0
      business-service/src/main/java/com/ozs/service/impl/BaseRailwayManagementServiceImpl.java
  54. 75 0
      business-service/src/main/java/com/ozs/service/impl/BaseUserServiceImpl.java
  55. 20 0
      business-service/src/main/java/com/ozs/service/impl/MsgAlarmFrequencyServiceImpl.java
  56. 141 0
      business-service/src/main/java/com/ozs/service/impl/MsgAlarmServiceImpl.java
  57. 84 0
      business-service/src/main/java/com/ozs/service/impl/MsgAppPushServiceImpl.java
  58. 137 0
      business-service/src/main/java/com/ozs/service/impl/MsgWebPushServiceImpl.java
  59. 20 0
      business-service/src/main/java/com/ozs/service/impl/SvcAddressServiceImpl.java
  60. 48 0
      business-service/src/main/java/com/ozs/service/impl/UserRegistrationidServiceImpl.java
  61. 66 0
      business-service/src/main/java/com/ozs/utils/CodeGet.java
  62. 10 0
      vehicle-admin/pom.xml
  63. 42 0
      vehicle-admin/src/main/java/com/ozs/core/config/CaneraConfig.java
  64. 121 0
      vehicle-admin/src/main/java/com/ozs/core/config/SwaggerConfig.java
  65. 592 0
      vehicle-admin/src/main/java/com/ozs/core/util/CameraUtil.java
  66. 80 0
      vehicle-admin/src/main/java/com/ozs/core/util/CmdCameraUtil.java
  67. 766 0
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java
  68. 287 0
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseRailwayManagementController.java
  69. 603 0
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java

+ 18 - 0
business-service/pom.xml

@@ -19,6 +19,24 @@
             <artifactId>base-common</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.0</version>
+        </dependency>
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 151 - 0
business-service/src/main/java/com/ozs/entity/BaseCameraManagement.java

@@ -0,0 +1,151 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 相机台账管理表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("相机台账管理表")
+public class BaseCameraManagement extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+
+    /**
+     * 通道编号
+     */
+    @Excel(name = "通道编号")
+    private String channel;
+
+    /**
+     * 所属工务段编码(单位id)
+     */
+    private Long deptId;
+
+    /**
+     * 行别(1上行2下行)
+     */
+    @Excel(name = "行别",readConverterExp = "1=上行,2=下行")
+    private Integer lineDir;
+
+    /**
+     * 监控相机安装里程位置
+     */
+    private Integer installMile;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    private Integer beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    private Integer endMile;
+
+    /**
+     * 监视相机经度
+     */
+    @Excel(name = "监视相机经度")
+    private String installLongitude;
+
+    /**
+     * 监视相机纬度
+     */
+    @Excel(name = "监视相机纬度")
+    private String installLatitude;
+
+    /**
+     * 线路编码
+     */
+    private String railwayCode;
+
+    /**
+     * 物联网卡号
+     */
+    @Excel(name = "物联网卡号")
+    private String cardNum;
+
+    /**
+     * 是否开启录像(1开启2不开启)
+     */
+    private Integer startRecording;
+
+    /**
+     * 录像接口返回的任务ID
+     */
+    private String taskId;
+
+
+    /**
+     * 监控相机安装里程位置字符串形式
+     */
+    @TableField(exist = false)
+    @Excel(name = "监控相机安装里程位置")
+    private String installMiles;
+
+    /**
+     * 监控范围开始里程位置字符串形式
+     */
+    @TableField(exist = false)
+    @Excel(name = "监控范围开始里程位置")
+    private String beginMiles;
+
+    /**
+     * 监控范围结束里程位置字符串形式
+     */
+    @TableField(exist = false)
+    @Excel(name = "监控范围结束里程位置")
+    private String endMiles;
+
+    /**
+     *线路名称
+     */
+    @TableField(exist = false)
+    @Excel(name = "线路名称")
+    private String railwayName;
+
+    /**
+     *所属工务段名称
+     */
+    @TableField(exist = false)
+    @Excel(name = "所属工务段名称")
+    private String deptName;
+
+    /**
+     *是否显示启用录像按钮(1显示2不显示)
+     */
+    @TableField(exist = false)
+    private Integer isStartRecording;
+}

+ 65 - 0
business-service/src/main/java/com/ozs/entity/BaseDept.java

@@ -0,0 +1,65 @@
+package com.ozs.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author Administrator
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("Base部门表")
+public class BaseDept implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 父部门ID
+     */
+    private Long parentId;
+
+    /**
+     * 祖级列表
+     */
+    private String ancestors;
+
+    private String deptName;
+
+    private Integer orderNum;
+
+    /**
+     * 负责人
+     */
+    private String leader;
+
+    private String phone;
+
+    private String email;
+
+    /**
+     * 部门状态:0正常,1停用
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 父部门名称
+     */
+    private String parentName;
+}

+ 72 - 0
business-service/src/main/java/com/ozs/entity/BaseDeviceDynamicManagement.java

@@ -0,0 +1,72 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.core.domain.BaseEntity;
+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;
+
+/**
+ * <p>
+ * 设备动态管理表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("设备动态管理表")
+public class BaseDeviceDynamicManagement extends BaseEntity implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机编码
+     */
+    private String cameraCode;
+
+    /**
+     * 剩余电量
+     */
+    private Integer electricity;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 66 - 0
business-service/src/main/java/com/ozs/entity/BaseRailwayManagement.java

@@ -0,0 +1,66 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路管理表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("线路管理表")
+public class BaseRailwayManagement extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 线路编码(四位数字)
+     */
+    @Excel(name = "编码")
+    private String railwayCode;
+
+    /**
+     * 线路类型(普铁/高铁 )
+     */
+    @Excel(name = "线路类型",readConverterExp = "1=高铁,2=普快")
+    private Integer railwayType;
+
+    /**
+     * 线路名称
+     */
+    @Excel(name = "线路名称")
+    private String railwayName;
+    /**
+     *线路类型名称
+     */
+    @TableField(exist = false)
+    private String railwayTypeName;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    private String remark;
+}

+ 75 - 0
business-service/src/main/java/com/ozs/entity/BaseUser.java

@@ -0,0 +1,75 @@
+package com.ozs.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author Administrator
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("Base用户表")
+public class BaseUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 用户ID */
+    private String userId;
+
+    /** 部门ID */
+    private Long deptId;
+
+    /** 用户账号 */
+    private String userName;
+
+    /** 真实姓名 */
+    private String nickName;
+
+    /** 用户邮箱 */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phoneNum;
+
+    /**
+     * 用户性别
+     */
+    private Integer sex;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private Integer delFlag;
+
+    /**
+     * 数据权限 1:本人;2:本部门;3:本部门及下级部门;4:本人及本级部门;5:本人及本部门及下级部门;6:全部
+     */
+    private Integer dataPermission;
+}

+ 28 - 0
business-service/src/main/java/com/ozs/entity/CameraTree.java

@@ -0,0 +1,28 @@
+package com.ozs.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 视频服务树形结构表 @author Administrator
+ */
+@Data
+@Builder
+public class CameraTree implements Serializable,Comparable<CameraTree> {
+
+    private static final long serialVersionUID = 1L;
+    String code;
+    String name;
+    boolean flay;
+    Integer mileage;
+    List<CameraTree> children;
+
+    @Override
+    public int compareTo(CameraTree o) {
+        int i =o.getName().compareTo(o.name);
+        return i;
+    }
+}

+ 239 - 0
business-service/src/main/java/com/ozs/entity/MsgAlarm.java

@@ -0,0 +1,239 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+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;
+import java.util.List;
+
+/**
+ * <p>
+ * 报警信息表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("报警信息表")
+public class MsgAlarm extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 报警唯一标识
+     */
+    @Excel(name = "报警唯一标识")
+    private String alarmId;
+
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+
+    /**
+     * 报警时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "报警时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date alarmTime;
+
+    /**
+     * 报警里程位置
+     */
+    private Integer alarmMile;
+
+    /**
+     * 报警内容
+     */
+    @Excel(name = "报警内容")
+    private String content;
+
+    /**
+     * 报警置信度(百分比)
+     */
+    private Integer alarmConfidence;
+
+    /**
+     * 报警行别(1上行2下行)
+     */
+    private Integer lineDir;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    @Excel(name = "报警病害属性")
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    @Excel(name = "报警图片地址")
+    private String imageUrl;
+
+    /**
+     * 解除人
+     */
+    private String releasedBy;
+
+    /**
+     * 解除时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "解除时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date releasedTime;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    private String remark;
+
+    /**
+     * 解除报警类型1真实报警2误报警
+     */
+    private Integer releasedType;
+
+    /**
+     * 解除原因
+     */
+    @Excel(name = "解除原因")
+    private String releasedReason;
+
+    /**
+     * 解除报警类型名称   1真实报警2误报警
+     */
+    @TableField(exist = false)
+    @Excel(name = "解除报警类型")
+    private String releasedTypeName;
+
+    /**
+     * 线路名称
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警线路")
+    private String railwayName;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    @TableField(exist = false)
+    private String beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    @TableField(exist = false)
+    private String endMile;
+
+    /**
+     * 报警里程位置字符串形式
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警里程位置")
+    private String alarmMiles;
+
+    /**
+     * 报警次数
+     */
+    @TableField(exist = false)
+    private Integer alarmCount;
+
+    /**
+     * 报警图片地址网络路径
+     */
+    @TableField(exist = false)
+    private List<String> imageUrls;
+
+    /**
+     * 解除人真实姓名
+     */
+    @TableField(exist = false)
+    @Excel(name = "解除人")
+    private String releasedByName;
+
+    /**
+     * 状态:1未读;2已读
+     */
+    @TableField(exist = false)
+    private Integer status;
+
+    /**
+     * 推送消息ID
+     */
+    @TableField(exist = false)
+    private String msgId;
+
+    /**
+     * 报警行别字符串(1上行2下行)
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警行别")
+    private String lineDirName;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警病害类型")
+    private String alarmTypeName;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    @Excel(name = "报警是否解除")
+    @TableField(exist = false)
+    private String  isLockName;
+}

+ 97 - 0
business-service/src/main/java/com/ozs/entity/MsgAlarmFrequency.java

@@ -0,0 +1,97 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.core.domain.BaseEntity;
+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;
+
+/**
+ * <p>
+ * 预报警频次表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-23
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("预报警频次表")
+public class MsgAlarmFrequency extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 报警时间
+     */
+    private Date alarmTime;
+
+    /**
+     * 报警内容
+     */
+    private String content;
+
+    /**
+     * 报警置信度(百分比)
+     */
+    private Integer alarmConfidence;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    private String imageUrl;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

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

@@ -0,0 +1,78 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.core.domain.BaseEntity;
+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;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("app推送报警信息记录表")
+public class MsgAppPush extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 唯一标识- uuid
+     */
+    private String pushId;
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 接收人
+     */
+    private String receiveBy;
+
+    /**
+     * 状态:0未读;1已读
+     */
+    private Integer status;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 75 - 0
business-service/src/main/java/com/ozs/entity/MsgWebPush.java

@@ -0,0 +1,75 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/15 14:31
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("Web推送报警信息记录表")
+public class MsgWebPush extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 唯一标识- uuid
+     */
+    private String pushId;
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 接收人
+     */
+    private String receiveBy;
+
+    /**
+     * 状态:0未读;1已读
+     */
+    private Integer status;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 50 - 0
business-service/src/main/java/com/ozs/entity/SvcAddress.java

@@ -0,0 +1,50 @@
+package com.ozs.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *报警消息访问令牌参数验证表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-28
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("报警消息访问令牌参数验证表")
+public class SvcAddress implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 授权类型,客户端模式(client_credentials)
+     */
+    private String grantType;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 客户端编号
+     */
+    private String clientId;
+
+    /**
+     * 客户端密钥
+     */
+    private String clientSecret;
+}

+ 21 - 0
business-service/src/main/java/com/ozs/entity/UserRegistrationid.java

@@ -0,0 +1,21 @@
+package com.ozs.entity;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/14 17:02
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("用户RegistrationID表")
+public class UserRegistrationid {
+    private String userId;
+    private String registrationId;
+}

+ 151 - 0
business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticDto.java

@@ -0,0 +1,151 @@
+package com.ozs.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/15
+ */
+@Data
+public class AlarmStatisticDto {
+    /**
+     * 报警唯一标识
+     */
+    @Excel(name = "报警唯一标识")
+    private String alarmId;
+
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+
+    /**
+     * 报警时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "报警时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date alarmTime;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMile;
+
+    /**
+     * 报警内容
+     */
+    @Excel(name = "报警内容")
+    private String content;
+
+    /**
+     * 报警置信度(百分比)
+     */
+    private Integer alarmConfidence;
+
+    /**
+     * 行别编码
+     */
+    private String lineDir;
+
+    /**
+     * 行别
+     */
+    @Excel(name = "行别")
+    private String lineDirValue;
+
+    /**
+     * 报警类型编码
+     */
+    private String alarmType;
+
+    /**
+     * 报警类型
+     */
+    @Excel(name = "报警类型")
+    private String alarmTypeValue;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    @Excel(name = "报警病害属性")
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    @Excel(name = "报警图片地址")
+    private String imageUrl;
+
+    /**
+     * 解除人
+     */
+    private String releasedBy;
+
+    /**
+     * 解除人真实姓名
+     */
+    @Excel(name = "解除人")
+    private String releasedByName;
+
+    /**
+     * 解除时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "解除时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date releasedTime;
+
+    /**
+     * 解除原因
+     */
+    @Excel(name = "解除原因")
+    private String releasedReason;
+
+    /**
+     * 解除报警类型1真实报警2误报警
+     */
+    private Integer releasedType;
+
+    /**
+     * 解除报警类型名称   1真实报警2误报警
+     */
+    @Excel(name = "解除报警类型")
+    private String releasedTypeName;
+
+    /**
+     * 线路名称
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警线路")
+    private String railwayName;
+
+    /**
+     * 报警里程位置字符串形式
+     */
+    @TableField(exist = false)
+    @Excel(name = "报警里程位置")
+    private String alarmMiles;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    @Excel(name = "报警是否解除")
+    private String isLockName;
+
+    /**
+     * 备注
+     */
+    @Excel(name = "备注")
+    private String remark;
+}

+ 60 - 0
business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticMonthDto.java

@@ -0,0 +1,60 @@
+package com.ozs.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ozs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/15
+ */
+@Data
+public class AlarmStatisticMonthDto {
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 线路名称
+     */
+    //@Excel(name = "线路名称")
+    private String railwayName;
+
+    /**
+     * 报警类型编码
+     */
+    private String alarmType;
+
+    /**
+     * 报警类型
+     */
+    //@Excel(name = "报警类型")
+    private String alarmTypeValue;
+
+    /**
+     * 报警月份
+     */
+    private Integer monthsta;
+    /**
+     * 报警月份字符串
+     */
+    @Excel(name = "报警日期")
+    private String monthstaString;
+
+    /**
+     * 报警次数
+     */
+    @Excel(name = "报警次数")
+    private Integer frequency;
+
+    /**
+     * 报警时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    //@Excel(name = "报警时间")
+    private Date alarmTime;
+}

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

@@ -0,0 +1,36 @@
+package com.ozs.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 currentYear;
+
+    /**
+     * 当前月份
+     */
+    private Integer currentMonth;
+
+    /**
+     * 灾害类型
+     */
+    private String alarmType;
+}

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

@@ -0,0 +1,129 @@
+package com.ozs.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 统计管理页面实体类
+ *
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Data
+public class AlarmStatisticVo {
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+
+    /**
+     * 线路名称
+     */
+    private String railwayName;
+
+    /**
+     * 相机编码
+     */
+    private String cameraCode;
+
+    /**
+     * 报警时间
+     */
+    @JsonFormat(
+            pattern = "yyyy-MM-dd HH:mm:ss"
+    )
+    private Date alarmTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 解除原因
+     */
+    private String releasedReason;
+
+    /**
+     * 解除报警类型1真实报警2误报警
+     */
+    private Integer releasedType;
+
+    /**
+     * 解除报警类型名称   1真实报警2误报警
+     */
+    private String releasedTypeName;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMile;
+
+    /**
+     * 报警内容
+     */
+    private String content;
+
+    /**
+     * 报警置信度(百分比)
+     */
+    private Integer alarmConfidence;
+
+    /**
+     * 报警行别(1上行2下行)
+     */
+    private Integer lineDir;
+
+    /**
+     * 报警行别字符串(1上行2下行)
+     */
+    private String lineDirName;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private String alarmTypeName;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    private String imageUrl;
+
+    /**
+     * 解除人
+     */
+    private String releasedBy;
+
+    /**
+     * 解除人
+     */
+    private String releasedByName;
+
+    /**
+     * 解除时间
+     */
+    private Date releasedTime;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private String isLockName;
+}

+ 57 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementDto.java

@@ -0,0 +1,57 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路和相机台账联合表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+public class BaseCameraManagementDto extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+     
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+    /**
+     * 所属工务段
+     */
+    @Excel(name = "所属工务段")
+    private String publicWorksSection;
+
+    /**
+     * 行别
+     */
+    @Excel(name = "行别")
+    private String lineDir;
+
+    /**
+     * 监控相机安装里程位置
+     */
+    @Excel(name = "监控相机安装里程位置")
+    private Integer installMile;
+    /**
+     * 线路名称
+     */
+    @Excel(name = "线路名称")
+    private String railwayName;
+    /**
+     * 线路编码(四位数字)
+     */
+    @Excel(name = "线路编码")
+    private String railwayCode;
+    
+}

+ 152 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementHomeVo.java

@@ -0,0 +1,152 @@
+package com.ozs.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 相机台账管理表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("相机台账管理表")
+public class BaseCameraManagementHomeVo extends BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+
+    /**
+     * 通道编号
+     */
+    @Excel(name = "通道编号")
+    private String channel;
+
+    /**
+     * 所属工务段编码(单位id)
+     */
+    @Excel(name = "所属工务段编码(单位id)")
+    private Long deptId;
+
+    /**
+     * 行别(1上行2下行)
+     */
+    @Excel(name = "行别")
+    private Integer lineDir;
+
+    /**
+     * 监控相机安装里程位置
+     */
+    @Excel(name = "监控相机安装里程位置")
+    private Integer installMile;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    @Excel(name = "监控范围开始里程位置")
+    private Integer beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    @Excel(name = "监控范围结束里程位置")
+    private Integer endMile;
+
+    /**
+     * 监视相机经度
+     */
+    @Excel(name = "监视相机经度")
+    private String installLongitude;
+
+    /**
+     * 监视相机纬度
+     */
+    @Excel(name = "监视相机纬度")
+    private String installLatitude;
+
+    /**
+     * 线路编码
+     */
+    @Excel(name = "线路编码")
+    private String railwayCode;
+
+    /**
+     * 物联网卡号
+     */
+    @Excel(name = "物联网卡号")
+    private String cardNum;
+
+    /**
+     * 是否开启录像(1开启2不开启)
+     */
+    @Excel(name = "是否开启录像")
+    private Integer startRecording;
+
+    /**
+     * 录像接口返回的任务ID
+     */
+    @Excel(name = "录像接口返回的任务ID")
+    private String taskId;
+
+
+    /**
+     * 监控相机安装里程位置字符串形式
+     */
+    @TableField(exist = false)
+    private String installMiles;
+
+    /**
+     * 监控范围开始里程位置字符串形式
+     */
+    @TableField(exist = false)
+    private String beginMiles;
+
+    /**
+     * 监控范围结束里程位置字符串形式
+     */
+    @TableField(exist = false)
+    private String endMiles;
+
+    /**
+     *线路名称
+     */
+    @TableField(exist = false)
+    private String railwayName;
+
+    /**
+     *所属工务段名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+}

+ 56 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementVo.java

@@ -0,0 +1,56 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 相机台账管理请求参数表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+public class BaseCameraManagementVo extends PageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 所属工务段
+     */
+    private Long deptId;
+
+    /**
+     * 行别
+     */
+    private Integer lineDir;
+
+
+    /**
+     * 线路编码
+     */
+    private String railwayCode;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    private Integer beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    private Integer endMile;
+
+    /**
+     * 监控范围开始里程位置字符串形式
+     */
+    private String beginMiles;
+
+    /**
+     * 监控范围结束里程位置字符串形式
+     */
+    private String endMiles;
+}

+ 94 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseCameraManagementVos.java

@@ -0,0 +1,94 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 相机台账管理表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel("相机台账管理表")
+public class BaseCameraManagementVos implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+   
+    /**
+     * 相机编码
+     */
+    @Excel(name = "相机编码")
+    private String cameraCode;
+
+    /**
+     * 通道编号
+     */
+    @Excel(name = "通道编号")
+    private String channel;
+
+    /**
+     * 行别(1上行2下行)
+     */
+    @Excel(name = "行别",readConverterExp = "1=上行,2=下行")
+    private Integer lineDir;
+
+    /**
+     * 监视相机经度
+     */
+    @Excel(name = "监视相机经度")
+    private String installLongitude;
+
+    /**
+     * 监视相机纬度
+     */
+    @Excel(name = "监视相机纬度")
+    private String installLatitude;
+    
+    /**
+     * 物联网卡号
+     */
+    @Excel(name = "物联网卡号")
+    private String cardNum;
+    
+    /**
+     *所属工务段名称
+     */
+    @Excel(name = "所属工务段名称")
+    private String deptName;
+
+    /**
+     * 监控相机安装里程位置
+     */
+    @Excel(name = "监控相机安装里程位置")
+    private Integer installMile;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    @Excel(name = "监控范围开始里程位置")
+    private Integer beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    @Excel(name = "监控范围结束里程位置")
+    private Integer endMile;
+
+    /**
+     *线路名称
+     */
+    @Excel(name = "线路名称")
+    private String railwayName;
+}

+ 47 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseCameraResVo.java

@@ -0,0 +1,47 @@
+package com.ozs.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 线路和相机台账联合表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class BaseCameraResVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 相机编码
+     */
+    @NotBlank(message = "相机编码不能为空")
+    private String cameraCode;
+
+    /**
+     * 开始时间
+     */
+    @NotNull(message = "开始时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "结束时间不能为空")
+    private Date entTime;
+}

+ 32 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseRailwayManagementVo.java

@@ -0,0 +1,32 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.annotation.Excel;
+import com.ozs.common.vo.PageVo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 线路管理请求参数表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Data
+public class BaseRailwayManagementVo extends PageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    /**
+     * 线路类型(普铁/高铁 )
+     */
+    private Integer railwayType;
+
+    /**
+     * 线路编码(四位数字)
+     */
+    @Excel(name = "编码")
+    private String railwayCode;
+}

+ 34 - 0
business-service/src/main/java/com/ozs/entity/vo/CameraTreeVo.java

@@ -0,0 +1,34 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/31 16:06
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CameraTreeVo extends PageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * 线路
+     */
+    private String railwayCode;
+
+    /**
+     * 行别
+     */
+    private Integer lineDir;
+
+    /**
+     * 里程位置
+     */
+    private Integer mils;
+}

+ 29 - 0
business-service/src/main/java/com/ozs/entity/vo/HistoricalAlarmVo.java

@@ -0,0 +1,29 @@
+package com.ozs.entity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Administrator
+ */
+@Data
+public class HistoricalAlarmVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 报警时间
+     */
+    private Long alarmTime;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+}

+ 119 - 0
business-service/src/main/java/com/ozs/entity/vo/MsgAlarmResp.java

@@ -0,0 +1,119 @@
+package com.ozs.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 报警信息表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Data
+public class MsgAlarmResp implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private long id;
+
+    /**
+     * web,app 唯一标识-uuid
+     */
+    private String pushId;
+
+    /**
+     * 线路名称
+     */
+    private String railwayName;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警行别(1上行2下行)
+     */
+    private Integer lineDir;
+    private String lineDirStr;
+
+    /**
+     * 所属工务段编码(单位id)
+     */
+    private Long deptId;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMile;
+
+    /**
+     * 里程范围
+     */
+    private String beginMile;
+
+    /**
+     * 监视相机经度纬度
+     */
+    private String installLongitude;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 解除时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date releasedTime;
+
+    /**
+     * 相机编码
+     */
+    private String cameraCode;
+
+    /**
+     * 报警时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date alarmTime;
+
+    /** 报警图片地址 */
+    private List<String> imageUrls;
+
+    /**
+     * 所属工务段编码(单位名称)
+     */
+    private String deptName;
+
+    /**
+     * 解除报警类型1真实报警2误报警
+     */
+    private Integer releasedType;
+
+    /**
+     * 解除原因
+     */
+    private String releasedReason;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    private String alarmAttr;
+
+    /**
+     * 报警内容
+     */
+    private String content;
+    /**
+     * 解除人真实姓名
+     */
+    private String releasedByName;
+}

+ 94 - 0
business-service/src/main/java/com/ozs/entity/vo/MsgAlarmVo.java

@@ -0,0 +1,94 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 报警信息请求参数表
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Data
+public class MsgAlarmVo extends PageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 线路编码
+     */
+    private String railwayCode;
+
+    /**
+     * 报警行别
+     */
+    private Integer lineDir;
+    
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警里程位置
+     */
+    private Integer alarmMile;
+
+    /**
+     * 监控范围开始里程位置
+     */
+    private Integer beginMile;
+
+    /**
+     * 监控范围结束里程位置
+     */
+    private Integer endMile;
+
+    /**
+     * 开始报警时间
+     */
+    private String beginAlarmTime;
+
+    /**
+     * 结束报警时间
+     */
+    private String endAlarmTime;
+
+    /**
+     * 报警是否解除 1已解除2未解除
+     */
+    private Integer isLock;
+
+    /**
+     * 用户userID
+     */
+    private String userId;
+
+    /**
+     * 状态:1未读;2已读
+     */
+    private Integer status;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMiles;
+    /**
+     * 监控范围开始里程位置字符串形式
+     */
+    private String beginMiles;
+
+    /**
+     * 监控范围结束里程位置字符串形式
+     */
+    private String endMiles;
+
+    /**
+     * 解除报警类型1真实报警2误报警
+     */
+    private Integer releasedType;
+}

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

@@ -0,0 +1,108 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import com.ozs.entity.BaseCameraManagement;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Data
+public class MsgAppPushVo extends PageVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键id
+     */
+    private String id;
+
+    /**
+     * 报警唯一标识
+     */
+    private String alarmId;
+    /**
+     * 线路名称
+     */
+    private String railwayName;
+    /**
+     * 线路类型
+     */
+    private Integer railwayType;
+
+    /**
+     * 报警行别(1上行2下行)
+     */
+    private Integer lineDir;
+
+    /**
+     * 报警里程位置
+     */
+    private String alarmMile;
+
+    /**
+     * 报警病害类型(目前只有1泥石流,后续可扩展使用)
+     */
+    private Integer alarmType;
+
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)
+     */
+    private String alarmAttr;
+
+    /**
+     * 报警图片地址
+     */
+    private String imageUrl;
+
+    /**
+     * 相机
+     */
+    private BaseCameraManagement baseCameraManagement;
+
+    public BaseCameraManagement getBaseCameraManagement() {
+        return baseCameraManagement;
+    }
+
+    public void setBaseCameraManagement(BaseCameraManagement baseCameraManagement) {
+        this.baseCameraManagement = baseCameraManagement;
+    }
+
+    /**
+     * 接收人
+     */
+    private String receiveBy;
+
+    /**
+     * 状态:1未读;2已读
+     */
+    private Integer status;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 25 - 0
business-service/src/main/java/com/ozs/mapper/BaseCameraManagementMapper.java

@@ -0,0 +1,25 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.vo.BaseCameraManagementVo;
+import com.ozs.entity.vo.MsgAlarmVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机台账管理表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Mapper
+public interface BaseCameraManagementMapper extends BaseMapper<BaseCameraManagement> {
+
+    List<BaseCameraManagement> selectCameraManagementList(BaseCameraManagementVo baseCameraManagementVo);
+
+    Integer countCamera(MsgAlarmVo msgAlarmVo);
+}

+ 22 - 0
business-service/src/main/java/com/ozs/mapper/BaseDeptMapper.java

@@ -0,0 +1,22 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.common.core.domain.entity.SysDept;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 部门管理 数据层
+ *
+ * @author hx
+ */
+@Mapper
+public interface BaseDeptMapper extends BaseMapper<SysDept> {
+    
+    /**
+     * 根据部门名称查询信息
+     * @param deptName
+     * @return
+     */
+    Long selectDeptByDeptName(@Param("deptName") String deptName);
+}

+ 23 - 0
business-service/src/main/java/com/ozs/mapper/BaseDeviceDynamicManagementMapper.java

@@ -0,0 +1,23 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.BaseDeviceDynamicManagement;
+import com.ozs.entity.vo.BaseCameraManagementDto;
+import com.ozs.entity.vo.CameraTreeVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 设备动态管理表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Mapper
+public interface BaseDeviceDynamicManagementMapper extends BaseMapper<BaseDeviceDynamicManagement> {
+
+    List<BaseCameraManagementDto> list(CameraTreeVo cameraTreeVo);
+}

+ 98 - 0
business-service/src/main/java/com/ozs/mapper/BaseDictDataMapper.java

@@ -0,0 +1,98 @@
+package com.ozs.mapper;
+
+import com.ozs.common.core.domain.entity.SysDictData;
+import icu.mhb.mybatisplus.plugln.base.mapper.JoinBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 字典表 数据层
+ *
+ * @author hx
+ */
+@Mapper
+public interface BaseDictDataMapper extends JoinBaseMapper<SysDictData> {
+    /**
+     * 根据条件分页查询字典数据
+     *
+     * @param dictData 字典数据信息
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataList(SysDictData dictData);
+
+    /**
+     * 根据字典类型查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
+     * 根据字典类型和字典键值查询字典数据信息
+     *
+     * @param dictType  字典类型
+     * @param dictValue 字典键值
+     * @return 字典标签
+     */
+    public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue);
+
+    /**
+     * 根据字典数据ID查询信息
+     *
+     * @param dictCode 字典数据ID
+     * @return 字典数据
+     */
+    public SysDictData selectDictDataById(Long dictCode);
+
+    /**
+     * 查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据
+     */
+    public int countDictDataByType(String dictType);
+
+    /**
+     * 通过字典ID删除字典数据信息
+     *
+     * @param dictCode 字典数据ID
+     * @return 结果
+     */
+    public int deleteDictDataById(Long dictCode);
+
+    /**
+     * 批量删除字典数据信息
+     *
+     * @param dictCodes 需要删除的字典数据ID
+     * @return 结果
+     */
+    public int deleteDictDataByIds(Long[] dictCodes);
+
+    /**
+     * 新增字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int insertDictData(SysDictData dictData);
+
+    /**
+     * 修改字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int updateDictData(SysDictData dictData);
+
+    /**
+     * 同步修改字典类型
+     *
+     * @param oldDictType 旧字典类型
+     * @param newDictType 新旧字典类型
+     * @return 结果
+     */
+    public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
+}

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

@@ -0,0 +1,20 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.BaseRailwayManagement;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *   线路管理表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Mapper
+public interface BaseRailwayManagementMapper extends BaseMapper<BaseRailwayManagement> {
+
+    String getCameraNameByCameraCode(@Param("cameraCode") String cameraCode);
+}

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

@@ -0,0 +1,42 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.BaseUser;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Administrator
+ */
+@Mapper
+public interface BaseUserMapper extends BaseMapper<BaseUser> {
+
+    Set<String> getUserIdList(@Param("userId") String userId);
+
+    Set<String> getUserIdByDeptId(@Param("deptId") Long deptId);
+
+    List<Long> getDeptId(@Param("deptId") Long deptId);
+
+    Set<String> getUserIdByDeptIds(@Param("deptList") List<Long> deptList);
+
+    Set<String> getUserIdByDeptIdAndUserId(@Param("userId") String userId, @Param("deptId") Long deptId);
+
+    Set<String> getUserIdListBy5(@Param("userId") String userId);
+
+    Set<String> getUserIdByDeptIdsBy5(@Param("deptList") List<Long> deptList);
+
+    Set<String> getUserIdList6();
+
+    Set<String> getUserIdsList();
+
+    BaseUser getUser(@Param("userId") String userId);
+    
+    BaseUser getUserName(@Param("userName") String userName);
+    
+    List<String> getRoleName(@Param("userId")String userId);
+
+    BaseUser getUserById(@Param("id")Long id);
+}

+ 18 - 0
business-service/src/main/java/com/ozs/mapper/MsgAlarmFrequencyMapper.java

@@ -0,0 +1,18 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.MsgAlarmFrequency;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 预报警频次表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-23
+ */
+@Mapper
+public interface MsgAlarmFrequencyMapper extends BaseMapper<MsgAlarmFrequency> {
+
+}

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

@@ -0,0 +1,53 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.vo.AlarmStatisticDto;
+import com.ozs.entity.vo.AlarmStatisticMonthDto;
+import com.ozs.entity.vo.AlarmStatisticVo;
+import com.ozs.entity.vo.MsgAlarmVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 报警信息表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Mapper
+public interface MsgAlarmMapper extends BaseMapper<MsgAlarm> {
+    //报警数据详情
+    List<AlarmStatisticVo> list(@Param("railwayCode") String railwayCode, @Param("currentYear") Integer currentYear, @Param("currentMonth") Integer currentMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
+
+    //报警数据详情导出数据集合
+    List<AlarmStatisticDto> listDto(@Param("railwayCode") String railwayCode, @Param("currentYear") Integer currentYear, @Param("currentMonth") Integer currentMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
+
+    //报警月统计数据
+    List<AlarmStatisticVo> listMonth(@Param("railwayCode") String railwayCode, @Param("currentYear") Integer currentYear, @Param("currentMonth") Integer currentMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
+
+    //报警月统计数据导出数据集合
+    List<AlarmStatisticMonthDto> listDtoMonth(@Param("railwayCode") String railwayCode, @Param("currentYear") Integer currentYear, @Param("currentMonth") Integer currentMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
+
+    //报警月统计数据导出数据集合(天)
+    List<AlarmStatisticMonthDto> listDtoDay(@Param("railwayCode") String railwayCode, @Param("currentYear") Integer currentYear, @Param("currentMonth") Integer currentMonth, @Param("alarmType") String alarmType, @Param("userId") String userId);
+
+    Integer selectCameraCode(@Param("cameraCode") String cameraCode);
+
+    MsgAlarm selectByCameraCode(@Param("cameraCode") String cameraCode);
+
+
+    List<MsgAlarm> selectMsgAlarmList(MsgAlarmVo msgAlarmVo);
+
+    MsgAlarm getByAlarmId(@Param("alarmId") String alarmId);
+
+    Integer countMsg(MsgAlarmVo msgAlarmVo);
+
+    Integer countJC(MsgAlarmVo msgAlarmVo);
+
+    Integer countWJC(MsgAlarmVo msgAlarmVo);
+}

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

@@ -0,0 +1,39 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgAppPush;
+import com.ozs.entity.vo.MsgAlarmVo;
+import com.ozs.entity.vo.MsgAppPushVo;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Mapper
+public interface MsgAppPushMapper extends BaseMapper<MsgAppPush> {
+    /**
+     * app推送报警信息记录
+     *
+     * @param status
+     * @param
+     * @return
+     */
+    List<MsgAppPushVo> alarmPushMsg(MsgAppPushVo msgAppPushVo);
+
+    /**
+     * app推送报警信息记录修改状态
+     *
+     * @param status
+     * @param id
+     * @param updateBy
+     * @return
+     */
+    int update(MsgAppPush msgAppPush);
+
+    List<MsgAlarm> messageMoreApp(MsgAlarmVo msgAlarmVo);
+}

+ 30 - 0
business-service/src/main/java/com/ozs/mapper/MsgWebPushMapper.java

@@ -0,0 +1,30 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgWebPush;
+import com.ozs.entity.vo.MsgAlarmVo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/15 14:35
+ */
+@Mapper
+public interface MsgWebPushMapper extends BaseMapper<MsgWebPush> {
+    Integer webAlarmNum(@Param("userId") String userId);
+
+    List<MsgAlarm> webAlarm(@Param("userId") String userId);
+
+    List<MsgAlarm> messageMore(MsgAlarmVo msgAlarmVo);
+
+    Map<String, Integer> messageMoreNum(@Param("userId") String userId);
+
+    int updateByPushId(MsgWebPush msgWebPush);
+
+    int readAll(@Param("userId") String userId);
+}

+ 18 - 0
business-service/src/main/java/com/ozs/mapper/SvcAddressMapper.java

@@ -0,0 +1,18 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.SvcAddress;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 报警消息访问令牌参数验证表 Mapper 接口
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-28
+ */
+@Mapper
+public interface SvcAddressMapper extends BaseMapper<SvcAddress> {
+
+}

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

@@ -0,0 +1,21 @@
+package com.ozs.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ozs.entity.UserRegistrationid;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/14 17:10
+ */
+@Mapper
+public interface UserRegistrationidMapper extends BaseMapper<UserRegistrationid> {
+    int updateRegistrationID(UserRegistrationid userRegistrationid);
+
+    int addRegistrationID(UserRegistrationid userRegistrationid);
+
+    List<String> selectRegistrationID(@Param("userIdList") List<String> userIdList);
+}

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

@@ -0,0 +1,39 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.vo.BaseCameraManagementHomeVo;
+import com.ozs.entity.vo.BaseCameraManagementVo;
+import com.ozs.entity.vo.BaseCameraManagementVos;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 相机台账管理表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+public interface BaseCameraManagementService extends IService<BaseCameraManagement> {
+    /**
+     * 相机台账管理表导入
+     * @param accountManageList
+     * @param updateSupport
+     * @param userId
+     * @return
+     */
+    String importBaseAccountManagement(List<BaseCameraManagementVos> accountManageList, boolean updateSupport, String userId);
+
+    List<BaseCameraManagementHomeVo> selectCameraAll(BaseCameraManagementVo baseCameraManagementVo);
+    
+//    List<String> getUserIds(String userId);
+
+    List<String> getUserIdList(String userId);
+
+    IPage<BaseCameraManagement> queryPage(BaseCameraManagementVo baseCameraManagementVo);
+
+    List<BaseCameraManagement> baseCameraManagementList(BaseCameraManagementVo baseCameraManagementVo);
+}

+ 19 - 0
business-service/src/main/java/com/ozs/service/BaseDeviceDynamicManagementService.java

@@ -0,0 +1,19 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.BaseDeviceDynamicManagement;
+import com.ozs.entity.CameraTree;
+import com.ozs.entity.vo.CameraTreeVo;
+
+/**
+ * <p>
+ * 设备动态管理表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+public interface BaseDeviceDynamicManagementService extends IService<BaseDeviceDynamicManagement> {
+
+    CameraTree cameraTree(CameraTreeVo cameraTreeVo);
+}

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

@@ -0,0 +1,27 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.BaseRailwayManagement;
+
+import java.util.List;
+
+/**
+ * <p>
+ *   线路管理表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+public interface BaseRailwayManagementService extends IService<BaseRailwayManagement> {
+    /**
+     * 线路管理表导入
+     * @param accountManageList
+     * @param updateSupport
+     * @param userId
+     * @return
+     */
+    String importBaseLineManagement(List<BaseRailwayManagement> accountManageList, boolean updateSupport,String userId);
+
+    String getCameraNameByCameraCode(String cameraCode);
+}

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

@@ -0,0 +1,24 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.BaseUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Administrator
+ */
+public interface BaseUserService extends IService<BaseUser> {
+
+    Set<String> getUserIdList(String createBy, Long deptId);
+
+    BaseUser getUser(String userId);
+
+    BaseUser getUserById(Long id);
+
+    BaseUser getUserName(@Param("userName") String userName);
+
+    List<String> getRoleName(@Param("userId")String userId);
+}

+ 16 - 0
business-service/src/main/java/com/ozs/service/MsgAlarmFrequencyService.java

@@ -0,0 +1,16 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.MsgAlarmFrequency;
+
+/**
+ * <p>
+ * 预报警频次表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-23
+ */
+public interface MsgAlarmFrequencyService extends IService<MsgAlarmFrequency> {
+
+}

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

@@ -0,0 +1,57 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.vo.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 报警信息表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+public interface MsgAlarmService extends IService<MsgAlarm> {
+    //web数据统计 报警数据详情
+    List<AlarmStatisticVo> list(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, Integer pageNum, Integer pageSize, String userId);
+
+    IPage listToPage(List list, int pageNum, int pageSize);
+
+    //web数据统计 报警月统计数据
+    List<AlarmStatisticMonthDto> getCount(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, String userId);
+
+    //web数据统计 报警月统计数据(天)
+    List<AlarmStatisticMonthDto> getDayCount(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, String userId);
+
+    //报警数据详情导出数据集合
+    List<AlarmStatisticDto> exportExcel(AlarmStatisticResVo alarmStatisticResVo, String userId);
+
+    //报警数据详情导出数据集合(天)
+    List<AlarmStatisticMonthDto> exportDayExcel(AlarmStatisticResVo alarmStatisticResVo, String userId);
+
+    //web数据统计 报警月统计数据导出
+    List<AlarmStatisticMonthDto> exportExcelMonth(AlarmStatisticResVo alarmStatisticResVo, String userId) throws Exception;
+
+    /**
+     * 通过相机编码查询未解除预警信息
+     *
+     * @param cameraCode
+     * @return
+     */
+    MsgAlarm selectByCameraCode(String cameraCode);
+
+    IPage<MsgAlarm> queryPage(MsgAlarmVo msgAlarmVo);
+
+    MsgAlarm getByAlarmId(String alarmId);
+
+    Map<String, Integer> statisticsNum(MsgAlarmVo msgAlarmVo);
+
+    Integer appAlarmNum(MsgAlarmVo msgAlarmVo);
+
+    List<MsgAlarm> msgAlarmList(MsgAlarmVo msgAlarmVo);
+}

+ 34 - 0
business-service/src/main/java/com/ozs/service/MsgAppPushService.java

@@ -0,0 +1,34 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgAppPush;
+import com.ozs.entity.vo.MsgAlarmVo;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+public interface MsgAppPushService extends IService<MsgAppPush> {
+    /**
+     * app推送报警信息记录
+     *
+     * @param msgAppPushVo
+     * @param
+     * @return
+     */
+    IPage<MsgAlarm> alarmPushMsg(MsgAlarmVo msgAlarmVo);
+
+    /**
+     * app推送报警信息记录修改状态
+     *
+     * @param status
+     * @param id
+     * @param updateBy
+     * @return
+     */
+    int update(MsgAppPush msgAppPush);
+
+}

+ 25 - 0
business-service/src/main/java/com/ozs/service/MsgWebPushService.java

@@ -0,0 +1,25 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgWebPush;
+import com.ozs.entity.vo.MsgAlarmVo;
+
+import java.util.Map;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/15 14:33
+ */
+public interface MsgWebPushService extends IService<MsgWebPush> {
+    int read(MsgWebPush msgWebPush);
+
+    Map webAlarm(String userId);
+
+    IPage<MsgAlarm> messageMore(MsgAlarmVo msgAlarmVo);
+
+    Map<String, Integer> messageMoreNum(String userId);
+
+    int readAll(String userId);
+}

+ 16 - 0
business-service/src/main/java/com/ozs/service/SvcAddressService.java

@@ -0,0 +1,16 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.SvcAddress;
+
+/**
+ * <p>
+ * 报警消息访问令牌参数验证表 服务类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-28
+ */
+public interface SvcAddressService extends IService<SvcAddress> {
+
+}

+ 16 - 0
business-service/src/main/java/com/ozs/service/UserRegistrationidService.java

@@ -0,0 +1,16 @@
+package com.ozs.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.UserRegistrationid;
+
+import java.util.List;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/14 17:07
+ */
+public interface UserRegistrationidService extends IService<UserRegistrationid> {
+    Integer addRegistrationID(UserRegistrationid userRegistrationid);
+
+    List<String> selectRegistrationID(List<String> userIdList);
+}

+ 306 - 0
business-service/src/main/java/com/ozs/service/impl/BaseCameraManagementServiceImpl.java

@@ -0,0 +1,306 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.common.utils.bean.BeanValidators;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.BaseDeviceDynamicManagement;
+import com.ozs.entity.BaseRailwayManagement;
+import com.ozs.entity.BaseUser;
+import com.ozs.entity.vo.BaseCameraManagementHomeVo;
+import com.ozs.entity.vo.BaseCameraManagementVo;
+import com.ozs.entity.vo.BaseCameraManagementVos;
+import com.ozs.mapper.*;
+import com.ozs.service.BaseCameraManagementService;
+import com.ozs.service.BaseRailwayManagementService;
+import com.ozs.service.BaseUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+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>
+ * 相机台账管理表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Service
+public class BaseCameraManagementServiceImpl extends ServiceImpl<BaseCameraManagementMapper, BaseCameraManagement> implements BaseCameraManagementService {
+    public static final String PATTERN = "^[0-9]*$";
+    @Autowired
+    protected Validator validator;
+    @Autowired
+    BaseDeviceDynamicManagementMapper baseDeviceDynamicManagementMapper;
+    @Resource
+    private BaseCameraManagementMapper baseCameraManagementMapper;
+    @Resource
+    private BaseUserService baseUserService;
+    @Resource
+    private BaseUserMapper baseUserMapper;
+    @Resource
+    private MsgAlarmMapper msgAlarmMapper;
+    @Autowired
+    private BaseDeptMapper baseDeptMapper;
+    @Autowired
+    private BaseRailwayManagementService baseRailwayManagementService;
+
+    /**
+     * 相机台账管理表导入
+     *
+     * @param accountManageList 相机台账列表
+     * @param updateSupport     是否更新支持,如果已存在,则进行更新数据
+     * @return
+     */
+    @Override
+    public String importBaseAccountManagement(List<BaseCameraManagementVos> accountManageList, boolean updateSupport, String userId) {
+        if (StringUtils.isNull(accountManageList) || accountManageList.size() == 0) {
+            throw new ServiceException("导入相机台账列表信息不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (BaseCameraManagementVos cameraManagementVos : accountManageList) {
+            try {
+                BaseCameraManagement accountManagement = new BaseCameraManagement();
+                BeanUtils.copyProperties(cameraManagementVos, accountManagement);
+                // 判断相机编码是否存在
+                LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+                if (!ObjectUtils.isEmpty(accountManagement.getCameraCode())) {
+                    lw.eq(BaseCameraManagement::getCameraCode, accountManagement.getCameraCode());
+                }
+                BaseCameraManagement baseAccountManagement = baseCameraManagementMapper.selectOne(lw);
+                if (ObjectUtils.isEmpty(baseAccountManagement)) {
+                    BeanValidators.validateWithException(validator, accountManagement);
+                    accountManagement.setUpdateBy(userId);
+                    accountManagement.setCreateBy(userId);
+                    Long deptId = baseDeptMapper.selectDeptByDeptName(accountManagement.getDeptName());
+                    log.debug(accountManagement.getDeptName() + "主键id:" + deptId);
+                    if (!ObjectUtils.isEmpty(deptId)) {
+                        accountManagement.setDeptId(deptId);
+                        LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                        if (!ObjectUtils.isEmpty(accountManagement.getRailwayName())) {
+                            queryWrapper.eq(BaseRailwayManagement::getRailwayName, accountManagement.getRailwayName());
+                        }
+                        BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+                        if (!ObjectUtils.isEmpty(baseRailwayManagement)) {
+                            if (!accountManagement.getBeginMile().toString().matches(PATTERN) || !accountManagement.getInstallMile().toString().matches(PATTERN) || !accountManagement.getEndMile().toString().matches(PATTERN)) {
+                                failureNum++;
+                                failureMsg.append(failureNum + "、相机编码为: " + accountManagement.getCameraCode() + "的数据,里程位置填写格式不正确,请填写数字");
+                            } else {
+                                accountManagement.setRailwayCode(baseRailwayManagement.getRailwayCode());
+                                accountManagement.setInstallMile(accountManagement.getInstallMile() * 1000);
+                                accountManagement.setEndMile(accountManagement.getEndMile() * 1000);
+                                accountManagement.setBeginMile(accountManagement.getBeginMile() * 1000);
+                                if (accountManagement.getBeginMile() < accountManagement.getEndMile()) {
+                                    baseCameraManagementMapper.insert(accountManagement);
+                                    BaseDeviceDynamicManagement baseDeviceDynamicManagement = new BaseDeviceDynamicManagement();
+                                    baseDeviceDynamicManagement.setCameraCode(accountManagement.getCameraCode());
+                                    baseDeviceDynamicManagement.setUpdateBy(userId);
+                                    baseDeviceDynamicManagement.setCreateBy(userId);
+                                    baseDeviceDynamicManagementMapper.insert(baseDeviceDynamicManagement);
+                                    successNum++;
+                                    successMsg.append(successNum + "、相机编码 " + accountManagement.getCameraCode() + " 导入成功");
+                                } else {
+                                    failureNum++;
+                                    failureMsg.append(failureNum + "、相机编码为: " + accountManagement.getCameraCode() + "的数据,监控范围开始里程位置不能大于监控范围结束里程位置");
+                                }
+                            }
+                        } else {
+                            failureNum++;
+                            String msg = failureNum + "、相机所属线路名称 " + accountManagement.getRailwayName() + "不存在, 导入失败:";
+                            failureMsg.append(msg);
+                            log.error(msg);
+                        }
+                    } else {
+                        failureNum++;
+                        String msg = failureNum + "、相机所属工务段 " + accountManagement.getDeptName() + "不存在, 导入失败:";
+                        failureMsg.append(msg);
+                        log.error(msg);
+                    }
+                } else if (updateSupport) {
+                    BeanValidators.validateWithException(validator, accountManagement);
+                    accountManagement.setUpdateBy(userId);
+                    Long deptId = baseDeptMapper.selectDeptByDeptName(accountManagement.getDeptName());
+                    log.debug(accountManagement.getDeptName() + "主键id:" + deptId);
+                    if (!ObjectUtils.isEmpty(deptId)) {
+                        accountManagement.setDeptId(deptId);
+                        baseCameraManagementMapper.update(accountManagement, lw);
+                        LambdaQueryWrapper<BaseDeviceDynamicManagement> wrapper = new LambdaQueryWrapper<BaseDeviceDynamicManagement>();
+                        if (!ObjectUtils.isEmpty(baseAccountManagement.getCameraCode())) {
+                            wrapper.eq(BaseDeviceDynamicManagement::getCameraCode, baseAccountManagement.getCameraCode());
+                        }
+                        BaseDeviceDynamicManagement baseDeviceDynamicManagement = baseDeviceDynamicManagementMapper.selectOne(wrapper);
+                        baseDeviceDynamicManagement.setCameraCode(accountManagement.getCameraCode());
+                        baseDeviceDynamicManagement.setUpdateBy(userId);
+                        baseDeviceDynamicManagementMapper.updateById(baseDeviceDynamicManagement);
+                        successNum++;
+                        successMsg.append(successNum + "、相机编码 " + accountManagement.getCameraCode() + " 更新成功");
+                    } else {
+                        failureNum++;
+                        String msg = failureNum + "、相机所属工务段 " + accountManagement.getDeptName() + "不存在, 导入失败:";
+                        failureMsg.append(msg);
+                        log.error(msg);
+                    }
+
+                } else {
+                    failureNum++;
+                    failureMsg.append(failureNum + "、相机编码 " + accountManagement.getCameraCode() + " 已存在");
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = failureNum + "、相机编码 " + cameraManagementVos.getCameraCode() + " 导入失败:";
+                failureMsg.append(msg);
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条。");
+        }
+        return successMsg.toString();
+    }
+
+    /**
+     * 获取相机列表+数据权限
+     *
+     * @return
+     */
+    @Override
+    public List<BaseCameraManagementHomeVo> selectCameraAll(BaseCameraManagementVo baseCameraManagementVo) {
+//        List<String> userIdList = getUserIds(userId);
+//        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+//        if (!StringUtils.isEmpty(userIdList)) {
+//            lw.in(BaseCameraManagement::getCreateBy, userIdList);
+//        }
+//        List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementMapper.selectList(lw);
+        List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementMapper.selectCameraManagementList(baseCameraManagementVo);
+        List<BaseCameraManagementHomeVo> allListVo = BeanUtils.entityListToVOList(baseCameraManagementList, BaseCameraManagementHomeVo.class);
+        for (BaseCameraManagementHomeVo baseCameraManagementHomeVo : allListVo) {
+            Integer isLock = msgAlarmMapper.selectCameraCode(baseCameraManagementHomeVo.getCameraCode());
+            baseCameraManagementHomeVo.setIsLock(isLock != null ? isLock : 1);
+        }
+        return allListVo;
+    }
+
+    /**
+     * 根据当前登陆用户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;
+    }*/
+
+
+    /**
+     * 根据当前登陆用户ID 查询当前用户数据权限
+     *
+     * @param userId
+     * @return
+     */
+    public List<String> getUserIdList(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.getUserIdsList();
+        }
+        List<String> list = new ArrayList<>(set);
+        return list;
+    }
+
+    @Override
+    public IPage<BaseCameraManagement> queryPage(BaseCameraManagementVo baseCameraManagementVo) {
+        int pageNum = Integer.parseInt(baseCameraManagementVo.getPageNum().toString());
+        int pageSize = Integer.parseInt(baseCameraManagementVo.getPageSize().toString());
+        com.github.pagehelper.Page<BaseCameraManagement> page = PageHelper.startPage(pageNum, pageSize)
+                .doSelectPage(() -> baseCameraManagementMapper.selectCameraManagementList(baseCameraManagementVo));
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<BaseCameraManagement> pageR =
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize);
+        pageR.setRecords(page.getResult());
+        pageR.setTotal(page.getTotal());
+        return pageR;
+    }
+
+    @Override
+    public List<BaseCameraManagement> baseCameraManagementList(BaseCameraManagementVo baseCameraManagementVo) {
+        return baseCameraManagementMapper.selectCameraManagementList(baseCameraManagementVo);
+    }
+}

+ 101 - 0
business-service/src/main/java/com/ozs/service/impl/BaseDeviceDynamicManagementServiceImpl.java

@@ -0,0 +1,101 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.common.utils.AppendUtils;
+import com.ozs.entity.BaseDeviceDynamicManagement;
+import com.ozs.entity.CameraTree;
+import com.ozs.entity.vo.BaseCameraManagementDto;
+import com.ozs.entity.vo.CameraTreeVo;
+import com.ozs.mapper.BaseDeviceDynamicManagementMapper;
+import com.ozs.service.BaseDeviceDynamicManagementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 设备动态管理表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Service
+public class BaseDeviceDynamicManagementServiceImpl extends ServiceImpl<BaseDeviceDynamicManagementMapper, BaseDeviceDynamicManagement> implements BaseDeviceDynamicManagementService {
+    @Autowired
+    BaseDeviceDynamicManagementMapper baseDeviceDynamicManagementMapper;
+
+    @Override
+    public CameraTree cameraTree(CameraTreeVo cameraTreeVo) {
+
+
+        //1 父
+        CameraTree cameraTree = CameraTree.builder()
+                .name("相机树")
+                .code("0")
+                .flay(false)
+                .children(new ArrayList<>())
+                .build();
+        Map<String, CameraTree> map = new HashMap<>();
+        List<BaseCameraManagementDto> list = baseDeviceDynamicManagementMapper.list(cameraTreeVo);
+        if (list.size() > 0) {
+            for (BaseCameraManagementDto o : list) {
+                // 线路
+                CameraTree build = CameraTree.builder()
+                        .code(o.getRailwayCode())
+                        .name(o.getRailwayName())
+                        .flay(true)
+                        .children(new ArrayList<>())
+                        .build();
+
+                if (!cameraTree.getChildren().stream()
+                        .map(CameraTree::getCode)
+                        .collect(Collectors.toList())
+                        .contains(build.getCode())) {
+                    cameraTree.getChildren().add(build);
+                    map.put(o.getRailwayCode(), build);
+                }
+
+                // 里程
+                String mils = AppendUtils.stringAppend(o.getInstallMile());
+                CameraTree build1 = CameraTree.builder()
+                        .code(mils + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"))
+                        .name(mils + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"))
+                        .flay(true)
+                        .mileage(o.getInstallMile())
+                        .children(new ArrayList<>())
+                        .build();
+
+
+                if (!ObjectUtils.isEmpty(map.get(o.getRailwayCode()))) {
+                    CameraTree cameraTree1 = map.get(o.getInstallMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"));
+                    if (ObjectUtils.isEmpty(cameraTree1)) {
+                        map.put(o.getInstallMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"), build1);
+                        map.get(o.getRailwayCode()).getChildren().add(build1);
+                    }
+                }
+
+                // 摄像头
+                CameraTree build2 = CameraTree.builder()
+                        .code(o.getCameraCode())
+                        .name(o.getCameraCode())
+                        .flay(true)
+                        .children(new ArrayList<>())
+                        .build();
+
+
+                if (!ObjectUtils.isEmpty(map.get(o.getInstallMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行")))) {
+                    map.get(o.getInstallMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行")).getChildren().add(build2);
+                }
+            }
+        }
+
+        return cameraTree;
+    }
+}

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

@@ -0,0 +1,105 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.bean.BeanValidators;
+import com.ozs.entity.BaseRailwayManagement;
+import com.ozs.mapper.BaseRailwayManagementMapper;
+import com.ozs.service.BaseRailwayManagementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.Resource;
+import javax.validation.Validator;
+import java.util.List;
+
+/**
+ * <p>
+ * 线路管理表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@Service
+public class BaseRailwayManagementServiceImpl extends ServiceImpl<BaseRailwayManagementMapper, BaseRailwayManagement> implements BaseRailwayManagementService {
+
+    @Resource
+    BaseRailwayManagementMapper baseRailwayManagementMapper;
+    @Autowired
+    protected Validator validator;
+
+    /**
+     * 导出线路管理表信息
+     *
+     * @param accountManageList 线路管理表信息列表
+     * @param updateSupport     是否更新支持,如果已存在,则进行更新数据
+     * @return
+     */
+    @Override
+    public String importBaseLineManagement(List<BaseRailwayManagement> accountManageList, boolean updateSupport, String userId) {
+        if (com.ozs.common.utils.StringUtils.isNull(accountManageList) || accountManageList.size() == 0) {
+            throw new ServiceException("导入线路管理信息不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (BaseRailwayManagement railwayManagement : accountManageList) {
+            try {
+                LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(railwayManagement.getRailwayName())) {
+                    wrapper.eq(BaseRailwayManagement::getRailwayName, railwayManagement.getRailwayName());
+                }
+                BaseRailwayManagement railwayManagement1 = baseRailwayManagementMapper.selectOne(wrapper);
+                if (ObjectUtils.isEmpty(railwayManagement1)) {
+                    // 判断相机编码是否存在
+                    LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+                    if (!ObjectUtils.isEmpty(railwayManagement.getRailwayCode())) {
+                        lw.eq(BaseRailwayManagement::getRailwayCode, railwayManagement.getRailwayCode());
+                    }
+                    BaseRailwayManagement baseLineManagement = baseRailwayManagementMapper.selectOne(lw);
+                    if (ObjectUtils.isEmpty(baseLineManagement)) {
+                        BeanValidators.validateWithException(validator, railwayManagement);
+                        railwayManagement.setUpdateBy(userId);
+                        railwayManagement.setCreateBy(userId);
+                        baseRailwayManagementMapper.insert(railwayManagement);
+                        successNum++;
+                        successMsg.append(successNum + "、线路编码 " + railwayManagement.getRailwayCode() + " 导入成功");
+                    } else if (updateSupport) {
+                        BeanValidators.validateWithException(validator, railwayManagement);
+                        railwayManagement.setUpdateBy(userId);
+                        baseRailwayManagementMapper.update(railwayManagement, lw);
+                        successNum++;
+                        successMsg.append(successNum + "、线路编码 " + railwayManagement.getRailwayCode() + " 更新成功");
+                    } else {
+                        failureNum++;
+                        failureMsg.append(failureNum + "、线路编码 " + railwayManagement.getRailwayCode() + " 已存在");
+                    }
+                } else {
+                    failureNum++;
+                    failureMsg.append( failureNum + "、线路名称 " + railwayManagement.getRailwayName() + " 已存在");
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = failureNum + "、线路编码 " + railwayManagement.getRailwayCode() + " 导入失败:";
+                failureMsg.append(msg);
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new ServiceException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条。");
+        }
+        return successMsg.toString();
+    }
+
+    @Override
+    public String getCameraNameByCameraCode(String cameraCode) {
+        return baseRailwayManagementMapper.getCameraNameByCameraCode(cameraCode);
+    }
+}

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

@@ -0,0 +1,75 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.entity.BaseUser;
+import com.ozs.mapper.BaseUserMapper;
+import com.ozs.service.BaseUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Administrator
+ */
+@Service
+public class BaseUserServiceImpl extends ServiceImpl<BaseUserMapper, BaseUser> implements BaseUserService {
+    @Autowired
+    private BaseUserMapper baseUserMapper;
+
+    @Override
+    public Set<String> getUserIdList(String createBy, Long deptId) {
+        Set<String> set = new HashSet<>();
+        // 根据create_by、data_permission=1(本人)
+        Set<String> set1 = baseUserMapper.getUserIdList(createBy);
+        set.addAll(set1);
+        // 根据 dept_id(本部门)data_permission=2
+        Set<String> set2 = baseUserMapper.getUserIdByDeptId(deptId);
+        set.addAll(set2);
+        // 根据 dept_id(本部门及下级部门数据) data_permission=3
+        // 获取部门数据
+        List<Long> deptList = baseUserMapper.getDeptId(deptId);
+        // 获取用户列表
+        Set<String> set3 = baseUserMapper.getUserIdByDeptIds(deptList);
+        set.addAll(set3);
+        // 本人及本级部门数据 data_permission=4
+        Set<String> set4 = baseUserMapper.getUserIdByDeptIdAndUserId(createBy, deptId);
+        set.addAll(set4);
+        // 本人及本部门及下级部门数据 data_permission=5
+        // 获取本人
+        Set<String> setUser = baseUserMapper.getUserIdListBy5(createBy);
+        // 获取部门数据
+        List<Long> deptList5 = baseUserMapper.getDeptId(deptId);
+        // 获取用户列表
+        Set<String> setUsers = baseUserMapper.getUserIdByDeptIdsBy5(deptList5);
+        Set<String> set5 = new HashSet<>();
+        set5.addAll(setUser);
+        set5.addAll(setUsers);
+        set.addAll(set5);
+        // 全部 data_permission=6
+        Set<String> set6 = baseUserMapper.getUserIdList6();
+        set.addAll(set6);
+        return set;
+    }
+
+    @Override
+    public BaseUser getUser(String userId) {
+        return baseUserMapper.getUser(userId);
+    }
+    @Override
+    public BaseUser getUserById(Long id) {
+        return baseUserMapper.getUserById(id);
+    }
+
+    @Override
+    public BaseUser getUserName(String userName) {
+        return baseUserMapper.getUserName(userName);
+    }
+
+    @Override
+    public List<String> getRoleName(String userId) {
+        return baseUserMapper.getRoleName(userId);
+    }
+}

+ 20 - 0
business-service/src/main/java/com/ozs/service/impl/MsgAlarmFrequencyServiceImpl.java

@@ -0,0 +1,20 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.entity.MsgAlarmFrequency;
+import com.ozs.mapper.MsgAlarmFrequencyMapper;
+import com.ozs.service.MsgAlarmFrequencyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 预报警频次表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-23
+ */
+@Service
+public class MsgAlarmFrequencyServiceImpl extends ServiceImpl<MsgAlarmFrequencyMapper, MsgAlarmFrequency> implements MsgAlarmFrequencyService {
+
+}

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

@@ -0,0 +1,141 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.vo.*;
+import com.ozs.mapper.BaseCameraManagementMapper;
+import com.ozs.mapper.MsgAlarmMapper;
+import com.ozs.service.MsgAlarmService;
+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>
+ * 报警信息表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@Service
+public class MsgAlarmServiceImpl extends ServiceImpl<MsgAlarmMapper, MsgAlarm> implements MsgAlarmService {
+    @Autowired
+    private MsgAlarmMapper msgAlarmMapper;
+    @Autowired
+    private BaseCameraManagementMapper baseCameraManagementMapper;
+
+    public 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 List<AlarmStatisticVo> list(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, Integer pageNum, Integer pageSize, String userId) {
+        List<AlarmStatisticVo> list = msgAlarmMapper.list(railwayCode, currentYear, currentMonth, alarmType, userId);
+        return list;
+    }
+
+    @Override
+    public List<AlarmStatisticMonthDto> getCount(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, String userId) {
+        List<AlarmStatisticMonthDto> list = msgAlarmMapper.listDtoMonth(railwayCode, currentYear, currentMonth, alarmType, userId);
+        return list;
+    }
+
+    @Override
+    public List<AlarmStatisticMonthDto> getDayCount(String railwayCode, Integer currentYear, Integer currentMonth, String alarmType, String userId) {
+        List<AlarmStatisticMonthDto> list = msgAlarmMapper.listDtoDay(railwayCode, currentYear, currentMonth, alarmType, userId);
+        return list;
+    }
+
+    @Override
+    public List<AlarmStatisticDto> exportExcel(AlarmStatisticResVo alarmStatisticResVo, String userId) {
+        List<AlarmStatisticDto> listDto = msgAlarmMapper.listDto(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        return listDto;
+    }
+
+    @Override
+    public List<AlarmStatisticMonthDto> exportDayExcel(AlarmStatisticResVo alarmStatisticResVo, String userId) {
+        List<AlarmStatisticMonthDto> listDto = msgAlarmMapper.listDtoDay(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        return listDto;
+    }
+
+    @Override
+    public List<AlarmStatisticMonthDto> exportExcelMonth(AlarmStatisticResVo alarmStatisticResVo, String userId) throws Exception {
+        List<AlarmStatisticMonthDto> listDto = msgAlarmMapper.listDtoMonth(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        return listDto;
+    }
+
+    @Override
+    public MsgAlarm selectByCameraCode(String cameraCode) {
+        return msgAlarmMapper.selectByCameraCode(cameraCode);
+    }
+
+    @Override
+    public IPage<MsgAlarm> queryPage(MsgAlarmVo vo) {
+        int pageNum = Integer.parseInt(vo.getPageNum().toString());
+        int pageSize = Integer.parseInt(vo.getPageSize().toString());
+        com.github.pagehelper.Page<MsgAlarm> page = PageHelper.startPage(pageNum, pageSize)
+                .doSelectPage(() -> msgAlarmMapper.selectMsgAlarmList(vo));
+        Page<MsgAlarm> pageR =
+                new Page<>(pageNum, pageSize);
+        pageR.setRecords(page.getResult());
+        pageR.setTotal(page.getTotal());
+        return pageR;
+    }
+
+    @Override
+    public MsgAlarm getByAlarmId(String alarmId) {
+        return msgAlarmMapper.getByAlarmId(alarmId);
+    }
+
+    @Override
+    public Map<String, Integer> statisticsNum(MsgAlarmVo msgAlarmVo) {
+        Map<String, Integer> map = new HashMap<>();
+        // 相机数量
+        Integer countCamera = baseCameraManagementMapper.countCamera(msgAlarmVo);
+        // 累计报警次数
+        Integer countMsg = msgAlarmMapper.countMsg(msgAlarmVo);
+        // 解除报警
+//        LambdaQueryWrapper<MsgAlarm> lwJC = new LambdaQueryWrapper<MsgAlarm>();
+//        lwJC.eq(MsgAlarm::getIsLock, "1");
+        Integer countJC = msgAlarmMapper.countJC(msgAlarmVo);
+        // 未解除报警
+//        LambdaQueryWrapper<MsgAlarm> lwWJC = new LambdaQueryWrapper<MsgAlarm>();
+//        lwWJC.eq(MsgAlarm::getIsLock, "2");
+        Integer countWJC = msgAlarmMapper.countWJC(msgAlarmVo);
+        map.put("countCamera", countCamera);
+        map.put("countMsg", countMsg);
+        map.put("countJC", countJC);
+        map.put("countWJC", countWJC);
+        return map;
+    }
+
+    @Override
+    public Integer appAlarmNum(MsgAlarmVo msgAlarmVo) {
+        return msgAlarmMapper.countWJC(msgAlarmVo);
+    }
+
+    @Override
+    public List<MsgAlarm> msgAlarmList(MsgAlarmVo msgAlarmVo) {
+        return msgAlarmMapper.selectMsgAlarmList(msgAlarmVo);
+    }
+}

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

@@ -0,0 +1,84 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.ozs.common.utils.AppendUtils;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.BaseRailwayManagement;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgAppPush;
+import com.ozs.entity.vo.MsgAlarmVo;
+import com.ozs.mapper.MsgAppPushMapper;
+import com.ozs.service.BaseCameraManagementService;
+import com.ozs.service.BaseRailwayManagementService;
+import com.ozs.service.MsgAppPushService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author wyy
+ * @subject
+ * @creat 2023/3/6
+ */
+@Service
+public class MsgAppPushServiceImpl extends ServiceImpl<MsgAppPushMapper, MsgAppPush> implements MsgAppPushService {
+    @Autowired
+    MsgAppPushMapper msgAppPushMapper;
+    @Autowired
+    private BaseCameraManagementService baseCameraManagementService;
+    @Autowired
+    private BaseRailwayManagementService baseRailwayManagementService;
+
+    @Override
+    public IPage<MsgAlarm> alarmPushMsg(MsgAlarmVo msgAlarmVo) {
+        Page<MsgAlarm> page = PageHelper.startPage(msgAlarmVo.getPageNum().intValue(), msgAlarmVo.getPageSize().intValue())
+                .doSelectPage(() -> msgAppPushMapper.messageMoreApp(msgAlarmVo));
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<MsgAlarm> pageR =
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(msgAlarmVo.getPageNum().intValue(), msgAlarmVo.getPageSize().intValue());
+        pageR.setSize(page.size());
+        pageR.setTotal(page.getTotal());
+        if (!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getResult())) {
+            List<MsgAlarm> dto1 = page.getResult().stream().map(o -> {
+                String[] split = o.getImageUrl().split(";");
+                ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+                o.setImageUrls(objects);
+                LambdaQueryWrapper<BaseCameraManagement> cameraManagementLambdaQueryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
+                if (!ObjectUtils.isEmpty(o.getCameraCode())) {
+                    cameraManagementLambdaQueryWrapper.eq(BaseCameraManagement::getCameraCode, o.getCameraCode());
+                }
+                BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(cameraManagementLambdaQueryWrapper);
+                LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(cameraManagement.getRailwayCode())) {
+                    queryWrapper.eq(BaseRailwayManagement::getRailwayCode, cameraManagement.getRailwayCode());
+                }
+                BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+                o.setRailwayName(baseRailwayManagement.getRailwayName());
+                String mils = AppendUtils.stringAppend(cameraManagement.getInstallMile());
+                o.setAlarmMiles(mils);
+                String end = AppendUtils.stringAppend(cameraManagement.getEndMile());
+                o.setEndMile(end);
+                String begin = AppendUtils.stringAppend(cameraManagement.getBeginMile());
+                o.setBeginMile(begin);
+                // o.setAlarmCount((int) msgAlarmFrequencyService.count()+1);
+                return o;
+            }).collect(Collectors.toList());
+            pageR.setRecords(dto1);
+        }
+        return pageR;
+    }
+
+    @Override
+    public int update(MsgAppPush msgAppPush) {
+        int num = msgAppPushMapper.update(msgAppPush);
+        return num;
+    }
+}

+ 137 - 0
business-service/src/main/java/com/ozs/service/impl/MsgWebPushServiceImpl.java

@@ -0,0 +1,137 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import com.ozs.common.utils.AppendUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.BaseRailwayManagement;
+import com.ozs.entity.MsgAlarm;
+import com.ozs.entity.MsgWebPush;
+import com.ozs.entity.vo.MsgAlarmResp;
+import com.ozs.entity.vo.MsgAlarmVo;
+import com.ozs.mapper.MsgWebPushMapper;
+import com.ozs.service.BaseCameraManagementService;
+import com.ozs.service.BaseRailwayManagementService;
+import com.ozs.service.MsgWebPushService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/15 14:34
+ */
+@Service
+public class MsgWebPushServiceImpl extends ServiceImpl<MsgWebPushMapper, MsgWebPush> implements MsgWebPushService {
+    @Autowired
+    private MsgWebPushMapper msgWebPushMapper;
+    @Autowired
+    private BaseCameraManagementService baseCameraManagementService;
+    @Autowired
+    private BaseRailwayManagementService baseRailwayManagementService;
+
+    @Override
+    public int read(MsgWebPush msgWebPush) {
+        // 状态:1未读;2已读
+        msgWebPush.setStatus(2);
+        return msgWebPushMapper.updateByPushId(msgWebPush);
+    }
+
+    @Override
+    public Map webAlarm(String userId) {
+        // List<String> userIds = baseCameraManagementService.getUserIds(userId);
+        Map<String, Object> webAlarmMap = new HashMap<>();
+        List<MsgAlarmResp> msgAlarmRespList = new ArrayList<>();
+        Integer webAlarmNum = msgWebPushMapper.webAlarmNum(userId);
+        List<MsgAlarm> webAlarm = msgWebPushMapper.webAlarm(userId);
+        if (!StringUtils.isEmpty(webAlarm) && webAlarm.size() > 0) {
+            for (MsgAlarm msgAlarm : webAlarm) {
+                LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+                if (!ObjectUtils.isEmpty(msgAlarm.getCameraCode())) {
+                    lw.eq(BaseCameraManagement::getCameraCode, msgAlarm.getCameraCode());
+                }
+                BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+                LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                    wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+                }
+                BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+                MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+                BeanUtils.copyProperties(msgAlarm, msgAlarmResp);
+                msgAlarmResp.setRailwayName(baseRailwayManagement.getRailwayName());
+                msgAlarmResp.setDeptId(baseCameraManagement.getDeptId());
+                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);
+                msgAlarmResp.setInstallLongitude(baseCameraManagement.getInstallLongitude() + "," + baseCameraManagement.getInstallLatitude());
+                msgAlarmResp.setPushId(msgAlarm.getMsgId());
+                msgAlarmRespList.add(msgAlarmResp);
+            }
+        }
+        webAlarmMap.put("webAlarmNum", webAlarmNum);
+        webAlarmMap.put("webAlarm", msgAlarmRespList);
+        return webAlarmMap;
+    }
+
+    @Override
+    public IPage<MsgAlarm> messageMore(MsgAlarmVo msgAlarmVo) {
+        Page<MsgAlarm> page = PageHelper.startPage(msgAlarmVo.getPageNum().intValue(), msgAlarmVo.getPageSize().intValue())
+                .doSelectPage(() -> msgWebPushMapper.messageMore(msgAlarmVo));
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<MsgAlarm> pageR =
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(msgAlarmVo.getPageNum().intValue(), msgAlarmVo.getPageSize().intValue());
+        pageR.setSize(page.size());
+        pageR.setTotal(page.getTotal());
+        // Page<MsgAlarm> page = PageUtils.getPages(msgAlarmVo.getPageNum().intValue(), msgAlarmVo.getPageSize().intValue(), webAlarm);
+        if (!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getResult())) {
+            List<MsgAlarm> dto1 = page.getResult().stream().map(o -> {
+                String[] split = o.getImageUrl().split(";");
+                ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+                o.setImageUrls(objects);
+                LambdaQueryWrapper<BaseCameraManagement> cameraManagementLambdaQueryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
+                if (!ObjectUtils.isEmpty(o.getCameraCode())) {
+                    cameraManagementLambdaQueryWrapper.eq(BaseCameraManagement::getCameraCode, o.getCameraCode());
+                }
+                BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(cameraManagementLambdaQueryWrapper);
+                LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(cameraManagement.getRailwayCode())) {
+                    queryWrapper.eq(BaseRailwayManagement::getRailwayCode, cameraManagement.getRailwayCode());
+                }
+                BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+
+                o.setRailwayName(baseRailwayManagement.getRailwayName());
+                String mils = AppendUtils.stringAppend(cameraManagement.getInstallMile());
+                o.setAlarmMiles(mils);
+                String end = AppendUtils.stringAppend(cameraManagement.getEndMile());
+                o.setEndMile(end);
+                String begin = AppendUtils.stringAppend(cameraManagement.getBeginMile());
+                o.setBeginMile(begin);
+                // o.setAlarmCount((int) msgAlarmFrequencyService.count()+1);
+                return o;
+            }).collect(Collectors.toList());
+            pageR.setRecords(dto1);
+        }
+        return pageR;
+    }
+
+    @Override
+    public Map<String, Integer> messageMoreNum(String userId) {
+        Map<String, Integer> map = msgWebPushMapper.messageMoreNum(userId);
+        return map;
+    }
+
+    @Override
+    public int readAll(String userId) {
+        return msgWebPushMapper.readAll(userId);
+    }
+}

+ 20 - 0
business-service/src/main/java/com/ozs/service/impl/SvcAddressServiceImpl.java

@@ -0,0 +1,20 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.entity.SvcAddress;
+import com.ozs.mapper.SvcAddressMapper;
+import com.ozs.service.SvcAddressService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 报警消息访问令牌参数验证表 服务实现类
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-28
+ */
+@Service
+public class SvcAddressServiceImpl extends ServiceImpl<SvcAddressMapper, SvcAddress> implements SvcAddressService {
+
+}

+ 48 - 0
business-service/src/main/java/com/ozs/service/impl/UserRegistrationidServiceImpl.java

@@ -0,0 +1,48 @@
+package com.ozs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ozs.entity.UserRegistrationid;
+import com.ozs.mapper.UserRegistrationidMapper;
+import com.ozs.service.UserRegistrationidService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.List;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/14 17:08
+ */
+@Slf4j
+@Service
+public class UserRegistrationidServiceImpl extends ServiceImpl<UserRegistrationidMapper, UserRegistrationid> implements UserRegistrationidService {
+    @Autowired
+    private UserRegistrationidMapper userRegistrationidMapper;
+
+    @Override
+    public Integer addRegistrationID(UserRegistrationid userRegistrationid) {
+        LambdaQueryWrapper<UserRegistrationid> lw = new LambdaQueryWrapper<UserRegistrationid>();
+        if (!ObjectUtils.isEmpty(userRegistrationid.getUserId())) {
+            lw.in(UserRegistrationid::getUserId, userRegistrationid.getUserId());
+        }
+        if (!ObjectUtils.isEmpty(userRegistrationid.getRegistrationId())) {
+            lw.in(UserRegistrationid::getRegistrationId, userRegistrationid.getRegistrationId());
+        }
+        log.info("userRegistrationids111111111111111:--------" + userRegistrationid.getUserId());
+        log.info("userRegistrationids222222222222222:--------" + userRegistrationid.getRegistrationId());
+        List<UserRegistrationid> userRegistrationids = userRegistrationidMapper.selectList(lw);
+        log.info("userRegistrationids333333333333333:--------" + userRegistrationids.size());
+        if (com.ozs.common.utils.StringUtils.isEmpty(userRegistrationids) && userRegistrationids.size() == 0) {
+            userRegistrationidMapper.insert(userRegistrationid);
+        }
+        return 1;
+    }
+
+    @Override
+    public List<String> selectRegistrationID(List<String> userIdList) {
+        return userRegistrationidMapper.selectRegistrationID(userIdList);
+    }
+}

+ 66 - 0
business-service/src/main/java/com/ozs/utils/CodeGet.java

@@ -0,0 +1,66 @@
+package com.ozs.utils;
+
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+public class CodeGet {
+
+    public static void main(String[] args) {
+
+        // 1、创建代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 2、全局配置
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        gc.setOutputDir("/Users/sunhuanhuan/Documents/project/106/project/VehicleMonitor/business-service/src/main/java");
+
+        // IUserService
+        gc.setServiceName("%sService");	//去掉Service接口的首字母I
+        gc.setAuthor("ozs");
+        gc.setOpen(false);
+        mpg.setGlobalConfig(gc);
+
+        // 3、数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://124.70.58.209:18806/vehicle?characterEncoding=utf-8&useSSL=false");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("123.asd");
+        dsc.setDbType(DbType.MYSQL);
+        mpg.setDataSource(dsc);
+
+        // 4、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.ozs");
+        pc.setModuleName(""); //模块名
+        pc.setController("controller");
+        pc.setService("service");
+        pc.setMapper("mapper");
+        mpg.setPackageInfo(pc);
+
+        // 5、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+
+        strategy.setInclude("msg_alarm");
+
+        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
+
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
+        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
+
+        strategy.setRestControllerStyle(true); //restful api风格控制器
+        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
+
+        mpg.setStrategy(strategy);
+
+        // 6、执行
+        mpg.execute();
+    }
+}

+ 10 - 0
vehicle-admin/pom.xml

@@ -75,7 +75,17 @@
         <dependency>
             <groupId>com.ozs</groupId>
             <artifactId>business-service</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>mybatis-plus-extension</artifactId>
+                    <groupId>com.baomidou</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.ozs</groupId>-->
+<!--            <artifactId>business-service</artifactId>-->
+<!--        </dependency>-->
 
     </dependencies>
 

+ 42 - 0
vehicle-admin/src/main/java/com/ozs/core/config/CaneraConfig.java

@@ -0,0 +1,42 @@
+package com.ozs.core.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Data
+public class CaneraConfig {
+
+    /**
+     * 视频服务器访问路径
+     */
+    @Value("${base.historyUrl:http://47.106.159.135/streams}")
+    private String historyUrl;
+
+    /**
+     * ffmpeg.exe路径
+     * "D:\\Java\\operSources\\ffmpeg-4.3.1\\bin\\ffmpeg.exe"
+     */
+    @Value("${base.ffmpegPath:C:\\Users\\Administrator.DESKTOP-0NUUTMM\\Downloads\\ffmpeg-5.1.2-essentials_build\\ffmpeg-5.1.2-essentials_build\\bin\\ffmpeg.exe}")
+    private String ffmpegPath;
+
+
+    @Value("${base.filePath:/opt/streams/}")
+    private String filePath;
+
+    /**
+     * 录制视频存放路径
+     */
+    @Value("${base.transcribeFilePath:/opt/streams/record/flv}")
+    private String transcribeFilePath;
+
+
+    @Value("${base.webUrl:http://47.106.159.135/streams}")
+    private String webUrl;
+
+    @Value("${base.bakUrl:http://124.70.58.209:18891}")
+    private String bakUrl;
+
+
+}

+ 121 - 0
vehicle-admin/src/main/java/com/ozs/core/config/SwaggerConfig.java

@@ -0,0 +1,121 @@
+package com.ozs.core.config;
+
+import com.ozs.common.config.BaseConfig;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Swagger2的接口配置
+ *
+ * @author hx
+ */
+@Configuration
+public class SwaggerConfig
+{
+    /** 系统基础配置 */
+    @Autowired
+    private BaseConfig ruoyiConfig;
+
+    /** 是否开启swagger */
+    @Value("${swagger.enabled}")
+    private boolean enabled;
+
+    /** 设置请求的统一前缀 */
+    @Value("${swagger.pathMapping}")
+    private String pathMapping;
+
+    /**
+     * 创建API
+     */
+    @Bean
+    public Docket createRestApi()
+    {
+        return new Docket(DocumentationType.OAS_30)
+                // 是否启用Swagger
+                .enable(enabled)
+                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+                .apiInfo(apiInfo())
+                // 设置哪些接口暴露给Swagger展示
+                .select()
+                // 扫描所有有注解的api,用这种方式更灵活
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                // 扫描指定包中的swagger注解
+                // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
+                // 扫描所有 .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build()
+                /* 设置安全模式,swagger可以设置访问token */
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts())
+                .pathMapping(pathMapping);
+    }
+
+    /**
+     * 安全模式,这里指定token通过Authorization头请求头传递
+     */
+    private List<SecurityScheme> securitySchemes()
+    {
+        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
+        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
+        return apiKeyList;
+    }
+
+    /**
+     * 安全上下文
+     */
+    private List<SecurityContext> securityContexts()
+    {
+        List<SecurityContext> securityContexts = new ArrayList<>();
+        securityContexts.add(
+                SecurityContext.builder()
+                        .securityReferences(defaultAuth())
+                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
+                        .build());
+        return securityContexts;
+    }
+
+    /**
+     * 默认的安全上引用
+     */
+    private List<SecurityReference> defaultAuth()
+    {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences = new ArrayList<>();
+        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+        return securityReferences;
+    }
+
+    /**
+     * 添加摘要信息
+     */
+    private ApiInfo apiInfo()
+    {
+        // 用ApiInfoBuilder进行定制
+        return new ApiInfoBuilder()
+                // 设置标题
+                .title("标题:若依管理系统_接口文档")
+                // 描述
+                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
+                // 作者信息
+                .contact(new Contact(ruoyiConfig.getName(), null, null))
+                // 版本
+                .version("版本号:" + ruoyiConfig.getVersion())
+                .build();
+    }
+}

+ 592 - 0
vehicle-admin/src/main/java/com/ozs/core/util/CameraUtil.java

@@ -0,0 +1,592 @@
+package com.ozs.core.util;
+
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ozs.core.config.CaneraConfig;
+import com.ozs.common.config.BaseConfig;
+import com.ozs.common.constant.Constants;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.exception.base.BaseException;
+import com.ozs.common.utils.DateUtils;
+import com.ozs.common.utils.http.HttpUtils;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.service.BaseCameraManagementService;
+import com.ozs.system.mapper.SysDictDataMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ObjectUtils;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.io.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+/**
+ * 相机工具
+ */
+
+@Configuration
+@Slf4j
+public class CameraUtil {
+
+    private static String historyUrl;
+    private static String ffmpegPath;
+    private static String filePath;
+    private static String transcribeFilePath;
+    private static String webUrl;
+    private static String bakUrl;
+    private static CmdCameraUtil cUtil;
+
+    @Autowired
+    private CaneraConfig caneraConfig;
+
+    @Autowired
+    private CmdCameraUtil cmdCameraUtil;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+    @Resource
+    BaseCameraManagementService baseCameraManagementService;
+
+
+    /**
+     * 历史回放
+     *
+     * @param fromVideoFileList
+     * @param ph
+     * @return
+     * @throws IOException
+     */
+    public static String historyPlay(List<String> fromVideoFileList, String ph, String uuid) {
+        // 视频服务映射路径
+        String NewfilePath = BaseConfig.getProfile() + "/" + ph;
+        log.info("NewfilePath:{}", NewfilePath);
+        log.info("fromVideoFileList:{}", fromVideoFileList);
+        if (ObjectUtils.isEmpty(fromVideoFileList) || fromVideoFileList.size() <= 0) {
+            throw new BaseException("当前相机无视频录像");
+        }
+        ExecutorService executor = Executors.newFixedThreadPool(10);
+
+        executor.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Map<String, String> map = myConvetor(fromVideoFileList, NewfilePath, uuid);
+                    if (!ObjectUtils.isEmpty(map)) {
+                        cUtil.cmd(map.get("cmd"));
+                        //删除生成的ts文件
+                        File file1 = new File(map.get("path"));
+                        if (file1.exists()) {
+                            file1.delete();
+                        }
+                    }
+                } catch (IOException e) {
+                    log.error(e.getMessage());
+                    e.printStackTrace();
+                }
+            }
+        });
+        executor.shutdown();
+
+        return Constants.RESOURCE_PREFIX + "/" + ph;
+    }
+
+    /**
+     * 实时播放的拼接流
+     *
+     * @param cameraCode 相机编码
+     * @param channel    相机通道
+     * @return
+     */
+    public static String getPlayFlv(String cameraCode, String channel, boolean flay) {
+        if (!flay) {
+            return bakUrl + "/hdl/" + channel + "/" + cameraCode + ".flv";
+        }
+        return webUrl + "/hdl/" + channel + "/" + cameraCode + ".flv";
+
+
+//        if (!flay) {
+//            return bakUrl + "/ws/" + channel + "/" + cameraCode + ".flv";
+//        }
+//        return webUrl + "/ws/" + channel + "/" + cameraCode + ".flv";
+    }
+
+    public static String getPlayFlv(String cameraCode, String channel) {
+        return getPlayFlv(cameraCode, channel, true);
+    }
+
+    /**
+     * 开启录制功能
+     *
+     * @param cameraCode 相机编码
+     * @param channel    相机通道
+     * @return
+     */
+    public static String startRecording(String cameraCode, String channel) {
+        return historyUrl + "/api/record/flv/start?streamPath=" + channel + "/" + cameraCode;
+    }
+
+    /**
+     * 关闭录制功能
+     *
+     * @param taskId 录像接口返回的任务ID
+     * @return
+     */
+    public static String endRecording(String taskId) {
+        return historyUrl + "/api/record/flv/stop?id=" + taskId;
+    }
+
+
+    /**
+     * 历史回放流(获取)
+     *
+     * @param channel 相机通道
+     * @param startTm 开始时间
+     * @param endTm   结束时间
+     * @return
+     */
+    public static String historyPlayListStr(String channel, Date startTm, Date endTm) {
+        List<String> list = filterPlayList(channel, startTm, endTm, filePath);
+        String uuid = UUID.randomUUID().toString();
+        String ph = "flv/" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, new Date())
+                + "/" + channel + "/"
+                + uuid + ".flv";
+        if (!ObjectUtils.isEmpty(list)) {
+            try {
+                return historyPlay(list, ph, uuid);
+            } catch (Exception e) {
+                log.error(e.getMessage());
+                e.printStackTrace();
+            }
+        } else {
+            throw new BaseException("当前相机无视频录像");
+        }
+        return null;
+    }
+
+
+    /**
+     * 过滤符合条件的视频
+     *
+     * @param channel
+     * @param startTm
+     * @param endTm
+     * @param mappingUrl
+     * @return
+     */
+    public static List<String> filterPlayList(String channel, Date startTm, Date endTm, String mappingUrl) {
+        if (StringUtils.isBlank(channel)
+                || ObjectUtils.isEmpty(startTm)
+                || ObjectUtils.isEmpty(endTm)) {
+            return null;
+        }
+
+        List<String> ls = new ArrayList<>();
+        Map<Date, String> m = new HashMap<>();
+        // 调用视频服务返回参数
+        String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, startTm);
+        String endTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, endTm);
+
+        String param = "channel=" + channel + "&startTime=" + startTime + "&endTime=" + endTime;
+        String s = HttpUtils.sendGet(historyUrl + "/api/record/flv/list", param);
+        // 视频拼接
+        if (!StringUtils.isBlank(s) || "null".equals(s)) {
+            List<Map<String, Object>> maps = JSON.parseArray(s, Map.class);
+            if (ObjectUtils.isEmpty(maps)) {
+                return null;
+            }
+            for (Map<String, Object> map : maps) {
+                Object path = map.get("Path");
+                if (!ObjectUtils.isEmpty(path)) {
+                    String s1 = path.toString();
+                    String substring = s1.substring(s1.lastIndexOf("/") + 1, s1.length());
+                    String substring1 = substring.substring(0, substring.indexOf("-"));
+                    String[] s2 = substring1.split("_");
+                    if (!ObjectUtils.isEmpty(s2)) {
+
+                        String s3 = s2[0] + s2[1];
+                        String s4 = s2[0] + s2[2];
+                        Date sdate = DateUtils.dateTime(DateUtils.YYYYMMDDHHMMSS, s3);
+                        if (s2[1].startsWith("23") && s2[2].startsWith("00")) {
+                            sdate = DateUtils.addDays(sdate, -1);
+                        }
+                        Date edate = DateUtils.dateTime(DateUtils.YYYYMMDDHHMMSS, s4);
+                        /*     sdate  |startTm|  edate     |endTm| */
+                        if (startTm.compareTo(sdate) >= 0
+                                && startTm.compareTo(edate) <= 0
+                                && endTm.compareTo(edate) >= 0) {
+                            m.put(sdate, mappingUrl + path.toString());
+                            /*  |startTm|   sdate    edate   |endTm| */
+                        } else if (startTm.compareTo(sdate) <= 0 && endTm.compareTo(edate) >= 0) {
+                            m.put(sdate, mappingUrl + path.toString());
+
+                            /*  |startTm|   sdate     |endTm|  edate  */
+                        } else if (startTm.compareTo(sdate) <= 0
+                                && endTm.compareTo(sdate) >= 0
+                                && endTm.compareTo(edate) <= 0) {
+                            m.put(sdate, mappingUrl + path.toString());
+
+                            /*  sdate |startTm|      |endTm| edate  */
+                        } else if (startTm.compareTo(sdate) >= 0 && endTm.compareTo(edate) <= 0) {
+                            m.put(sdate, mappingUrl + path.toString());
+                        }
+                    }
+                }
+            }
+        }
+        if (!ObjectUtils.isEmpty(m) && m.size() > 0) {
+            Set<Date> dates = m.keySet();
+            // 排序
+            dates.stream().parallel().collect(Collectors.toList()).stream().sorted().forEach(d -> {
+                ls.add(m.get(d));
+            });
+            return ls;
+        }
+        return null;
+    }
+
+    /**
+     * 合并视频(转化文件)
+     *
+     * @param fromVideoFileList 视频路径
+     * @param newfilePath       生产新的视频文件路径
+     * @throws IOException
+     */
+    public static Map<String, String> myConvetor(List<String> fromVideoFileList,
+                                                 String newfilePath,
+                                                 String uuid) throws IOException {
+        /*
+        * for f in *.flv; do echo "file '$f'" >> mylist.txt; done
+            ffmpeg -f concat -i mylist.txt -c copy output.flv
+        * */
+
+        File file = new File(newfilePath);
+        boolean flay = false;
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+            log.info("创建文件夹:{}", file.getParentFile().getPath());
+            flay = true;
+        }
+        log.info("newfilePath:{}", newfilePath);
+
+
+        StringBuffer sm = new StringBuffer("for f in ");
+        String pathStr = null;
+        for (int t = 0; t < fromVideoFileList.size(); t++) {
+            File ft = new File(fromVideoFileList.get(t));
+            if (ft.exists()) {
+                if (t != fromVideoFileList.size() - 1) {
+//                    sm.append(fromVideoFileList.get(t) + " ");
+                    sm.append(fromVideoFileList.get(t).substring(fromVideoFileList.get(t).lastIndexOf("/") + 1, fromVideoFileList.get(t).length()) + " ");
+                } else {
+//                    sm.append(fromVideoFileList.get(t));
+                    sm.append(fromVideoFileList.get(t).substring(fromVideoFileList.get(t).lastIndexOf("/") + 1, fromVideoFileList.get(t).length()));
+                    pathStr = fromVideoFileList.get(t).substring(0, fromVideoFileList.get(t).lastIndexOf("/"));
+                }
+            }
+        }
+//        String substring = newfilePath.substring(0, newfilePath.lastIndexOf("."));
+//        substring = substring + ".txt";
+
+        String substring = uuid + ".txt";
+        log.info("临时转化的文件:{}", substring);
+
+
+        sm.append("; do echo \"file '$f'\" >> " + substring + "; done");
+        String commit = sm.toString();
+        log.info("合并转化文件的命令:{}", commit);
+        Process proc = Runtime.getRuntime().exec("/bin/bash", null, null);
+        BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
+
+        try {
+            String commit1 = ffmpegPath + " -f concat -safe 0 -i " + pathStr + "/" + substring + " -c copy " + newfilePath;
+
+            log.info("合并视频命令:{}", commit1);
+            List<String> commands = new ArrayList<>();
+            if (flay) {
+                commands.add("chomd -R 777 " + file.getParentFile().getPath());
+            }
+            //
+            commands.add("cd " + pathStr);
+            // 合并成一个临时文件
+            commands.add(commit);
+
+            // 临时文件转化为 flv
+//            commands.add(commit1);
+            log.info("录像视频命令:{}", commands);
+            for (String line : commands) {
+                log.info("命令:{}", line);
+                out.println(line);
+            }
+            out.println("exit");// 这个命令必须执行,否则in流不结束。
+            log.info("命令:{}", "exit");
+            String rspLine = "";
+            while ((rspLine = in.readLine()) != null) {
+                log.info("*****:{}", rspLine);
+            }
+            proc.waitFor();
+            Map<String, String> map = new HashMap<>();
+            map.put("cmd", commit1);
+            map.put("path", pathStr + "/" + substring);
+            return map;
+
+
+        } catch (InterruptedException e) {
+            log.error(e.getMessage());
+            e.printStackTrace();
+        } finally {
+            in.close();
+            out.close();
+            proc.destroy();
+        }
+        return null;
+    }
+
+
+    @PostConstruct
+    public void init() {
+        historyUrl = caneraConfig.getHistoryUrl();
+        ffmpegPath = caneraConfig.getFfmpegPath();
+        filePath = caneraConfig.getFilePath();
+        transcribeFilePath = caneraConfig.getTranscribeFilePath();
+        webUrl = caneraConfig.getWebUrl();
+        bakUrl = caneraConfig.getBakUrl();
+        cUtil = cmdCameraUtil;
+    }
+
+    /**
+     * 定时任务参数flv文件
+     *
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    public void deleteFlv() throws IOException, InterruptedException {
+        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
+        Date date = new Date();
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        calendar.add(calendar.DATE, -1); //把日期往后增加一天,整数  往后推,负数往前移动
+        date = calendar.getTime(); //这个时间就是日期往后推一天的结果
+        String path = BaseConfig.getProfile() + "/flv/" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date);
+        File file = new File(path);
+        if (file.exists()) {
+            List<String> rspList = new ArrayList<String>();
+            Process proc = Runtime.getRuntime().exec("/bin/bash", null, null);
+            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
+            String commit = " rm -rf  " + path;
+            List<String> commands = new ArrayList<>();
+
+            // 删除
+            commands.add(commit);
+            log.info("删除昨天的录像视频命令:{}", commands);
+            for (String line : commands) {
+                out.println(line);
+            }
+            out.println("exit");// 这个命令必须执行,否则in流不结束。
+            String rspLine = "";
+            while ((rspLine = in.readLine()) != null) {
+                System.out.println(rspLine);
+                rspList.add(rspLine);
+            }
+            int i = proc.waitFor();
+            log.info("执行结果:{}", i);
+
+            in.close();
+            out.close();
+            proc.destroy();
+        }
+    }
+
+
+    /**
+     * 定时任务:删除超过配置时长的录制视频
+     *
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    public void deleteFlvExceed() throws IOException, InterruptedException, ParseException {
+        //字典中设置的值
+        List<SysDictData> sysCameraRecordTime = dictDataMapper.selectDictDataByType("sys_camera_record_time");
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        Date date = new Date();
+        Calendar calendar = new GregorianCalendar();
+        calendar.setTime(date);
+        //正数,日期天数加
+        //负数,日期天数减                         提前45天
+        if (!ObjectUtils.isEmpty(sysCameraRecordTime)) {
+            String dictValue = sysCameraRecordTime.get(0).getDictValue();
+            calendar.add(Calendar.DAY_OF_YEAR, Integer.parseInt("-" + dictValue));
+        } else {
+            calendar.add(Calendar.DAY_OF_YEAR, -45);
+        }
+        date = calendar.getTime();
+
+        //遍历每个进行视频录制的摄像头
+        File file = new File(transcribeFilePath);
+        log.info("file.Name()======================================" + file.getName());
+        log.info("file.exists()======================================" + file.exists());
+        if (file.exists() && file.isDirectory()) {
+            //获取文件夹中所有的子文件夹和文件
+            File[] files = file.listFiles();
+            if (!ObjectUtils.isEmpty(files) && files.length > 0) {
+                for (File file1 : files) {
+                    //   file1=/opt/streams/record/flv/34020000001320000167
+                    log.info("file1.Name()======================================" + file1.getName());
+                    if (file1.exists() && file1.isDirectory()) {
+                        //相机文件
+                        File[] fs = file1.listFiles();
+                        if (!ObjectUtils.isEmpty(fs) && fs.length > 0) {
+                            for (File f : fs) {
+                                //    f=/opt/streams/record/flv/34020000001320000167/20230328_192033_192037-91509173-cd5a-11ed-8a42-fa163e4e1e9f.flv
+                                //fName=20230328_192033_192037-91509173-cd5a-11ed-8a42-fa163e4e1e9f.flv
+                                String fName = f.getName();
+                                log.info("fName======================================" + fName);
+                                String[] split = fName.split("_");
+                                if (split.length > 0) {
+                                    //20230328
+                                    String s = split[0];
+                                    Date parse = sdf.parse(s);
+                                    long fTime = parse.getTime();
+                                    long dateTime = date.getTime();
+                                    //删除过期文件
+                                    if (fTime < dateTime) {
+                                        f.delete();
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 定时任务:关闭录制视频
+     *
+     * @throws IOException
+     * @throws InterruptedException
+     */
+    public void closeRecording() throws IOException, InterruptedException, ParseException {
+        LambdaQueryWrapper<BaseCameraManagement> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(BaseCameraManagement::getStartRecording, 1);
+        wrapper.isNotNull(BaseCameraManagement::getTaskId);
+        List<BaseCameraManagement> list = baseCameraManagementService.list(wrapper);
+        log.info("list======================================" + list);
+        List<String> collect = list.stream().map(BaseCameraManagement::getCameraCode).collect(Collectors.toList());
+//        List<String> collect = new ArrayList<>();
+//        collect.add("42010001541320001116");
+        //遍历每个进行视频录制的摄像头
+        File file = new File(transcribeFilePath);
+        log.info("closeRecording-file.Name()======================================" + file.getName());
+        log.info("closeRecording-file.exists()======================================" + file.exists());
+        if (file.exists() && file.isDirectory()) {
+            //获取文件夹中所有的子文件夹和文件
+            File[] files = file.listFiles();
+            if (!ObjectUtils.isEmpty(files) && files.length > 0) {
+                for (File file1 : files) {
+                    log.info("closeRecording-file1---------------" + file1);
+                    log.info("closeRecording-cameraCode---------------" + collect);
+                    String substring = file1.toString().substring(file1.toString().lastIndexOf("\\") + 1);
+                    if (collect.contains(substring)) {
+                        File[] files1 = CameraUtil.getCurFilesList(file1.toString());
+                        if (!ObjectUtils.isEmpty(files1) && files1.length > 0) {
+                            int length = files1.length;
+                            File file2 = files1[length - 1];
+                            log.info("closeRecording-file2---------------" + file2);
+                            String time = file2.toString().substring(file2.toString().lastIndexOf("\\") + 1);
+                            String substring1 = time.substring(0, 15);
+                            String substring2 = substring1.substring(0, 4);
+                            String substring3 = substring1.substring(4, 6);
+                            String substring4 = substring1.substring(6, 8);
+                            String substring5 = substring1.substring(9, 11);
+                            String substring6 = substring1.substring(11, 13);
+                            String substring7 = substring1.substring(13, 15);
+                            String date = substring2 + "-" + substring3 + "-" + substring4 + " " + substring5 + ":" + substring6 + ":" + substring7;
+                            System.out.println(date);
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            Date parse = sdf.parse(date);
+                            //当前时间戳
+                            long dades = System.currentTimeMillis();
+                            //文件的时间戳
+                            long time1 = parse.getTime();
+                            //当前时间10分钟之前的时间戳
+                            long time2 = dades - 600000L;
+                            if (time2 <= time1 && time1 < dades) {
+                            } else {
+                                LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+                                lw.eq(BaseCameraManagement::getCameraCode, substring);
+                                BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+                                log.info("closeRecording-endRecording------------" + baseCameraManagement.getTaskId());
+                                String start = HttpUtils.sendGet(CameraUtil.endRecording(baseCameraManagement.getTaskId()));
+                                log.info("closeRecording-endRecording------------" + start);
+                                if ("success".equals(start)) {
+                                    baseCameraManagement.setStartRecording(2);
+                                    baseCameraManagement.setTaskId("");
+                                } else {
+                                    baseCameraManagement.setStartRecording(2);
+                                    baseCameraManagement.setTaskId("");
+                                    log.error("关闭视频录制异常日志如下:" + start);
+                                }
+                                baseCameraManagementService.updateById(baseCameraManagement);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public static File[] getCurFilesList(String filePath) {
+        File path = new File(filePath);
+        File[] listFiles = path.listFiles(new FileFilter() {
+
+            @Override
+            public boolean accept(File pathname) {
+                if (pathname.isFile()) {
+                    return true;
+                } else {
+
+                    return false;
+                }
+            }
+        });
+
+        return listFiles;
+    }
+
+    public static void execute(String command) {
+        try {
+            ProcessBuilder process = new ProcessBuilder(command);
+            process.inheritIO().start().waitFor();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public static void main(String[] args) throws InterruptedException, ParseException, IOException {
+//        CameraUtil cameraUtil = new CameraUtil();
+//        cameraUtil.closeRecording();
+//        String s = "/opt/streams/record/flv/42010001541320001116/20230403_235506_000506-22e1523b-d170-11ed-8a42-fa163e4e1e9f.flv";
+//        String fileStr = s.substring(s.lastIndexOf("/") + 1, s.length());
+//        String pathStr = s.substring(0, s.lastIndexOf("/"));
+//        System.out.println(fileStr);
+//        System.out.println(pathStr);
+
+        String s = "20230403235512";
+        Date sdate = DateUtils.dateTime(DateUtils.YYYYMMDDHHMMSS, s);
+        sdate = DateUtils.addDays(sdate, -1);
+        System.out.println(DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, sdate));
+    }
+}

+ 80 - 0
vehicle-admin/src/main/java/com/ozs/core/util/CmdCameraUtil.java

@@ -0,0 +1,80 @@
+package com.ozs.core.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+@Slf4j
+@Component
+public class CmdCameraUtil {
+
+
+    public void cmd(String cmd) {
+        long l = System.currentTimeMillis();
+        Process exec = null;
+        try {
+            exec = Runtime.getRuntime().exec(new String[]{"sh", "-c", cmd});
+            long l1 = System.currentTimeMillis();
+            log.info("cmd-time:{}", l1 - l);
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            e.printStackTrace();
+        }
+        try {
+            printProcessMsg(exec);
+        } catch (IOException e) {
+            log.error(e.getMessage());
+            e.printStackTrace();
+        }
+        try {
+            int i = exec.waitFor();
+        } catch (InterruptedException e) {
+            log.error(e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * 处理process输出流和错误流,防止进程阻塞,在process.waitFor();前调用
+     *
+     * @param exec
+     * @throws IOException
+     */
+    private void printProcessMsg(Process exec) throws IOException {
+        //防止ffmpeg进程塞满缓存造成死锁
+        InputStream error = exec.getErrorStream();
+        InputStream is = exec.getInputStream();
+
+        StringBuffer result = new StringBuffer();
+        String line = null;
+        try {
+            BufferedReader br = new BufferedReader(new InputStreamReader(error, "GBK"));
+            BufferedReader br2 = new BufferedReader(new InputStreamReader(is, "GBK"));
+
+            while ((line = br.readLine()) != null) {
+                result.append(line + "\n");
+            }
+            log.info("FFMPEG视频合成进程错误信息:" + result.toString());
+
+            result = new StringBuffer();
+            line = null;
+
+            while ((line = br2.readLine()) != null) {
+                result.append(line + "\n");
+            }
+            log.info("FFMPEG视频合成进程输出内容为:" + result.toString());
+        } catch (IOException e2) {
+            e2.printStackTrace();
+        } finally {
+            error.close();
+            is.close();
+        }
+
+    }
+
+}

+ 766 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java

@@ -0,0 +1,766 @@
+package com.ozs.web.controller.accountmanagment;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+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.enums.BusinessType;
+import com.ozs.common.exception.base.BaseException;
+import com.ozs.common.utils.AppendUtils;
+import com.ozs.common.utils.ChineseToPingyin;
+import com.ozs.common.utils.IdempotenceUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.http.HttpUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.core.config.CaneraConfig;
+import com.ozs.core.util.CameraUtil;
+import com.ozs.entity.*;
+import com.ozs.entity.vo.*;
+import com.ozs.framework.config.ServerConfig;
+import com.ozs.service.*;
+import com.ozs.system.service.DataScoreUtil;
+import com.ozs.system.service.ISysDeptService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotNull;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 相机台账管理表 前端控制器
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@RestController
+@RequestMapping("/service/baseCameraManagement")
+@Slf4j
+public class BaseCameraManagementController extends BaseController {
+    public static final String PATTERN = "^[0-9]*$";
+    @Resource
+    BaseCameraManagementService baseCameraManagementService;
+    @Resource
+    BaseDeviceDynamicManagementService baseDeviceDynamicManagementService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private MsgAlarmService msgAlarmService;
+    @Autowired
+    private BaseRailwayManagementService baseRailwayManagementService;
+    @Autowired
+    private ServerConfig serverConfig;
+    @Autowired
+    private CaneraConfig caneraConfig;
+    @Autowired
+    private IdempotenceUtils idempotenceUtils;
+    @Autowired
+    private DataScoreUtil dataScoreUtil;
+    @Resource
+    private BaseUserService baseUserService;
+
+    /**
+     * 所有相机列表+权限
+     */
+    @ApiOperation(value = "相机台账管理")
+    @GetMapping("/selectCameraAll")
+    @Log(title = "相机台账管理", businessType = BusinessType.SELECT)
+    public AjaxResult selectCameraAll() {
+        BaseCameraManagementVo baseCameraManagementVo = (BaseCameraManagementVo) dataScoreUtil.setDataScore(getUserId(), new BaseCameraManagementVo());
+        List<BaseCameraManagementHomeVo> baseCameraManagements = baseCameraManagementService.selectCameraAll(baseCameraManagementVo);
+        return AjaxResult.success(baseCameraManagements);
+    }
+
+    @PostMapping(value = "/homeGetInfo")
+    @ApiOperation("根据相机ID、是否解除 获取相机信息、未解除信息")
+    @Log(title = "相机台账管理", businessType = BusinessType.SELECT)
+    public AjaxResult homeGetInfo(@RequestBody BaseCameraManagementHomeVo baseCameraManagementHomeVo) {
+        Integer isLock = baseCameraManagementHomeVo.getIsLock();
+        Long id = baseCameraManagementHomeVo.getId();
+        String cameraCode = baseCameraManagementHomeVo.getCameraCode();
+        // isLock  报警是否解除 1已解除2未解除
+        if (!StringUtils.isEmpty(isLock) && isLock == 1 && !StringUtils.isEmpty(id)) {
+            BaseCameraManagement baseCameraManagement = baseCameraManagementService.getById(id);
+            LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                queryWrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+            SysDept sysDept = deptService.selectDeptById(baseCameraManagement.getDeptId());
+            baseCameraManagement.setDeptName(sysDept.getDeptName());
+            baseCameraManagement.setRailwayName(baseRailwayManagement.getRailwayName());
+            String mils = AppendUtils.stringAppend(baseCameraManagement.getInstallMile());
+            baseCameraManagement.setInstallMiles(mils);
+            String end = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
+            baseCameraManagement.setEndMiles(end);
+            String begin = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
+            baseCameraManagement.setBeginMiles(begin);
+            return AjaxResult.success(baseCameraManagement);
+        } else if (!StringUtils.isEmpty(isLock) && isLock == 2 && !StringUtils.isEmpty(cameraCode)) {
+            MsgAlarm msgAlarm = msgAlarmService.selectByCameraCode(cameraCode);
+            LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+            if (!ObjectUtils.isEmpty(msgAlarm.getCameraCode())) {
+                lw.eq(BaseCameraManagement::getCameraCode, msgAlarm.getCameraCode());
+            }
+            BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+            LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+            MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+            BeanUtils.copyProperties(msgAlarm, msgAlarmResp);
+            msgAlarmResp.setRailwayName(baseRailwayManagement.getRailwayName());
+            msgAlarmResp.setDeptId(baseCameraManagement.getDeptId());
+            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);
+            msgAlarmResp.setInstallLongitude(baseCameraManagement.getInstallLongitude() + "," + baseCameraManagement.getInstallLatitude());
+            String[] split = msgAlarm.getImageUrl().split(";");
+            ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+            msgAlarmResp.setImageUrls(objects);
+            return AjaxResult.success(msgAlarmResp);
+        }
+        return null;
+    }
+
+    /**
+     * 相机台账管理分页
+     *
+     * @param baseCameraManagementVo
+     * @return
+     */
+    @ApiOperation(value = "相机台账管理分页")
+    @PostMapping("/list")
+    @Log(title = "相机台账管理", businessType = BusinessType.SELECT)
+    public AjaxResult selectBaseAccountManagement(@RequestBody BaseCameraManagementVo baseCameraManagementVo) {
+        baseCameraManagementVo = (BaseCameraManagementVo) dataScoreUtil.setDataScore(getUserId(), baseCameraManagementVo);
+        if (!ObjectUtils.isEmpty(baseCameraManagementVo.getBeginMile())) {
+            if (!baseCameraManagementVo.getBeginMile().toString().matches(PATTERN)) {
+                return error("监控范围开始里程位置填写格式不正确");
+            } else {
+                baseCameraManagementVo.setBeginMile(baseCameraManagementVo.getBeginMile() * 1000);
+            }
+        }
+        if (!ObjectUtils.isEmpty(baseCameraManagementVo.getEndMile())) {
+            if (!baseCameraManagementVo.getEndMile().toString().matches(PATTERN)) {
+                return error("监控范围结束里程位置填写格式不正确");
+            } else {
+                baseCameraManagementVo.setEndMile(baseCameraManagementVo.getEndMile() * 1000);
+            }
+        }
+        IPage<BaseCameraManagement> page = baseCameraManagementService.queryPage(baseCameraManagementVo);
+        page.setTotal(page.getTotal());
+        page.setCurrent(page.getCurrent());
+        page.setPages(page.getPages());
+        List<String> roleKey = baseUserService.getRoleName(getUserId());
+        BaseUser baseUser = baseUserService.getUser(getUserId());
+        if (!ObjectUtils.isEmpty(page) && page.getRecords().size() > 0) {
+            List<BaseCameraManagement> dto1 = page.getRecords().stream().map(o -> {
+                LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(o.getRailwayCode())) {
+                    queryWrapper.eq(BaseRailwayManagement::getRailwayCode, o.getRailwayCode());
+                }
+                BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+                SysDept sysDept = deptService.selectDeptById(o.getDeptId());
+                o.setDeptName(sysDept.getDeptName());
+                o.setRailwayName(baseRailwayManagement.getRailwayName());
+                String mils = AppendUtils.stringAppend(o.getInstallMile());
+                o.setInstallMiles(mils);
+                String end = AppendUtils.stringAppend(o.getEndMile());
+                o.setEndMiles(end);
+                String begin = AppendUtils.stringAppend(o.getBeginMile());
+                o.setBeginMiles(begin);
+                if (roleKey.size() > 0 || "admin".equals(baseUser.getUserName())) {
+                    o.setIsStartRecording(1);
+                    for (String s : roleKey) {
+                        if ("admin".equals(s) || "admin".equals(baseUser.getUserName())) {
+                            o.setIsStartRecording(1);
+                            break;
+                        } else {
+                            o.setIsStartRecording(2);
+                        }
+                    }
+                }
+                return o;
+            }).collect(Collectors.toList());
+            page.setRecords(dto1);
+        }
+        return AjaxResult.success(page);
+    }
+
+    /**
+     * 删除相机台账管理信息
+     *
+     * @param accountManagementIds
+     * @return
+     */
+    @DeleteMapping("/{accountManagementIds}")
+    @ApiOperation("删除相机台账管理信息")
+    @Log(title = "相机台账管理", businessType = BusinessType.DELETE)
+    @Transactional
+    public AjaxResult removeAccountManagement(@PathVariable List<Long> accountManagementIds) {
+        for (Long accountManagementId : accountManagementIds) {
+            LambdaQueryWrapper<BaseDeviceDynamicManagement> queryWrapper = new LambdaQueryWrapper<BaseDeviceDynamicManagement>();
+            BaseCameraManagement baseCameraManagement = baseCameraManagementService.getById(accountManagementId);
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+                queryWrapper.eq(BaseDeviceDynamicManagement::getCameraCode, baseCameraManagement.getCameraCode());
+            }
+            baseDeviceDynamicManagementService.remove(queryWrapper);
+            baseCameraManagementService.removeById(accountManagementId);
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 新增相机台账管理信息
+     *
+     * @param baseCameraManagement
+     * @return
+     */
+    @PostMapping("/saveAccountManagement")
+    @ApiOperation("新增相机台账管理信息")
+    @Transactional
+    @Log(title = "相机台账管理", businessType = BusinessType.INSERT)
+    public AjaxResult saveAccountManagement(@RequestBody BaseCameraManagement baseCameraManagement) {
+        String idempotence = idempotenceUtils.getIdempotence(baseCameraManagement.getCameraCode());
+        if (StringUtils.isNotEmpty(idempotence)) {
+            return error("你的网络卡顿,请不要一直添加!!!");
+        }
+        idempotenceUtils.createIdempotence(baseCameraManagement.getCameraCode());
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+            lw.eq(BaseCameraManagement::getCameraCode, baseCameraManagement.getCameraCode());
+        }
+        BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(lw);
+        if (!ObjectUtils.isEmpty(cameraManagement)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return error("相机台账管理信息相机编码已存在,不能重复添加");
+        }
+        LambdaQueryWrapper<BaseDeviceDynamicManagement> queryWrapper = new LambdaQueryWrapper<BaseDeviceDynamicManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+            queryWrapper.eq(BaseDeviceDynamicManagement::getCameraCode, baseCameraManagement.getCameraCode());
+        }
+        BaseDeviceDynamicManagement one = baseDeviceDynamicManagementService.getOne(queryWrapper);
+        if (!ObjectUtils.isEmpty(one)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return error("设备动态管理表该相机编码已存在,不能重复添加");
+        }
+        if (!baseCameraManagement.getBeginMile().toString().matches(PATTERN)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return error("监控范围开始里程位置填写格式不正确");
+        }
+        if (!baseCameraManagement.getInstallMile().toString().matches(PATTERN)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return error("监控相机安装里程位置填写格式不正确");
+        }
+        if (!baseCameraManagement.getEndMile().toString().matches(PATTERN)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return error("监控范围结束里程位置填写格式不正确");
+        }
+        baseCameraManagement.setBeginMile(baseCameraManagement.getBeginMile() * 1000);
+        baseCameraManagement.setInstallMile(baseCameraManagement.getInstallMile() * 1000);
+        baseCameraManagement.setEndMile(baseCameraManagement.getEndMile() * 1000);
+        if (baseCameraManagement.getBeginMile() > baseCameraManagement.getEndMile()) {
+            return error("监控范围开始里程位置不能大于监控范围结束里程位置");
+        }
+        baseCameraManagement.setCreateBy(getUserId());
+        baseCameraManagement.setUpdateBy(getUserId());
+        BaseDeviceDynamicManagement baseDynamicManagement = new BaseDeviceDynamicManagement();
+        baseDynamicManagement.setCameraCode(baseCameraManagement.getCameraCode());
+        baseDynamicManagement.setUpdateBy(getUserId());
+        baseDynamicManagement.setCreateBy(getUserId());
+        String start = HttpUtils.sendGet(CameraUtil.startRecording(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel()));
+        if (start.startsWith(baseCameraManagement.getCameraCode() + "/" + baseCameraManagement.getChannel())) {
+            baseCameraManagement.setStartRecording(1);
+            baseCameraManagement.setTaskId(start);
+        } else {
+            baseCameraManagement.setStartRecording(2);
+        }
+        if (baseCameraManagementService.save(baseCameraManagement) && baseDeviceDynamicManagementService.save(baseDynamicManagement)) {
+            idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+            return AjaxResult.success();
+        }
+        idempotenceUtils.deleteIdempotence(baseCameraManagement.getCameraCode());
+        return AjaxResult.error();
+    }
+
+    /**
+     * 修改相机台账管理信息
+     *
+     * @param baseCameraManagement
+     * @return
+     */
+    @PutMapping("/editAccountManagement")
+    @ApiOperation("修改相机台账管理信息")
+    @Log(title = "相机台账管理", businessType = BusinessType.UPDATE)
+    public AjaxResult editAccountManagement(@RequestBody BaseCameraManagement baseCameraManagement) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+            lw.eq(BaseCameraManagement::getCameraCode, baseCameraManagement.getCameraCode());
+        }
+        BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(lw);
+        if (!ObjectUtils.isEmpty(cameraManagement) && !cameraManagement.getId().equals(baseCameraManagement.getId())) {
+            return error("相机编码已存在,不能进行修改操作");
+        }
+        if (!baseCameraManagement.getBeginMile().toString().matches(PATTERN)) {
+            return error("监控范围开始里程位置填写格式不正确");
+        }
+        if (!baseCameraManagement.getInstallMile().toString().matches(PATTERN)) {
+            return error("监控相机安装里程位置填写格式不正确");
+        }
+        if (!baseCameraManagement.getEndMile().toString().matches(PATTERN)) {
+            return error("监控范围结束里程位置填写格式不正确");
+        }
+        baseCameraManagement.setBeginMile(baseCameraManagement.getBeginMile() * 1000);
+        baseCameraManagement.setInstallMile(baseCameraManagement.getInstallMile() * 1000);
+        baseCameraManagement.setEndMile(baseCameraManagement.getEndMile() * 1000);
+        baseCameraManagement.setUpdateBy(getUserId());
+        LambdaQueryWrapper<BaseDeviceDynamicManagement> queryWrapper = new LambdaQueryWrapper<BaseDeviceDynamicManagement>();
+        BaseCameraManagement management = baseCameraManagementService.getById(baseCameraManagement.getId());
+        if (!ObjectUtils.isEmpty(management.getCameraCode())) {
+            queryWrapper.eq(BaseDeviceDynamicManagement::getCameraCode, management.getCameraCode());
+        }
+        BaseDeviceDynamicManagement one = baseDeviceDynamicManagementService.getOne(queryWrapper);
+        if (ObjectUtils.isEmpty(one)) {
+            return error("设备动态管理表没有该相机编码");
+        }
+        one.setCameraCode(baseCameraManagement.getCameraCode());
+        if (baseCameraManagementService.updateById(baseCameraManagement) && baseDeviceDynamicManagementService.updateById(one)) {
+            return AjaxResult.success();
+        }
+        return AjaxResult.error();
+    }
+
+    @GetMapping(value = "/{id}")
+    @ApiOperation("根据相机ID获取相机台账管理信息")
+    @Log(title = "相机台账管理", businessType = BusinessType.MESSAGE)
+    public AjaxResult getInfo(@PathVariable Long id) {
+        BaseCameraManagement baseCameraManagement = baseCameraManagementService.getById(id);
+        LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+            queryWrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+        }
+        BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+        SysDept sysDept = deptService.selectDeptById(baseCameraManagement.getDeptId());
+        baseCameraManagement.setDeptName(sysDept.getDeptName());
+        baseCameraManagement.setRailwayName(baseRailwayManagement.getRailwayName());
+        String mils = AppendUtils.stringAppend(baseCameraManagement.getInstallMile());
+        baseCameraManagement.setInstallMiles(mils);
+        String end = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
+        baseCameraManagement.setEndMiles(end);
+        String begin = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
+        baseCameraManagement.setBeginMiles(begin);
+        return AjaxResult.success(baseCameraManagement);
+    }
+
+    @GetMapping("/getDate/{cameraCode}")
+    @ApiOperation("视频上方显示的数据")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult getDate(@PathVariable String cameraCode) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(cameraCode)) {
+            lw.eq(BaseCameraManagement::getCameraCode, cameraCode);
+        }
+        BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+        LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+            wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+        }
+        BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+        if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+            return error("线路表中没有该线路编码:" + baseCameraManagement.getRailwayCode() + "的数据");
+        }
+        LambdaQueryWrapper<BaseDeviceDynamicManagement> queryWrapper = new LambdaQueryWrapper<BaseDeviceDynamicManagement>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+            queryWrapper.eq(BaseDeviceDynamicManagement::getCameraCode, baseCameraManagement.getCameraCode());
+        }
+        BaseDeviceDynamicManagement baseDeviceDynamicManagement = baseDeviceDynamicManagementService.getOne(queryWrapper);
+        if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+            return error("设备动态管理表中没有该相机编码:" + baseCameraManagement.getCameraCode() + "的数据");
+        }
+        LambdaQueryWrapper<MsgAlarm> wrapper1 = new LambdaQueryWrapper<MsgAlarm>();
+        if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+            wrapper1.eq(MsgAlarm::getCameraCode, baseCameraManagement.getCameraCode());
+            wrapper1.orderByDesc(MsgAlarm::getAlarmTime);
+        }
+        List<MsgAlarm> list1 = msgAlarmService.list(wrapper1);
+        List<Object> list = new ArrayList<>();
+        list.add(baseRailwayManagement.getRailwayName());
+        list.add(AppendUtils.stringAppend(baseCameraManagement.getInstallMile()));
+        list.add(baseCameraManagement.getLineDir());
+        list.add(baseCameraManagement.getCameraCode());
+        list.add(baseDeviceDynamicManagement.getElectricity());
+        if (list1.size() <= 0) {
+            list.add(1);
+        } else {
+            MsgAlarm msgAlarm = list1.get(0);
+            list.add(msgAlarm.getIsLock());
+        }
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 台账管理导入
+     *
+     * @param file
+     * @param updateSupport
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation("相机台账管理信息导入")
+    @PostMapping("/importBaseAccountManagement")
+    @Log(title = "相机台账管理", businessType = BusinessType.IMPORT)
+    public AjaxResult importBaseAccountManagement(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelUtil<BaseCameraManagementVos> util = new ExcelUtil<BaseCameraManagementVos>(BaseCameraManagementVos.class);
+        List<BaseCameraManagementVos> accountManageList = util.importExcel(file.getInputStream());
+        String message = baseCameraManagementService.importBaseAccountManagement(accountManageList, updateSupport, getUserId());
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 导出台账管理
+     *
+     * @param response
+     */
+    @ApiOperation("导出相机台账管理信息")
+    @PostMapping("/exportBaseAccountManagement")
+    @Log(title = "相机台账管理", businessType = BusinessType.EXPORT)
+    public void exportBaseAccountManagement(HttpServletResponse response, @RequestBody BaseCameraManagementVo baseCameraManagementVo) {
+        baseCameraManagementVo = (BaseCameraManagementVo) dataScoreUtil.setDataScore(getUserId(), baseCameraManagementVo);
+        if (!ObjectUtils.isEmpty(baseCameraManagementVo.getBeginMile())) {
+                baseCameraManagementVo.setBeginMile(baseCameraManagementVo.getBeginMile() * 1000);
+        }
+        if (!ObjectUtils.isEmpty(baseCameraManagementVo.getEndMile())) {
+                baseCameraManagementVo.setEndMile(baseCameraManagementVo.getEndMile() * 1000);
+        }
+        List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementService.baseCameraManagementList(baseCameraManagementVo);
+        for (BaseCameraManagement baseCameraManagement : baseCameraManagementList) {
+            SysDept sysDept = deptService.selectDeptById(baseCameraManagement.getDeptId());
+            baseCameraManagement.setDeptName(sysDept.getDeptName());
+            LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                queryWrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+            baseCameraManagement.setRailwayName(baseRailwayManagement.getRailwayName());
+            String mils = AppendUtils.stringAppend(baseCameraManagement.getInstallMile());
+            baseCameraManagement.setInstallMiles(mils);
+            String end = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
+            baseCameraManagement.setEndMiles(end);
+            String begin = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
+            baseCameraManagement.setBeginMiles(begin);
+        }
+        ExcelUtil<BaseCameraManagement> util = new ExcelUtil<>(BaseCameraManagement.class);
+        util.exportExcel(response, baseCameraManagementList, "台账管理相机数据");
+    }
+
+
+    @ApiOperation("相机台账管理信息模板下载")
+    @GetMapping("/downloaExcel")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/baseCameraManagement.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "相机台账管理信息模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+    @ApiOperation("查询录像")
+    @GetMapping("/api/records/{cameraCode}")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult apiRecords(@PathVariable @NotNull(message = "相机编码不能为空") String cameraCode) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        lw.eq(BaseCameraManagement::getCameraCode, cameraCode);
+        BaseCameraManagement one = baseCameraManagementService.getOne(lw);
+        if (ObjectUtils.isEmpty(one)) {
+            throw new BaseException("相机编号【" + cameraCode + "】不存在");
+        }
+        return new AjaxResult(200, "ok", CameraUtil.getPlayFlv(cameraCode, one.getChannel()));
+    }
+
+    @ApiOperation("查询录像")
+    @GetMapping("/api/records/{cameraCode}/{flay}")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult apiRecords(@PathVariable @NotNull(message = "相机编码不能为空") String cameraCode,
+                                 @PathVariable @NotNull(message = "条件不能为空") boolean flay) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        lw.eq(BaseCameraManagement::getCameraCode, cameraCode);
+        BaseCameraManagement one = baseCameraManagementService.getOne(lw);
+        if (ObjectUtils.isEmpty(one)) {
+            throw new BaseException("相机编号【" + cameraCode + "】不存在");
+        }
+        return new AjaxResult(200, "ok", CameraUtil.getPlayFlv(cameraCode, one.getChannel(), flay));
+    }
+
+    @ApiOperation("批量查询录像")
+    @GetMapping("/api/recordsList")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult apiRecordsList(@RequestBody
+                                     @NotNull(message = "相机编码不能为空")
+                                             List<String> cameraCodes) {
+        List<String> list = new ArrayList<>();
+        for (String cameraCode : cameraCodes) {
+            LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+            lw.eq(BaseCameraManagement::getCameraCode, cameraCode);
+            BaseCameraManagement one = baseCameraManagementService.getOne(lw);
+            if (ObjectUtils.isEmpty(one)) {
+                throw new BaseException("相机编号【" + cameraCode + "】不存在");
+            }
+            String playFlv = null;
+            if (list.size() > 5) {
+                playFlv = CameraUtil.getPlayFlv(cameraCode, one.getChannel(), false);
+            } else {
+                playFlv = CameraUtil.getPlayFlv(cameraCode, one.getChannel());
+            }
+            list.add(playFlv);
+        }
+
+        return new AjaxResult(200, "ok", list);
+    }
+
+
+    @ApiOperation("播放回放-废弃")
+    @PostMapping("/api/invite")
+    public AjaxResult apiInvite(@Validated @RequestBody BaseCameraResVo vo) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        lw.eq(BaseCameraManagement::getCameraCode, vo.getCameraCode());
+        BaseCameraManagement one = baseCameraManagementService.getOne(lw);
+        if (ObjectUtils.isEmpty(one)) {
+            throw new BaseException("相机编号【" + vo.getCameraCode() + "】不存在");
+        }
+        // CameraUtil.historyPlayList(one.getChannel(), vo.getStartTime(), vo.getEntTime(), caneraConfig.getMappingUrl())
+        return success();
+    }
+
+    @ApiOperation("播放回放")
+    @PostMapping("/api/play")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult play(@Validated @RequestBody BaseCameraResVo vo) {
+        LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+        lw.eq(BaseCameraManagement::getCameraCode, vo.getCameraCode());
+        BaseCameraManagement one = baseCameraManagementService.getOne(lw);
+        if (ObjectUtils.isEmpty(one)) {
+            throw new BaseException("相机编号【" + vo.getCameraCode() + "】不存在");
+        }
+        String path = CameraUtil.historyPlayListStr(one.getChannel(), vo.getStartTime(), vo.getEntTime());
+        if (org.apache.commons.lang3.StringUtils.isBlank(path)) {
+            throw new BaseException("当前相机无视频录像");
+        }
+        return new AjaxResult(200, "ok", serverConfig.getUrl() + path);
+//        return success(CameraUtil.historyPlayList(one.getChannel(), vo.getStartTime(), vo.getEntTime()));
+    }
+
+    @ApiOperation("视频服务设备数量")
+    @GetMapping("/totalNumberOfDevices")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult totalNumberOfDevices() {
+        long count = baseCameraManagementService.count();
+        return success(count);
+    }
+
+    /**
+     * 视频服务树形结构
+     *
+     * @param
+     * @param
+     * @param
+     * @return
+     */
+    @ApiOperation("视频服务树形结构")
+    @PostMapping("/cameraTree")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult cameraTree(@RequestBody CameraTreeVo cameraTreeVo) {
+        cameraTreeVo = (CameraTreeVo) dataScoreUtil.setDataScore(getUserId(), cameraTreeVo);
+        int count = 0;
+        if (!ObjectUtils.isEmpty(cameraTreeVo.getMils())) {
+            cameraTreeVo.setMils(cameraTreeVo.getMils()*1000);
+        }
+        CameraTree cameraTree = baseDeviceDynamicManagementService.cameraTree(cameraTreeVo);
+        List<CameraTree> children = cameraTree.getChildren();
+        children.sort(new Comparator<CameraTree>() {
+            @Override
+            public int compare(CameraTree o1, CameraTree o2) {
+                String name1 = ChineseToPingyin.convertHanziToPinyin(o1.getName());
+                String substring1 = name1.substring(0, 1);
+                String name2 = ChineseToPingyin.convertHanziToPinyin(o2.getName());
+                String substring2 = name2.substring(0, 1);
+                return substring1.compareTo(substring2);
+            }
+        });
+
+
+        for (CameraTree child : children) {
+            List<CameraTree> children1 = child.getChildren();
+            children1.sort(new Comparator<CameraTree>() {
+                @Override
+                public int compare(CameraTree o1, CameraTree o2) {
+                    int i = o1.getMileage() - o2.getMileage();
+                    if (i == 0) {
+                        String[] split = o1.getName().split("-");
+                        return "上行".equals(split[1]) ? -1 : 1;
+                    } else {
+                        return i;
+                    }
+                }
+            });
+            for (CameraTree tree : children1) {
+                List<CameraTree> children2 = tree.getChildren();
+                if (children2.size() < 2) {
+                    String code = children2.get(0).getCode();
+                    tree.setCode(code);
+                    children2.remove(0);
+                } else {
+                    for (CameraTree cameraTree1 : children2) {
+                        count = count + 1;
+                        cameraTree1.setName("相机" + count);
+                    }
+                    count = 0;
+                }
+            }
+        }
+        return success(cameraTree);
+    }
+
+    @ApiOperation("关闭视频录制")
+    @GetMapping("/endRecording/{id}")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult endRecording(@PathVariable Long id) {
+        BaseCameraManagement baseCameraManagement = baseCameraManagementService.getById(id);
+        if (ObjectUtils.isEmpty(baseCameraManagement)) {
+            return error("查不到该ID的相机台账数据!!!");
+        }
+        log.info("endRecording------------" + baseCameraManagement.getTaskId());
+        String start = HttpUtils.sendGet(CameraUtil.endRecording(baseCameraManagement.getTaskId()));
+        log.info("endRecording------------" + start);
+        if ("success".equals(start)) {
+            baseCameraManagement.setStartRecording(2);
+            baseCameraManagement.setTaskId("");
+            baseCameraManagement.setUpdateBy(getUserId());
+        } else {
+            baseCameraManagement.setStartRecording(2);
+            baseCameraManagement.setTaskId("");
+            baseCameraManagement.setUpdateBy(getUserId());
+            log.error("关闭视频录制异常日志如下:" + start);
+        }
+        if (baseCameraManagementService.updateById(baseCameraManagement)) {
+            return success();
+        }
+        return error();
+    }
+
+
+    @ApiOperation("开启视频录制")
+    @GetMapping("/startRecording/{id}")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult startRecording(@PathVariable Long id) {
+        BaseCameraManagement baseCameraManagement = baseCameraManagementService.getById(id);
+        log.info("startRecording------CameraCode------" + baseCameraManagement.getCameraCode());
+        log.info("startRecording------Channel------" + baseCameraManagement.getChannel());
+        String start = HttpUtils.sendGet(CameraUtil.startRecording(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel()));
+        log.info("startRecording------------" + start);
+        if (start.startsWith(baseCameraManagement.getCameraCode() + "/" + baseCameraManagement.getChannel())) {
+            log.info("startRecording 返回成功!!1");
+            baseCameraManagement.setStartRecording(1);
+            baseCameraManagement.setTaskId(start);
+            baseCameraManagement.setUpdateBy(getUserId());
+        } else {
+            return success("开启视频录制失败:请确认流是否存在或流是否开启");
+        }
+        if (baseCameraManagementService.updateById(baseCameraManagement)) {
+            return success();
+        } else {
+            return error("开启视频录制失败");
+        }
+    }
+
+    @GetMapping(value = "/getAlarm/{cameraCode}")
+    @ApiOperation("根据视频ID获取详细信息")
+    @Log(title = "相机台账管理", businessType = BusinessType.MESSAGE)
+    public AjaxResult getAlarm(@PathVariable String cameraCode) {
+        LambdaQueryWrapper<BaseCameraManagement> queryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
+        if (!ObjectUtils.isEmpty(cameraCode)) {
+            queryWrapper.eq(BaseCameraManagement::getCameraCode, cameraCode);
+        }
+        BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(queryWrapper);
+        if (!ObjectUtils.isEmpty(baseCameraManagement)) {
+            LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+            MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+            LambdaQueryWrapper<MsgAlarm> wrapper1 = new LambdaQueryWrapper<MsgAlarm>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getCameraCode())) {
+                wrapper1.eq(MsgAlarm::getCameraCode, baseCameraManagement.getCameraCode());
+                wrapper1.orderByDesc(MsgAlarm::getCreateTime);
+            }
+            List<MsgAlarm> list = msgAlarmService.list(wrapper1);
+            if (list.size() > 0) {
+                MsgAlarm msgAlarm = list.get(0);
+                if (StringUtils.isNotEmpty(msgAlarm.getReleasedBy())) {
+                    BaseUser user = baseUserService.getUser(msgAlarm.getReleasedBy());
+                    msgAlarm.setReleasedByName(user.getNickName());
+                }
+                msgAlarmResp.setAlarmType(msgAlarm.getAlarmType());
+                msgAlarmResp.setIsLock(msgAlarm.getIsLock());
+                msgAlarmResp.setReleasedTime(msgAlarm.getReleasedTime());
+                msgAlarmResp.setAlarmTime(msgAlarm.getAlarmTime());
+                msgAlarmResp.setReleasedType(msgAlarm.getReleasedType());
+                msgAlarmResp.setReleasedReason(msgAlarm.getReleasedReason());
+                msgAlarmResp.setAlarmAttr(msgAlarm.getAlarmAttr());
+                msgAlarmResp.setContent(msgAlarm.getContent());
+                msgAlarmResp.setReleasedByName(msgAlarm.getReleasedByName());
+                if (!StringUtils.isEmpty(msgAlarm.getImageUrl())) {
+                    String[] split = msgAlarm.getImageUrl().split(";");
+                    ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+                    log.info("publish--------" + objects);
+                    msgAlarmResp.setImageUrls(objects);
+                }
+            }
+            BeanUtils.copyProperties(baseCameraManagement, msgAlarmResp);
+            msgAlarmResp.setRailwayName(baseRailwayManagement.getRailwayName());
+            msgAlarmResp.setDeptId(baseCameraManagement.getDeptId());
+            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);
+            msgAlarmResp.setInstallLongitude(baseCameraManagement.getInstallLongitude() + "," + baseCameraManagement.getInstallLatitude());
+            msgAlarmResp.setLineDir(baseCameraManagement.getLineDir());
+            SysDept sysDept = deptService.selectDeptById(baseCameraManagement.getDeptId());
+            msgAlarmResp.setDeptName(sysDept.getDeptName());
+            return AjaxResult.success(msgAlarmResp);
+        } else {
+            return error("该相机编码在相机台账表中不存在");
+        }
+    }
+}
+

+ 287 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseRailwayManagementController.java

@@ -0,0 +1,287 @@
+package com.ozs.web.controller.accountmanagment;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ozs.common.annotation.Log;
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysDictData;
+import com.ozs.common.enums.BusinessType;
+import com.ozs.common.utils.IdempotenceUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.BaseRailwayManagement;
+import com.ozs.entity.vo.BaseRailwayManagementVo;
+import com.ozs.service.BaseCameraManagementService;
+import com.ozs.service.BaseRailwayManagementService;
+import com.ozs.system.service.ISysDictTypeService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 线路管理表前端控制器
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-17
+ */
+@RestController
+@RequestMapping("/service/baseRailwayManagement")
+@Slf4j
+public class BaseRailwayManagementController extends BaseController {
+    @Resource
+    BaseRailwayManagementService baseRailwayManagementService;
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+    @Autowired
+    private BaseCameraManagementService baseCameraManagementService;
+    @Autowired
+    private IdempotenceUtils idempotenceUtils;
+
+    /**
+     * 线路管理表分页
+     *
+     * @param baseRailwayManagementVo
+     * @return
+     */
+    @ApiOperation(value = "线路管理表分页")
+    @PostMapping("/list")
+    @Log(title = "线路台账管理", businessType = BusinessType.SELECT)
+    public AjaxResult selectBaseLineManagement(@RequestBody BaseRailwayManagementVo baseRailwayManagementVo) {
+        LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!StringUtils.isBlank(baseRailwayManagementVo.getRailwayCode())) {
+            lw.like(BaseRailwayManagement::getRailwayCode, "%" + baseRailwayManagementVo.getRailwayCode() + "%");
+        }
+        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);
+        List<SysDictData> data = dictTypeService.selectDictDataByType("railway_type");
+        if (!ObjectUtils.isEmpty(page) && !ObjectUtils.isEmpty(page.getRecords())) {
+            List<BaseRailwayManagement> dto1 = page.getRecords().stream().map(o -> {
+                for (SysDictData datum : data) {
+                    if (datum.getDictValue().equals(o.getRailwayType().toString())) {
+                        o.setRailwayTypeName(datum.getDictLabel());
+                    }
+                }
+                return o;
+            }).collect(Collectors.toList());
+            page.setRecords(dto1);
+        }
+        return AjaxResult.success(page);
+    }
+
+    /**
+     * 删除线路管理表信息
+     *
+     * @param lineIds
+     * @return
+     */
+    @DeleteMapping("/{lineIds}")
+    @ApiOperation("删除线路管理表信息")
+    @Log(title = "线路台账管理", businessType = BusinessType.DELETE)
+    public AjaxResult removeLineManagement(@PathVariable List<Long> lineIds) {
+        for (Long lineId : lineIds) {
+            BaseRailwayManagement baseRailwayManagement1 = baseRailwayManagementService.getById(lineId);
+            if (ObjectUtils.isEmpty(baseRailwayManagement1)) {
+                return error("主键" + lineId + ":不存在");
+            }
+            LambdaQueryWrapper<BaseCameraManagement> wrapper = new LambdaQueryWrapper();
+            wrapper.eq(BaseCameraManagement::getRailwayCode, baseRailwayManagement1.getRailwayCode());
+            List<BaseCameraManagement> list = baseCameraManagementService.list(wrapper);
+            if (list.size() > 0) {
+                return error("主键" + lineId + "已绑定相机,不能删除");
+            }
+        }
+        if (baseRailwayManagementService.removeByIds(lineIds)) {
+            return AjaxResult.success();
+        }
+        return AjaxResult.error();
+    }
+
+    /**
+     * 新增线路管理表信息
+     *
+     * @param baseRailwayManagement
+     * @return
+     */
+    @PostMapping("/saveRailwayManagement")
+    @ApiOperation("新增线路管理表信息")
+    @Log(title = "线路台账管理", businessType = BusinessType.INSERT)
+    public AjaxResult saveLineManagement(@RequestBody BaseRailwayManagement baseRailwayManagement) {
+        String idempotence = idempotenceUtils.getIdempotence(baseRailwayManagement.getRailwayCode());
+        if (StringUtils.isNotEmpty(idempotence)) {
+            return error("你的网络卡顿,请不要一直添加!!!");
+        }
+        idempotenceUtils.createIdempotence(baseRailwayManagement.getRailwayCode());
+
+        LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(baseRailwayManagement.getRailwayCode())) {
+            lw.eq(BaseRailwayManagement::getRailwayCode, baseRailwayManagement.getRailwayCode());
+            BaseRailwayManagement railwayManagement = baseRailwayManagementService.getOne(lw);
+            if (!ObjectUtils.isEmpty(railwayManagement)) {
+                idempotenceUtils.deleteIdempotence(baseRailwayManagement.getRailwayCode());
+                return error("线路编码已存在,不能重复添加");
+            }
+        }
+        if (!ObjectUtils.isEmpty(baseRailwayManagement.getRailwayName())) {
+            lw.eq(BaseRailwayManagement::getRailwayName, baseRailwayManagement.getRailwayName());
+            BaseRailwayManagement railwayManagement = baseRailwayManagementService.getOne(lw);
+            if (!ObjectUtils.isEmpty(railwayManagement)) {
+                idempotenceUtils.deleteIdempotence(baseRailwayManagement.getRailwayCode());
+                return error("线路名称已存在,不能重复添加");
+            }
+        }
+
+        baseRailwayManagement.setCreateBy(getUserId());
+        baseRailwayManagement.setUpdateBy(getUserId());
+        if (baseRailwayManagementService.save(baseRailwayManagement)) {
+            idempotenceUtils.deleteIdempotence(baseRailwayManagement.getRailwayCode());
+            return AjaxResult.success();
+        }
+        idempotenceUtils.deleteIdempotence(baseRailwayManagement.getRailwayCode());
+        return AjaxResult.error();
+    }
+
+    /**
+     * 修改线路管理表信息
+     *
+     * @param baseRailwayManagement
+     * @return
+     */
+    @PutMapping("/editRailwayManagement")
+    @ApiOperation("修改线路管理表信息")
+    @Log(title = "线路台账管理", businessType = BusinessType.UPDATE)
+    public AjaxResult editLineManagement(@RequestBody BaseRailwayManagement baseRailwayManagement) {
+        BaseRailwayManagement baseRailwayManagement1 = baseRailwayManagementService.getById(baseRailwayManagement.getId());
+        if (ObjectUtils.isEmpty(baseRailwayManagement1)) {
+            return error("主键不存在");
+        }
+        LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(baseRailwayManagement.getRailwayCode())) {
+            lw.eq(BaseRailwayManagement::getRailwayCode, baseRailwayManagement.getRailwayCode());
+            BaseRailwayManagement railwayManagement = baseRailwayManagementService.getOne(lw);
+            if (!ObjectUtils.isEmpty(railwayManagement) && !baseRailwayManagement.getId().equals(railwayManagement.getId())) {
+                return error("线路编码已存在,不能进行修改操作");
+            }
+        }
+        if (!ObjectUtils.isEmpty(baseRailwayManagement.getRailwayName())) {
+            lw.eq(BaseRailwayManagement::getRailwayName, baseRailwayManagement.getRailwayName());
+            BaseRailwayManagement railwayManagement = baseRailwayManagementService.getOne(lw);
+            if (!ObjectUtils.isEmpty(railwayManagement) && !baseRailwayManagement.getId().equals(railwayManagement.getId())) {
+                return error("线路名称已存在,不能进行修改操作");
+            }
+        }
+        if (!baseRailwayManagement1.getRailwayCode().equals(baseRailwayManagement.getRailwayCode())) {
+            LambdaQueryWrapper<BaseCameraManagement> wrapper = new LambdaQueryWrapper();
+            wrapper.eq(BaseCameraManagement::getRailwayCode, baseRailwayManagement1.getRailwayCode());
+            List<BaseCameraManagement> list = baseCameraManagementService.list(wrapper);
+            if (list.size() > 0) {
+                return error("当前线路编码已绑定相机,不能修改");
+            }
+        }
+        baseRailwayManagement.setUpdateBy(getUserId());
+        if (baseRailwayManagementService.updateById(baseRailwayManagement)) {
+            return AjaxResult.success();
+        }
+        return AjaxResult.error();
+    }
+
+    @GetMapping(value = "/{id}")
+    @ApiOperation("根据台账ID获取线路管理表详细信息")
+    @Log(title = "线路台账管理", businessType = BusinessType.MESSAGE)
+    public AjaxResult getInfo(@PathVariable Long id) {
+        BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getById(id);
+        List<SysDictData> data = dictTypeService.selectDictDataByType("railway_type");
+        for (SysDictData datum : data) {
+            if (datum.getDictValue().equals(baseRailwayManagement.getRailwayType().toString())) {
+                baseRailwayManagement.setRailwayTypeName(datum.getDictLabel());
+            }
+        }
+        return AjaxResult.success(baseRailwayManagement);
+    }
+
+    /**
+     * 线路管理表信息导入
+     *
+     * @param file
+     * @param updateSupport
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation("线路管理表信息导入")
+    @PostMapping("/importBaseLineManagement")
+    @Log(title = "线路台账管理", businessType = BusinessType.IMPORT)
+    public AjaxResult importBaseLineManagement(MultipartFile file, boolean updateSupport) throws Exception {
+        String message = null;
+        ExcelUtil<BaseRailwayManagement> util = new ExcelUtil<BaseRailwayManagement>(BaseRailwayManagement.class);
+        List<BaseRailwayManagement> accountManageList = util.importExcel(file.getInputStream());
+        log.info("importBaseLineManagement----accountManageList" + accountManageList);
+        message = baseRailwayManagementService.importBaseLineManagement(accountManageList, updateSupport, getUserId());
+        log.info("importBaseLineManagement----message" + message);
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 导出线路管理表信息
+     *
+     * @param response
+     */
+    @ApiOperation("导出线路管理表信息")
+    @PostMapping("/exportBaseLineManagement")
+    @Log(title = "线路台账管理", businessType = BusinessType.EXPORT)
+    public void exportBaseLineManagement(HttpServletResponse response, @RequestBody BaseRailwayManagementVo baseRailwayManagementVo) {
+        LambdaQueryWrapper<BaseRailwayManagement> lw = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!StringUtils.isBlank(baseRailwayManagementVo.getRailwayCode())) {
+            lw.like(BaseRailwayManagement::getRailwayCode, "%" + baseRailwayManagementVo.getRailwayCode() + "%");
+        }
+        if (!ObjectUtils.isEmpty(baseRailwayManagementVo.getRailwayType())) {
+            lw.eq(BaseRailwayManagement::getRailwayType, baseRailwayManagementVo.getRailwayType());
+        }
+        List<BaseRailwayManagement> list = baseRailwayManagementService.list(lw);
+        ExcelUtil<BaseRailwayManagement> util = new ExcelUtil<>(BaseRailwayManagement.class);
+        util.exportExcel(response, list, "线路台账数据");
+    }
+
+    @ApiOperation("线路管理表信息模板下载")
+    @GetMapping("/downloaExcel")
+    @Log(title = "线路台账管理", businessType = BusinessType.OTHER)
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/baseRailwayManagement.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "线路管理表信息导入模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+    /**
+     * 线路下拉
+     */
+    @ApiOperation(value = "线路下拉")
+    @GetMapping("/query")
+    @Log(title = "线路台账管理", businessType = BusinessType.SELECT)
+    public AjaxResult query() {
+        return AjaxResult.success(baseRailwayManagementService.list());
+    }
+
+
+}
+

+ 603 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java

@@ -0,0 +1,603 @@
+package com.ozs.web.controller.accountmanagment;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.annotation.Log;
+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.enums.BusinessType;
+import com.ozs.common.utils.AppendUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.entity.*;
+import com.ozs.entity.vo.*;
+import com.ozs.mapper.MsgAlarmMapper;
+import com.ozs.service.*;
+import com.ozs.system.service.DataScoreUtil;
+import com.ozs.system.service.ISysDeptService;
+import com.ozs.system.service.ISysDictDataService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 报警信息表 前端控制器
+ * </p>
+ *
+ * @author ozs
+ * @since 2023-02-22
+ */
+@RestController
+@RequestMapping("/service/msgAlarm")
+public class MsgAlarmController extends BaseController {
+    private static final Logger log = LoggerFactory.getLogger(MsgAlarmController.class);
+    @Resource
+    MsgAlarmService msgAlarmService;
+    @Resource
+    MsgAlarmMapper msgAlarmMapper;
+    @Resource
+    MsgAlarmFrequencyService msgAlarmFrequencyService;
+    @Autowired
+    BaseCameraManagementService baseCameraManagementService;
+    @Autowired
+    BaseRailwayManagementService baseRailwayManagementService;
+    @Autowired
+    private MsgWebPushService msgWebPushService;
+    @Autowired
+    private ISysDictDataService dictDataService;
+    @Autowired
+    private DataScoreUtil dataScoreUtil;
+    @Resource
+    private BaseUserService baseUserService;
+    @Autowired
+    private ISysDeptService deptService;
+
+    /**
+     * web更多消息-总数,已读数
+     */
+    @PostMapping("/messageMoreNum")
+    @ApiOperation("更多消息--总数,已读数")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult messageMoreNum(@RequestBody MsgAlarmVo msgAlarmVo) {
+        // MsgAlarmVo msgAlarmVo1 = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), msgAlarmVo);
+        Map<String, Integer> messageMore = msgWebPushService.messageMoreNum(getUserId());
+        return AjaxResult.success(messageMore);
+    }
+
+    /**
+     * web更多消息
+     */
+    @PostMapping("/messageMore")
+    @ApiOperation("更多消息")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult messageMore(@RequestBody MsgAlarmVo msgAlarmVo) {
+        // MsgAlarmVo msgAlarmVo1 = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), msgAlarmVo);
+        String userId = getUserId();
+        if (!StringUtils.isEmpty(userId)) {
+            msgAlarmVo.setUserId(userId);
+        }
+        IPage<MsgAlarm> messageMore = msgWebPushService.messageMore(msgAlarmVo);
+        return AjaxResult.success(messageMore);
+    }
+
+    /**
+     * web报警未读消息个数+未读消息列表
+     */
+    @GetMapping("/webAlarm")
+    @ApiOperation("app报警推送次数")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult webAlarmNum() {
+        // MsgAlarmVo msgAlarm = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), new MsgAlarmVo());
+        Map webAlarm = msgWebPushService.webAlarm(getUserId());
+        return AjaxResult.success(webAlarm);
+    }
+
+    /**
+     * web消息全部已读
+     */
+    @PostMapping("/readAll")
+    @ApiOperation(value = "web消息全部已读")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult readAll() {
+        return toAjax(msgWebPushService.readAll(getUserId()));
+    }
+
+    /**
+     * web消息已读
+     */
+    @PostMapping("/read")
+    @ApiOperation(value = "web消息已读")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult read(@RequestBody MsgWebPush msgWebPush) {
+//        if (StringUtils.isEmpty(msgWebPush) || ObjectUtils.isEmpty(msgWebPush.getPushId())) {
+//            return AjaxResult.error("PushId不能为空!");
+//        }
+        return toAjax(msgWebPushService.read(msgWebPush));
+    }
+
+    /**
+     * 报警信息分页
+     *
+     * @param msgAlarmVo
+     * @return
+     */
+    @ApiOperation(value = "报警信息分页")
+    @PostMapping("/list")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult selectMsgAlarm(@RequestBody MsgAlarmVo msgAlarmVo) {
+        msgAlarmVo = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), msgAlarmVo);
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getAlarmMile())) {
+                msgAlarmVo.setAlarmMile(msgAlarmVo.getAlarmMile() * 1000);
+        }
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getBeginMile())) {
+                msgAlarmVo.setBeginMile(msgAlarmVo.getBeginMile() * 1000);
+        }
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getEndMile())) {
+                msgAlarmVo.setEndMile(msgAlarmVo.getEndMile() * 1000);
+        }
+        IPage<MsgAlarm> page = msgAlarmService.queryPage(msgAlarmVo);
+        page.setTotal(page.getTotal());
+        page.setCurrent(page.getCurrent());
+        page.setPages(page.getPages());
+
+        if (!ObjectUtils.isEmpty(page) && page.getRecords().size() > 0) {
+            List<MsgAlarm> dto1 = page.getRecords().stream().map(o -> {
+                String[] split = o.getImageUrl().split(";");
+                ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+                o.setImageUrls(objects);
+                LambdaQueryWrapper<BaseCameraManagement> cameraManagementLambdaQueryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
+                if (!ObjectUtils.isEmpty(o.getCameraCode())) {
+                    cameraManagementLambdaQueryWrapper.eq(BaseCameraManagement::getCameraCode, o.getCameraCode());
+                }
+                BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(cameraManagementLambdaQueryWrapper);
+                LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+                if (!ObjectUtils.isEmpty(cameraManagement.getRailwayCode())) {
+                    queryWrapper.eq(BaseRailwayManagement::getRailwayCode, cameraManagement.getRailwayCode());
+                }
+                BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+                o.setRailwayName(baseRailwayManagement.getRailwayName());
+                if (StringUtils.isNotEmpty(o.getReleasedBy())) {
+                    BaseUser user = baseUserService.getUser(o.getReleasedBy());
+                    o.setReleasedByName(user.getNickName());
+                }
+                String mils = AppendUtils.stringAppend(cameraManagement.getInstallMile());
+                o.setAlarmMiles(mils);
+                String end = AppendUtils.stringAppend(cameraManagement.getEndMile());
+                o.setEndMile(end);
+                String begin = AppendUtils.stringAppend(cameraManagement.getBeginMile());
+                o.setBeginMile(begin);
+                LambdaQueryWrapper<MsgAlarmFrequency> wrapper = new LambdaQueryWrapper<MsgAlarmFrequency>();
+                if (!ObjectUtils.isEmpty(o.getAlarmId())) {
+                    wrapper.eq(MsgAlarmFrequency::getAlarmId, o.getAlarmId());
+                }
+                o.setAlarmCount((int) msgAlarmFrequencyService.count(wrapper));
+                if (!ObjectUtils.isEmpty(o.getReleasedType())) {
+                    o.setReleasedTypeName(o.getReleasedType() == 1 ? "真实报警" : "误报警");
+                }
+                return o;
+            }).collect(Collectors.toList());
+            page.setRecords(dto1);
+        }
+        return AjaxResult.success(page);
+    }
+    
+    /**
+     * 导出报警消息
+     *
+     * @param response
+     */
+    @ApiOperation("导出报警消息")
+    @PostMapping("/exportMsgAlarm")
+    @Log(title = "报警信息管理", businessType = BusinessType.EXPORT)
+    public void exportMsgAlarm(HttpServletResponse response, @RequestBody MsgAlarmVo msgAlarmVo) {
+        msgAlarmVo = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), msgAlarmVo);
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getAlarmMile())) {
+            msgAlarmVo.setAlarmMile(msgAlarmVo.getAlarmMile() * 1000);
+        }
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getBeginMile())) {
+            msgAlarmVo.setBeginMile(msgAlarmVo.getBeginMile() * 1000);
+        }
+        if (!ObjectUtils.isEmpty(msgAlarmVo.getEndMile())) {
+            msgAlarmVo.setEndMile(msgAlarmVo.getEndMile() * 1000);
+        }
+        List<MsgAlarm> msgAlarmList = msgAlarmService.msgAlarmList(msgAlarmVo);
+        for (MsgAlarm msgAlarm : msgAlarmList) {
+            String[] split = msgAlarm.getImageUrl().split(";");
+            ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+            msgAlarm.setImageUrls(objects);
+            LambdaQueryWrapper<BaseCameraManagement> cameraManagementLambdaQueryWrapper = new LambdaQueryWrapper<BaseCameraManagement>();
+            if (!ObjectUtils.isEmpty(msgAlarm.getCameraCode())) {
+                cameraManagementLambdaQueryWrapper.eq(BaseCameraManagement::getCameraCode, msgAlarm.getCameraCode());
+            }
+            BaseCameraManagement cameraManagement = baseCameraManagementService.getOne(cameraManagementLambdaQueryWrapper);
+            LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(cameraManagement.getRailwayCode())) {
+                queryWrapper.eq(BaseRailwayManagement::getRailwayCode, cameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+            msgAlarm.setRailwayName(baseRailwayManagement.getRailwayName());
+            if (StringUtils.isNotEmpty(msgAlarm.getReleasedBy())) {
+                BaseUser user = baseUserService.getUser(msgAlarm.getReleasedBy());
+                msgAlarm.setReleasedByName(user.getNickName());
+            }
+            String mils = AppendUtils.stringAppend(cameraManagement.getInstallMile());
+            msgAlarm.setAlarmMiles(mils);
+            String end = AppendUtils.stringAppend(cameraManagement.getEndMile());
+            msgAlarm.setEndMile(end);
+            String begin = AppendUtils.stringAppend(cameraManagement.getBeginMile());
+            msgAlarm.setBeginMile(begin);
+            LambdaQueryWrapper<MsgAlarmFrequency> wrapper = new LambdaQueryWrapper<MsgAlarmFrequency>();
+            if (!ObjectUtils.isEmpty(msgAlarm.getAlarmId())) {
+                wrapper.eq(MsgAlarmFrequency::getAlarmId, msgAlarm.getAlarmId());
+            }
+            msgAlarm.setAlarmCount((int) msgAlarmFrequencyService.count(wrapper));
+            if (!ObjectUtils.isEmpty(msgAlarm.getReleasedType())) {
+                msgAlarm.setReleasedTypeName(msgAlarm.getReleasedType() == 1 ? "真实报警" : "误报警");
+            }
+            msgAlarm.setLineDirName(msgAlarm.getLineDir() == 1 ? "上行" : "下行");
+            msgAlarm.setIsLockName(msgAlarm.getIsLock() == 1 ? "已解除" : "未解除");
+            msgAlarm.setAlarmTypeName("泥石流");
+        }
+        ExcelUtil<MsgAlarm> util = new ExcelUtil<>(MsgAlarm.class);
+        util.exportExcel(response, msgAlarmList, "报警信息管理");
+    }
+
+    @GetMapping(value = "/getByAlarmId/{alarmId}")
+    @ApiOperation("根据报警信息ID获取详细信息-app")
+    @Log(title = "报警信息管理", businessType = BusinessType.MESSAGE)
+    public AjaxResult getByAlarmId(@PathVariable String alarmId) {
+        MsgAlarm msgAlarm = msgAlarmService.getByAlarmId(alarmId);
+        if (!ObjectUtils.isEmpty(msgAlarm)) {
+            LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+            if (!ObjectUtils.isEmpty(msgAlarm.getCameraCode())) {
+                lw.eq(BaseCameraManagement::getCameraCode, msgAlarm.getCameraCode());
+            }
+            BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+            LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+            MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+            String[] split = msgAlarm.getImageUrl().split(";");
+            ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+            msgAlarm.setImageUrls(objects);
+            if (StringUtils.isNotEmpty(msgAlarm.getReleasedBy())) {
+                BaseUser user = baseUserService.getUser(msgAlarm.getReleasedBy());
+                msgAlarm.setReleasedByName(user.getNickName());
+            }
+            BeanUtils.copyProperties(msgAlarm, msgAlarmResp);
+            msgAlarmResp.setRailwayName(baseRailwayManagement.getRailwayName());
+            msgAlarmResp.setDeptId(baseCameraManagement.getDeptId());
+            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);
+            msgAlarmResp.setInstallLongitude(baseCameraManagement.getInstallLongitude() + "," + baseCameraManagement.getInstallLatitude());
+            return AjaxResult.success(msgAlarmResp);
+        } else {
+            return success("无报警信息数据");
+        }
+    }
+
+    @GetMapping(value = "/{id}")
+    @ApiOperation("根据报警信息ID获取详细信息")
+    @Log(title = "报警信息管理", businessType = BusinessType.MESSAGE)
+    public AjaxResult getInfo(@PathVariable Long id) {
+        MsgAlarm msgAlarm = msgAlarmService.getById(id);
+        if (!ObjectUtils.isEmpty(msgAlarm)) {
+            LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
+            if (!ObjectUtils.isEmpty(msgAlarm.getCameraCode())) {
+                lw.eq(BaseCameraManagement::getCameraCode, msgAlarm.getCameraCode());
+            }
+            BaseCameraManagement baseCameraManagement = baseCameraManagementService.getOne(lw);
+            LambdaQueryWrapper<BaseRailwayManagement> wrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
+                wrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(wrapper);
+            MsgAlarmResp msgAlarmResp = new MsgAlarmResp();
+            String[] split = msgAlarm.getImageUrl().split(";");
+            ArrayList<String> objects = new ArrayList<>(Arrays.asList(split));
+            msgAlarm.setImageUrls(objects);
+            if (StringUtils.isNotEmpty(msgAlarm.getReleasedBy())) {
+                BaseUser user = baseUserService.getUser(msgAlarm.getReleasedBy());
+                msgAlarm.setReleasedByName(user.getNickName());
+            }
+            BeanUtils.copyProperties(msgAlarm, msgAlarmResp);
+            msgAlarmResp.setRailwayName(baseRailwayManagement.getRailwayName());
+            msgAlarmResp.setDeptId(baseCameraManagement.getDeptId());
+            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);
+            msgAlarmResp.setInstallLongitude(baseCameraManagement.getInstallLongitude() + "," + baseCameraManagement.getInstallLatitude());
+            SysDept sysDept = deptService.selectDeptById(baseCameraManagement.getDeptId());
+            msgAlarmResp.setDeptName(sysDept.getDeptName());
+            return AjaxResult.success(msgAlarmResp);
+        } else {
+            return success("无报警信息数据");
+        }
+    }
+
+    @PutMapping(value = "/updateIsLock")
+    @ApiOperation("根据报警信息ID解除报警")
+    @Log(title = "报警信息管理", businessType = BusinessType.UPDATE)
+    public AjaxResult updateIsLock(@RequestParam(value = "id") Long id,
+                                   @RequestParam(value = "releasedType",required = false) Integer releasedType,
+                                   @RequestParam(value = "releasedReason",required = false) String releasedReason) {
+        MsgAlarm msgAlarm = msgAlarmService.getById(id);
+        msgAlarm.setIsLock(1);
+        msgAlarm.setUpdateBy(getUserId());
+        msgAlarm.setReleasedBy(getUserId());
+        msgAlarm.setReleasedTime(new Date());
+        if (!ObjectUtils.isEmpty(msgAlarm.getReleasedReason())) {
+            msgAlarm.setReleasedReason(releasedReason);
+        }
+        if (!ObjectUtils.isEmpty(msgAlarm.getReleasedType())) {
+            msgAlarm.setReleasedType(releasedType);
+        }
+        return AjaxResult.success(msgAlarmService.updateById(msgAlarm));
+    }
+
+    @GetMapping(value = "/alarmHistoricalAlarm/{alarmId}")
+    @ApiOperation("报警消息详情历史报警次数信息")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult alarmHistoricalAlarm(@PathVariable Long alarmId) {
+        QueryWrapper<MsgAlarmFrequency> wrapper = new QueryWrapper<>();
+        wrapper.eq("alarm_id", alarmId);
+        wrapper.orderByDesc("alarm_time");
+        List<MsgAlarmFrequency> list = msgAlarmFrequencyService.list(wrapper);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping(value = "/videoHistoricalAlarm/{cameraCode}")
+    @ApiOperation("视频服务历史报警信息")
+    @Log(title = "报警信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult videoHistoricalAlarm(@PathVariable String cameraCode) {
+        QueryWrapper<MsgAlarm> wrapper = new QueryWrapper<>();
+        wrapper.eq("camera_code", cameraCode);
+        wrapper.orderByDesc("alarm_time");
+        List<MsgAlarm> list = msgAlarmService.list(wrapper);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * web数据统计
+     *
+     * @param alarmStatisticResVo
+     * @return
+     */
+    @Log(title = "报警信息管理", businessType = BusinessType.OTHER)
+    @PostMapping("/dataStatistic")
+    @ApiOperation(value = "web数据统计 报警数据详情")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "currentYear", value = "当前年份"),
+            @ApiImplicitParam(paramType = "query", name = "currentMonth", value = "当前月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public AjaxResult dataStatistic(@RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        Integer pageNum = alarmStatisticResVo.getPageNum().intValue();
+        Integer pageSize = alarmStatisticResVo.getPageSize().intValue();
+        SysUser user = getLoginUser().getUser();
+        String userId = getUserId();
+        if (user.isAdmin(user.getId())) {
+            userId = "";
+        }
+        List<AlarmStatisticVo> list = msgAlarmService.list(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), pageNum, pageSize, userId);
+        if (!ObjectUtils.isEmpty(list)) {
+            list.forEach(l -> {
+                if (!ObjectUtils.isEmpty(l.getAlarmMile())) {
+                    l.setAlarmMile(AppendUtils.stringAppend(Integer.valueOf(l.getAlarmMile())));
+                }
+                if (StringUtils.isNotEmpty(l.getReleasedBy())) {
+                    BaseUser buser = baseUserService.getUser(l.getReleasedBy());
+                    l.setReleasedByName(buser.getNickName());
+                }
+                if (!ObjectUtils.isEmpty(l.getReleasedType())) {
+                    l.setReleasedTypeName(l.getReleasedType() == 1 ? "真实报警" : "误报警");
+                }
+                if (!ObjectUtils.isEmpty(l.getLineDir())) {
+                    l.setLineDirName(l.getLineDir() == 1 ? "上行" : "下行");
+                }
+                if (!ObjectUtils.isEmpty(l.getAlarmType())) {
+                    l.setAlarmTypeName(dictDataService.selectDictLabel("sys_alarm_type", String.valueOf(l.getAlarmType())));
+                }
+                if (!ObjectUtils.isEmpty(l.getIsLock())) {
+                    l.setIsLockName(l.getIsLock() == 1 ? "已解除" : "未解除");
+                }
+            });
+        }
+        IPage page = msgAlarmService.listToPage(list, pageNum, pageSize);
+        return AjaxResult.success(page);
+    }
+
+    /**
+     * web数据统计
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "报警信息管理", businessType = BusinessType.OTHER)
+    @PostMapping("/alarmMonthStatistic")
+    @ApiOperation(value = "web数据统计 报警月统计数据")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "currentYear", value = "当前年份"),
+            @ApiImplicitParam(paramType = "query", name = "currentMonth", value = "当前月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public AjaxResult alarmMonthStatistic(@RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        SysUser user = getLoginUser().getUser();
+        String userId = getUserId();
+        ;
+        if (user.isAdmin(user.getId())) {
+            userId = "";
+        }
+        List<Integer> numbs = new ArrayList<>();
+        Integer listSize;
+        List<AlarmStatisticMonthDto> list = null;
+        if (ObjectUtils.isEmpty(alarmStatisticResVo.getCurrentMonth())) {
+            list = msgAlarmService.getCount(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                    alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+            listSize = 12;
+        } else {
+            if (alarmStatisticResVo.getCurrentMonth().equals(2)) {//2
+                listSize = 28;
+            } else if (alarmStatisticResVo.getCurrentMonth().equals(4) || alarmStatisticResVo.getCurrentMonth().equals(6) ||
+                    alarmStatisticResVo.getCurrentMonth().equals(9) || alarmStatisticResVo.getCurrentMonth().equals(11)) {//4,6,9,11
+                listSize = 30;
+            } else {//1,3,5,7,8,10,12
+                listSize = 31;
+            }
+            list = msgAlarmService.getDayCount(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                    alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        }
+        for (int i = 1; i <= listSize; i++) {
+            numbs.add(i);
+        }
+
+        List<Integer> list1 = new ArrayList<>();
+            if (!CollectionUtils.isEmpty(list) && Objects.nonNull(list.get(0))) {
+                list.forEach(l -> {
+                    list1.add(l.getMonthsta());
+                });
+            }
+            AlarmStatisticMonthDto dto;
+            for (int i = 0; i < numbs.size(); i++) {
+                if (!list1.contains(numbs.get(i))) {
+                    dto = new AlarmStatisticMonthDto();
+                    dto.setMonthsta(numbs.get(i));
+                    dto.setFrequency(0);
+                    list.add(dto);
+                }
+            }
+            if (!CollectionUtils.isEmpty(list) && Objects.nonNull(list.get(0))) {
+                Collections.sort(list, new Comparator<AlarmStatisticMonthDto>() {
+                    @Override
+                    public int compare(AlarmStatisticMonthDto o1, AlarmStatisticMonthDto o2) {
+
+                        return o1.getMonthsta().compareTo(o2.getMonthsta());
+                    }
+                });
+            }
+            return AjaxResult.success(list);
+    }
+
+
+    /**
+     * web数据统计 数据导出
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "报警信息管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportDataStatistic")
+    @ApiOperation(value = "web数据统计-数据导出")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "currentYear", value = "当前年份"),
+            @ApiImplicitParam(paramType = "query", name = "currentMonth", value = "当前月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public void exportDataStatistic(HttpServletResponse response, @RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        SysUser user = getLoginUser().getUser();
+        String userId = getUserId();
+        if (user.isAdmin(user.getId())) {
+            userId = "";
+        }
+        try {
+            List<AlarmStatisticDto> list = msgAlarmService.exportExcel(alarmStatisticResVo, userId);
+            if (!CollectionUtils.isEmpty(list) && Objects.nonNull(list.get(0))) {
+                list.forEach(l -> {
+                    if (!ObjectUtils.isEmpty(l.getAlarmMile())) {
+                        l.setAlarmMiles(AppendUtils.stringAppend(Integer.valueOf(l.getAlarmMile())));
+                    }
+                    if (StringUtils.isNotEmpty(l.getReleasedBy())) {
+                        BaseUser buser = baseUserService.getUser(l.getReleasedBy());
+                        l.setReleasedByName(buser.getNickName());
+                    }
+                    if (!ObjectUtils.isEmpty(l.getReleasedType())) {
+                        l.setReleasedTypeName(l.getReleasedType() == 1 ? "真实报警" : "误报警");
+                    }
+                    if (!ObjectUtils.isEmpty(l.getAlarmType())) {
+                        String alarmType = l.getAlarmType();
+                        String alarmTypeValue = dictDataService.selectDictLabel("sys_alarm_type", alarmType);
+                        l.setAlarmTypeValue(alarmTypeValue);
+                    }
+                    if (!ObjectUtils.isEmpty(l.getLineDir())) {
+                        String lineDir = l.getLineDir();
+                        String lineDirValue = dictDataService.selectDictLabel("sys_line_dir", lineDir);
+                        l.setLineDirValue(lineDirValue);
+                    }
+                    if (!ObjectUtils.isEmpty(l.getIsLock())) {
+                        l.setIsLockName(l.getIsLock() == 1 ? "已解除" : "未解除");
+                    }
+                });
+            }
+
+            ExcelUtil<AlarmStatisticDto> util = new ExcelUtil<>(AlarmStatisticDto.class);
+            util.exportExcel(response, list, "报警数据详情");
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info(e.getMessage());
+        }
+    }
+
+    /**
+     * web数据统计 报警月统计数据导出
+     *
+     * @param
+     * @return
+     */
+    @Log(title = "报警信息管理", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportDataStatisticMonth")
+    @ApiOperation(value = "报警月统计数据导出")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "railwayCode", value = "线路编码"),
+            @ApiImplicitParam(paramType = "query", name = "currentYear", value = "当前年份"),
+            @ApiImplicitParam(paramType = "query", name = "currentMonth", value = "当前月份"),
+            @ApiImplicitParam(paramType = "query", name = "alarmType", value = "灾害类型"),
+    })
+    public void exportDataStatisticMonth(HttpServletResponse response, @RequestBody AlarmStatisticResVo alarmStatisticResVo) {
+        SysUser user = getLoginUser().getUser();
+        String userId = getUserId();
+        if (user.isAdmin(user.getId())) {
+            userId = "";
+        }
+
+        List<AlarmStatisticMonthDto> list = null;
+        if (ObjectUtils.isEmpty(alarmStatisticResVo.getCurrentMonth())) {
+            list = msgAlarmService.getCount(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                    alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        } else {
+            list = msgAlarmService.getDayCount(alarmStatisticResVo.getRailwayCode(), alarmStatisticResVo.getCurrentYear(),
+                    alarmStatisticResVo.getCurrentMonth(), alarmStatisticResVo.getAlarmType(), userId);
+        }
+        ExcelUtil<AlarmStatisticMonthDto> util = new ExcelUtil<>(AlarmStatisticMonthDto.class);
+        util.exportExcel(response, list, "报警月统计数据");
+    }
+}
+