Explorar el Código

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

hexiao hace 2 años
padre
commit
a2889ec53a
Se han modificado 49 ficheros con 2459 adiciones y 244 borrados
  1. 2 0
      .idea/encodings.xml
  2. 12 12
      .idea/jarRepositories.xml
  3. 3 5
      business-service/src/main/java/com/ozs/entity/BaseTerminal.java
  4. 4 6
      business-service/src/main/java/com/ozs/entity/BaseVehicle.java
  5. 20 3
      business-service/src/main/java/com/ozs/entity/BaseVehicleTerminal.java
  6. 1 1
      business-service/src/main/java/com/ozs/entity/SvcAddress.java
  7. 9 0
      business-service/src/main/java/com/ozs/entity/VehiclePosition.java
  8. 42 0
      business-service/src/main/java/com/ozs/entity/VehicleTree.java
  9. 6 1
      business-service/src/main/java/com/ozs/entity/vo/AlarmStatisticDto.java
  10. 61 0
      business-service/src/main/java/com/ozs/entity/vo/BaseVehicleTerminalDto.java
  11. 73 0
      business-service/src/main/java/com/ozs/entity/vo/BaseVehicleTerminalVo.java
  12. 8 0
      business-service/src/main/java/com/ozs/entity/vo/HeartbeatVo.java
  13. 11 0
      business-service/src/main/java/com/ozs/entity/vo/ParameterVo.java
  14. 33 0
      business-service/src/main/java/com/ozs/entity/vo/VehicleTreeVo.java
  15. 10 1
      business-service/src/main/java/com/ozs/mapper/BaseDeviceDynamicManagementMapper.java
  16. 6 0
      business-service/src/main/java/com/ozs/mapper/BaseTerminalMapper.java
  17. 10 2
      business-service/src/main/java/com/ozs/service/BaseDeviceDynamicManagementService.java
  18. 22 0
      business-service/src/main/java/com/ozs/service/BaseVehicleService.java
  19. 16 0
      business-service/src/main/java/com/ozs/service/BaseVehicleTerminalService.java
  20. 1 0
      business-service/src/main/java/com/ozs/service/impl/BaseCameraManagementServiceImpl.java
  21. 81 0
      business-service/src/main/java/com/ozs/service/impl/BaseDeviceDynamicManagementServiceImpl.java
  22. 193 1
      business-service/src/main/java/com/ozs/service/impl/BaseVehicleServiceImpl.java
  23. 171 1
      business-service/src/main/java/com/ozs/service/impl/BaseVehicleTerminalServiceImpl.java
  24. 42 9
      business-service/src/main/resources/mapper/BaseDeviceDynamicManagementMapper.xml
  25. 7 0
      business-service/src/main/resources/mapper/BaseTerminalMapper.xml
  26. 34 9
      vehicle-admin/pom.xml
  27. 18 18
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java
  28. 0 2
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseRailwayManagementController.java
  29. 218 13
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseVehicleController.java
  30. 149 7
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseVehicleTerminalController.java
  31. 7 0
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/DataStatisticController.java
  32. 9 10
      vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java
  33. 40 0
      vehicle-admin/src/main/java/com/ozs/web/controller/home/HomeController.java
  34. 23 19
      vehicle-admin/src/main/java/com/ozs/web/controller/monitor/SysLoginInfoController.java
  35. 21 20
      vehicle-admin/src/main/java/com/ozs/web/controller/monitor/SysOperlogController.java
  36. 382 85
      vehicle-admin/src/main/java/com/ozs/web/controller/sdk/GeoHazardMonitorTokenController.java
  37. 44 4
      vehicle-admin/src/main/java/com/ozs/web/controller/sdk/UploadController.java
  38. 4 3
      vehicle-admin/src/main/java/com/ozs/web/controller/system/SysDeptController.java
  39. 1 1
      vehicle-admin/src/main/java/com/ozs/web/controller/system/SysDictDataController.java
  40. 2 1
      vehicle-admin/src/main/java/com/ozs/web/controller/system/SysRoleController.java
  41. 2 1
      vehicle-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java
  42. 470 0
      vehicle-admin/src/main/java/com/ozs/web/controller/websocket/JPushUtil.java
  43. 21 0
      vehicle-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketConfig.java
  44. 140 0
      vehicle-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketServer.java
  45. 2 1
      vehicle-admin/src/main/java/com/ozs/web/core/config/CaneraConfig.java
  46. 27 7
      vehicle-admin/src/main/java/com/ozs/web/core/util/CameraUtil.java
  47. 1 1
      vehicle-admin/src/main/resources/application.yml
  48. BIN
      vehicle-admin/src/main/resources/template/BaseVehicle.xlsx
  49. BIN
      vehicle-admin/src/main/resources/template/BaseVehicleTerminal.xlsx

+ 2 - 0
.idea/encodings.xml

@@ -3,6 +3,8 @@
   <component name="Encoding">
     <file url="file://$PROJECT_DIR$/business-service/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/business-service/src/main/resources" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/vehicle-admin/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/vehicle-admin/src/main/resources" charset="UTF-8" />
   </component>

+ 12 - 12
.idea/jarRepositories.xml

@@ -1,16 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="RemoteRepositoriesConfiguration">
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Central Repository" />
-      <option name="url" value="https://maven.aliyun.com/repository/public" />
-    </remote-repository>
-    <remote-repository>
-      <option name="id" value="central" />
-      <option name="name" value="Central Repository" />
-      <option name="url" value="https://repo.maven.apache.org/maven2" />
-    </remote-repository>
     <remote-repository>
       <option name="id" value="public" />
       <option name="name" value="aliyun nexus" />
@@ -18,8 +8,8 @@
     </remote-repository>
     <remote-repository>
       <option name="id" value="central" />
-      <option name="name" value="Maven Central repository" />
-      <option name="url" value="https://repo1.maven.org/maven2" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
     </remote-repository>
     <remote-repository>
       <option name="id" value="central" />
@@ -36,6 +26,11 @@
       <option name="name" value="Central Repository" />
       <option name="url" value="http://maven.aliyun.com/nexus/content/repositories/central/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
     <remote-repository>
       <option name="id" value="custom_group" />
       <option name="name" value="Nexus Repository" />
@@ -46,5 +41,10 @@
       <option name="name" value="JBoss Community repository" />
       <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://maven.aliyun.com/repository/public" />
+    </remote-repository>
   </component>
 </project>

+ 3 - 5
business-service/src/main/java/com/ozs/entity/BaseTerminal.java

@@ -2,12 +2,12 @@ package com.ozs.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.io.Serializable;
-import java.util.Date;
-
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.util.Date;
+
 /**
  * <p>
  * 机车车载终端关联表
@@ -62,6 +62,4 @@ public class BaseTerminal implements Serializable {
      * 备注
      */
     private String remark;
-
-
 }

+ 4 - 6
business-service/src/main/java/com/ozs/entity/BaseVehicle.java

@@ -2,6 +2,7 @@ package com.ozs.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.ozs.common.annotation.Excel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -25,17 +26,19 @@ public class BaseVehicle implements Serializable {
     /**
      * 主键ID
      */
-      @TableId(value = "id", type = IdType.AUTO)
+    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**
      * 机车编码
      */
+    @Excel(name = "机车编码")
     private String vehicleCode;
 
     /**
      * 机车名称
      */
+    @Excel(name = "机车名称")
     private String vehicleName;
 
     /**
@@ -62,9 +65,4 @@ public class BaseVehicle implements Serializable {
      * 备注
      */
     private String remark;
-
-    /**
-     * 挂载终端ID terminal_id
-     */
-    private long terminalId;
 }

+ 20 - 3
business-service/src/main/java/com/ozs/entity/BaseVehicleTerminal.java

@@ -1,13 +1,15 @@
 package com.ozs.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.io.Serializable;
-import java.util.Date;
-
+import com.ozs.common.annotation.Excel;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.io.Serializable;
+import java.util.Date;
+
 /**
  * <p>
  * 机车车载终端信息表
@@ -31,17 +33,22 @@ public class BaseVehicleTerminal implements Serializable {
     /**
      * 终端编码
      */
+    @Excel(name = "终端编码")
     private String terminalCode;
 
     /**
      * 终端名称
      */
+    @Excel(name = "终端名称")
     private String terminalName;
 
     /**
      * 状态 1在线2离线
      */
     private Integer status;
+    @Excel(name = "状态")
+    @TableField(exist = false)
+    private String statusStr;
 
     /**
      * 创建者
@@ -68,5 +75,15 @@ public class BaseVehicleTerminal implements Serializable {
      */
     private String remark;
 
+    /**
+     * 终端经度
+     */
+    @Excel(name = "终端经度")
+    private String terminalLongitude;
 
+    /**
+     * 终端纬度
+     */
+    @Excel(name = "终端纬度")
+    private String terminalLatitude;
 }

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

@@ -30,7 +30,7 @@ public class SvcAddress implements Serializable {
     /**
      * 授权类型,客户端模式(client_credentials)
      */
-    private String grantType;
+    private Integer grantType;
 
     /**
      * 主键

+ 9 - 0
business-service/src/main/java/com/ozs/entity/VehiclePosition.java

@@ -113,4 +113,13 @@ public class VehiclePosition implements Serializable {
     @TableField(exist = false)
     @Excel(name = "车载状态",readConverterExp = "1=在线,2=离线")
     private String status;
+
+    /**
+     * 终端经度
+     */
+    private String terminalLongitude;
+    /**
+     * 终端纬度
+     */
+    private String terminalLatitude;
 }

+ 42 - 0
business-service/src/main/java/com/ozs/entity/VehicleTree.java

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

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

@@ -70,9 +70,14 @@ public class AlarmStatisticDto {
     /**
      * 框定范围
      */
-    @Excel(name = "框定范围")
     private String alarmAttr;
 
+    /**
+     * 报警病害属性(可以给出泥石流的框定范围)字符串
+     */
+    @Excel(name = "报警病害属性")
+    private String alarmAttrString;
+
     /**
      * 报警是否解除 1已解除2未解除
      */

+ 61 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseVehicleTerminalDto.java

@@ -0,0 +1,61 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 车载终端和日志信息表
+ */
+@Data
+public class BaseVehicleTerminalDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    /**
+     * 终端编码
+     */
+    private String terminalCode;
+
+    /**
+     * 机车编码
+     */
+    private String vehicleCode;
+    /**
+     * 机车名称
+     */
+    private String vehicleName;
+
+    /**
+     * 行别
+     */
+    private String lineDir;
+
+    /**
+     * 车辆行驶位置
+     */
+    private Integer travelMile;
+
+    /**
+     * 车辆所在经度
+     */
+    private String terminalLongitude;
+
+    /**
+     * 车辆所在纬度
+     */
+    private String terminalLatitude;
+
+    /**
+     * 线路名称
+     */
+    private String railwayName;
+
+    /**
+     * 线路编码(四位数字)
+     */
+    private String railwayCode;
+}

+ 73 - 0
business-service/src/main/java/com/ozs/entity/vo/BaseVehicleTerminalVo.java

@@ -0,0 +1,73 @@
+package com.ozs.entity.vo;
+
+import com.ozs.common.vo.PageVo;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author : sunhh
+ * @create 2023/4/19 14:12
+ */
+@Data
+public class BaseVehicleTerminalVo extends PageVo {
+    /**
+     * 是否挂载 1未挂载,2挂载
+     */
+    private String isMount;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 终端编码
+     */
+    private String terminalCode;
+
+    /**
+     * 终端名称
+     */
+    private String terminalName;
+
+    /**
+     * 状态 1在线2离线
+     */
+    private Integer status;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 终端经度
+     */
+    private String terminalLongitude;
+
+    /**
+     * 终端纬度
+     */
+    private String terminalLatitude;
+}

+ 8 - 0
business-service/src/main/java/com/ozs/entity/vo/HeartbeatVo.java

@@ -14,6 +14,14 @@ public class HeartbeatVo implements Serializable {
      * 车载终端编码
      */
     private String terminalCode;
+    /**
+     * 机车编码
+     */
+    private String vehicleCode;
+    /**
+     * 机车名称
+     */
+    private String vehicleName;
     /**
      * 当前里程位置,单位m
      */

+ 11 - 0
business-service/src/main/java/com/ozs/entity/vo/ParameterVo.java

@@ -0,0 +1,11 @@
+package com.ozs.entity.vo;
+
+import lombok.Data;
+
+/**
+ * @author Administrator
+ */
+@Data
+public class ParameterVo {
+    private  String parameter;
+}

+ 33 - 0
business-service/src/main/java/com/ozs/entity/vo/VehicleTreeVo.java

@@ -0,0 +1,33 @@
+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 : buzy
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class VehicleTreeVo extends PageVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+     * 线路
+     */
+    private String railwayCode;
+
+    /**
+     * 行别
+     */
+    private Integer lineDir;
+
+    /**
+     * 里程位置
+     */
+    private Integer mils;
+}

+ 10 - 1
business-service/src/main/java/com/ozs/mapper/BaseDeviceDynamicManagementMapper.java

@@ -3,7 +3,9 @@ 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.BaseVehicleTerminalDto;
 import com.ozs.entity.vo.CameraTreeVo;
+import com.ozs.entity.vo.VehicleTreeVo;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -18,6 +20,13 @@ import java.util.List;
  */
 @Mapper
 public interface BaseDeviceDynamicManagementMapper extends BaseMapper<BaseDeviceDynamicManagement> {
-
+    /**
+     * 查相机关联数据
+     */
     List<BaseCameraManagementDto> list(CameraTreeVo cameraTreeVo);
+
+    /**
+     * 查相机关联数据
+     */
+    List<BaseVehicleTerminalDto> vehicleTreelist(VehicleTreeVo vehicleTreeVo);
 }

+ 6 - 0
business-service/src/main/java/com/ozs/mapper/BaseTerminalMapper.java

@@ -2,6 +2,9 @@ package com.ozs.mapper;
 
 import com.ozs.entity.BaseTerminal;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface BaseTerminalMapper extends BaseMapper<BaseTerminal> {
 
+    List<String> selectMountCode(@Param("vehicleCode") String vehicleCode);
+
+    BaseTerminal selectTerminal(@Param("vehicleCode") String vehicleCode);
 }

+ 10 - 2
business-service/src/main/java/com/ozs/service/BaseDeviceDynamicManagementService.java

@@ -3,17 +3,25 @@ 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.VehicleTree;
 import com.ozs.entity.vo.CameraTreeVo;
+import com.ozs.entity.vo.VehicleTreeVo;
 
 /**
- * <p>
  * 设备动态管理表 服务类
- * </p>
  *
  * @author ozs
  * @since 2023-02-22
  */
 public interface BaseDeviceDynamicManagementService extends IService<BaseDeviceDynamicManagement> {
 
+    /**
+     * 编织相机树
+     */
     CameraTree cameraTree(CameraTreeVo cameraTreeVo);
+
+    /**
+     * 编织机车树
+     */
+    VehicleTree vehicleTree(VehicleTreeVo vehicleTreeVo);
 }

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

@@ -3,9 +3,14 @@ package com.ozs.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.entity.BaseTerminal;
 import com.ozs.entity.BaseVehicle;
+import com.ozs.entity.vo.BaseVehicleTerminalDto;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
 import com.ozs.entity.vo.BaseVehicleVo;
 
+import java.util.List;
+
 /**
  * <p>
  * 机车信息表 服务类
@@ -21,4 +26,21 @@ public interface BaseVehicleService extends IService<BaseVehicle> {
     AjaxResult vehicleAdd(BaseVehicle baseVehicle, String userId);
 
     AjaxResult vehicleUpdate(BaseVehicle baseVehicle, String userId);
+
+    String importBaseVehicle(List<BaseVehicle> accountManageList, boolean updateSupport, String userId);
+
+    AjaxResult vehicleDetails(BaseVehicle baseVehicle);
+
+    List<BaseVehicle> exportBaseVehicle(BaseVehicle baseVehicle);
+
+    IPage<BaseVehicleTerminalVo> vehicleTerminal(BaseVehicleVo baseVehicle);
+
+    AjaxResult vehicleTerminalAdd(BaseTerminal baseTerminal, String userId);
+
+    Boolean isMount(BaseVehicleVo baseVehicleVo);
+
+    /**
+     * /列表,不分页
+     */
+    List<BaseVehicleTerminalDto> vehicleList();
 }

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

@@ -1,7 +1,12 @@
 package com.ozs.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.entity.BaseVehicleTerminal;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,15 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface BaseVehicleTerminalService extends IService<BaseVehicleTerminal> {
 
+    IPage<BaseVehicleTerminal> vehicleTerminalList(BaseVehicleTerminalVo baseVehicleTerminalleVo);
+
+    AjaxResult baseVehicleTerminalDetails(BaseVehicleTerminalVo baseVehicleTerminalVo);
+
+    AjaxResult vehicleTerminalAdd(BaseVehicleTerminal baseVehicleTerminal, String userId);
+
+    AjaxResult vehicleTerminalUpdate(BaseVehicleTerminal baseVehicleTerminal, String userId);
+
+    String importBaseVehicleTerminal(List<BaseVehicleTerminal> accountManageList, boolean updateSupport, String userId);
+
+    List<BaseVehicleTerminal> exportBaseVehicleTerminal(BaseVehicleTerminal baseVehicleTerminal);
 }

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

@@ -249,6 +249,7 @@ public class BaseCameraManagementServiceImpl extends ServiceImpl<BaseCameraManag
      * @param userId
      * @return
      */
+    @Override
     public List<String> getUserIdList(String userId) {
         BaseUser baseUser = baseUserService.getUser(userId);
         if (StringUtils.isNull(baseUser) || StringUtils.isNull(baseUser.getDataPermission())

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

@@ -1,12 +1,18 @@
 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.utils.AppendUtils;
 import com.ozs.entity.BaseDeviceDynamicManagement;
+import com.ozs.entity.BaseRailwayManagement;
 import com.ozs.entity.CameraTree;
+import com.ozs.entity.VehicleTree;
 import com.ozs.entity.vo.BaseCameraManagementDto;
+import com.ozs.entity.vo.BaseVehicleTerminalDto;
 import com.ozs.entity.vo.CameraTreeVo;
+import com.ozs.entity.vo.VehicleTreeVo;
 import com.ozs.mapper.BaseDeviceDynamicManagementMapper;
+import com.ozs.mapper.BaseRailwayManagementMapper;
 import com.ozs.service.BaseDeviceDynamicManagementService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -30,6 +36,8 @@ import java.util.stream.Collectors;
 public class BaseDeviceDynamicManagementServiceImpl extends ServiceImpl<BaseDeviceDynamicManagementMapper, BaseDeviceDynamicManagement> implements BaseDeviceDynamicManagementService {
     @Autowired
     BaseDeviceDynamicManagementMapper baseDeviceDynamicManagementMapper;
+    @Autowired
+    BaseRailwayManagementMapper railwayManagementMapper;
 
     @Override
     public CameraTree cameraTree(CameraTreeVo cameraTreeVo) {
@@ -98,4 +106,77 @@ public class BaseDeviceDynamicManagementServiceImpl extends ServiceImpl<BaseDevi
 
         return cameraTree;
     }
+
+    @Override
+    public VehicleTree vehicleTree(VehicleTreeVo vehicleTreeVo) {
+        // 线路
+        LambdaQueryWrapper<BaseRailwayManagement> rp = new LambdaQueryWrapper();
+        List<BaseRailwayManagement> railwayList = railwayManagementMapper.selectList(rp);
+        //1 父
+        VehicleTree vehicleTree = VehicleTree.builder()
+                .name("机车树")
+                .code("0")
+                .flay(false)
+                .children(new ArrayList<>())
+                .build();
+
+        Map<String, VehicleTree> map = new HashMap<>();
+        List<BaseVehicleTerminalDto> list = baseDeviceDynamicManagementMapper.vehicleTreelist(vehicleTreeVo);
+        if (list.size() > 0) {
+            for (BaseVehicleTerminalDto o : list) {
+
+                VehicleTree build = VehicleTree.builder()
+                        .code(o.getRailwayCode())
+                        .flay(true)
+                        .children(new ArrayList<>())
+                        .build();
+                for (BaseRailwayManagement railway : railwayList) {
+                    if (railway.getRailwayCode().equals(build.getCode())) {
+                        build.setName(railway.getRailwayName());
+                        break;
+                    }
+                }
+                if (!vehicleTree.getChildren().stream()
+                        .map(VehicleTree::getCode)
+                        .collect(Collectors.toList())
+                        .contains(build.getCode())) {
+                    vehicleTree.getChildren().add(build);
+                    map.put(o.getRailwayCode(), build);
+                }
+                // 里程
+                String mils = AppendUtils.stringAppend(o.getTravelMile());
+                VehicleTree build1 = VehicleTree.builder()
+                        .code(mils + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"))
+                        .name(mils + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"))
+                        .flay(true)
+                        .mileage(o.getTravelMile())
+                        .children(new ArrayList<>())
+                        .build();
+
+
+                if (!ObjectUtils.isEmpty(map.get(o.getRailwayCode()))) {
+                    VehicleTree vehicleTree1 = map.get(o.getTravelMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"));
+                    if (ObjectUtils.isEmpty(vehicleTree1)) {
+                        map.put(o.getTravelMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行"), build1);
+                        map.get(o.getRailwayCode()).getChildren().add(build1);
+                    }
+                }
+
+                // 摄像头
+                VehicleTree build2 = VehicleTree.builder()
+                        .code(o.getTerminalCode())
+                        .name(o.getTerminalCode())
+                        .flay(true)
+                        .children(new ArrayList<>())
+                        .build();
+
+
+                if (!ObjectUtils.isEmpty(map.get(o.getTravelMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行")))) {
+                    map.get(o.getTravelMile() + "-" + (o.getLineDir().equals("1") ? "上行" : "下行")).getChildren().add(build2);
+                }
+            }
+        }
+
+        return vehicleTree;
+    }
 }

+ 193 - 1
business-service/src/main/java/com/ozs/service/impl/BaseVehicleServiceImpl.java

@@ -5,16 +5,30 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.exception.ServiceException;
 import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanUtils;
+import com.ozs.common.utils.bean.BeanValidators;
+import com.ozs.entity.BaseTerminal;
 import com.ozs.entity.BaseVehicle;
+import com.ozs.entity.BaseVehicleTerminal;
+import com.ozs.entity.vo.BaseCameraManagementDto;
+import com.ozs.entity.vo.BaseVehicleTerminalDto;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
 import com.ozs.entity.vo.BaseVehicleVo;
+import com.ozs.mapper.BaseDeviceDynamicManagementMapper;
+import com.ozs.mapper.BaseTerminalMapper;
 import com.ozs.mapper.BaseVehicleMapper;
+import com.ozs.mapper.BaseVehicleTerminalMapper;
 import com.ozs.service.BaseVehicleService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
+import javax.validation.Validator;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -29,6 +43,14 @@ public class BaseVehicleServiceImpl extends ServiceImpl<BaseVehicleMapper, BaseV
 
     @Autowired
     private BaseVehicleMapper baseVehicleMapper;
+    @Autowired
+    private BaseTerminalMapper baseTerminalMapper;
+    @Autowired
+    BaseDeviceDynamicManagementMapper baseDeviceDynamicManagementMapper;
+    @Autowired
+    private BaseVehicleTerminalMapper baseVehicleTerminalMapper;
+    @Autowired
+    protected Validator validator;
 
     @Override
     public IPage<BaseVehicle> vehicleList(BaseVehicleVo baseVehicle) {
@@ -75,7 +97,7 @@ public class BaseVehicleServiceImpl extends ServiceImpl<BaseVehicleMapper, BaseV
 
     @Override
     public AjaxResult vehicleUpdate(BaseVehicle baseVehicle, String userId) {
-        LambdaQueryWrapper<BaseVehicle> wrapper = new LambdaQueryWrapper<BaseVehicle>();
+        LambdaQueryWrapper<BaseVehicle> wrapper = new LambdaQueryWrapper<>();
         if (!StringUtils.isEmptySunhh(baseVehicle) && !StringUtils.isEmptySunhh(baseVehicle.getVehicleCode())) {
             wrapper.eq(BaseVehicle::getVehicleCode, baseVehicle.getVehicleCode());
         }
@@ -92,4 +114,174 @@ public class BaseVehicleServiceImpl extends ServiceImpl<BaseVehicleMapper, BaseV
             return AjaxResult.error();
         }
     }
+
+    @Override
+    public String importBaseVehicle(List<BaseVehicle> accountManageList, boolean updateSupport, String userId) {
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (BaseVehicle baseVehicle2 : accountManageList) {
+            try {
+                BaseVehicle baseVehicle = new BaseVehicle();
+                BeanUtils.copyProperties(baseVehicle2, baseVehicle);
+                // 判断机车编码是否存在
+                LambdaQueryWrapper<BaseVehicle> lw = new LambdaQueryWrapper<BaseVehicle>();
+                if (!StringUtils.isEmptySunhh(baseVehicle.getVehicleCode())) {
+                    lw.eq(BaseVehicle::getVehicleCode, baseVehicle.getVehicleCode());
+                }
+                BaseVehicle baseVehicle1 = baseVehicleMapper.selectOne(lw);
+                if (StringUtils.isEmptySunhh(baseVehicle1)) {
+                    BeanValidators.validateWithException(validator, baseVehicle);
+                    baseVehicle.setUpdateBy(userId);
+                    baseVehicle.setCreateBy(userId);
+                    Date date = new Date();
+                    baseVehicle.setCreateTime(date);
+                    baseVehicle.setUpdateTime(date);
+                    int insert = baseVehicleMapper.insert(baseVehicle);
+                    successNum++;
+                    successMsg.append(successNum + "、机车编码 " + baseVehicle.getVehicleCode() + " 导入成功");
+                } else if (updateSupport) {
+                    BeanValidators.validateWithException(validator, baseVehicle);
+                    LambdaQueryWrapper<BaseVehicle> lambdaQueryWrapper = new LambdaQueryWrapper<BaseVehicle>();
+                    if (!StringUtils.isEmptySunhh(baseVehicle.getVehicleCode())) {
+                        lambdaQueryWrapper.eq(BaseVehicle::getVehicleCode, baseVehicle.getVehicleCode());
+                    }
+                    BaseVehicle baseVehicle4 = baseVehicleMapper.selectOne(lambdaQueryWrapper);
+                    if (StringUtils.isEmptySunhh(baseVehicle4)) {
+                        baseVehicle.setUpdateBy(userId);
+                        baseVehicle.setUpdateTime(new Date());
+                        baseVehicle.setId(baseVehicle4.getId());
+                        baseVehicleMapper.updateById(baseVehicle);
+                        successNum++;
+                        successMsg.append(successNum + "、机车编码 " + baseVehicle.getVehicleCode() + " 更新成功");
+                    } else {
+                        failureNum++;
+                        failureMsg.append(failureNum + "、机车编码 " + baseVehicle.getVehicleCode() + "不存在");
+                    }
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = failureNum + "、机车编码 " + baseVehicle2.getVehicleCode() + " 导入失败:";
+                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 AjaxResult vehicleDetails(BaseVehicle baseVehicle) {
+        BaseVehicle baseVehicle1 = baseVehicleMapper.selectById(baseVehicle.getId());
+        return AjaxResult.success(baseVehicle1);
+    }
+
+    @Override
+    public List<BaseVehicle> exportBaseVehicle(BaseVehicle baseVehicle) {
+        LambdaQueryWrapper<BaseVehicle> wrapper = new LambdaQueryWrapper<>();
+        if (!StringUtils.isEmptySunhh(baseVehicle) && !StringUtils.isEmptySunhh(baseVehicle.getVehicleName())) {
+            wrapper.eq(BaseVehicle::getVehicleName, baseVehicle.getVehicleName());
+        }
+        if (!StringUtils.isEmptySunhh(baseVehicle) && !StringUtils.isEmptySunhh(baseVehicle.getVehicleCode())) {
+            wrapper.eq(BaseVehicle::getVehicleCode, baseVehicle.getVehicleCode());
+        }
+        List<BaseVehicle> baseVehicles = baseVehicleMapper.selectList(wrapper);
+        return baseVehicles;
+    }
+
+    @Override
+    public IPage<BaseVehicleTerminalVo> vehicleTerminal(BaseVehicleVo baseVehicleVo) {
+        BaseTerminal baseTerminal = baseTerminalMapper.selectTerminal(baseVehicleVo.getVehicleCode());
+        List<String> terminalCodeList = baseTerminalMapper.selectMountCode(baseVehicleVo.getVehicleCode());
+        // List<String> collect = terminalCodeList.stream().map(BaseTerminal::getTerminalCode).collect(Collectors.toList());
+        LambdaQueryWrapper<BaseVehicleTerminal> wrapper = new LambdaQueryWrapper<>();
+        if (!StringUtils.isEmptySunhh(terminalCodeList) && terminalCodeList.size() > 0) {
+            wrapper.notIn(BaseVehicleTerminal::getTerminalCode, terminalCodeList);
+        }
+//        List<BaseVehicleTerminal> baseVehicleTerminalList = baseVehicleTerminalMapper.selectList(wrapper);
+        int pageNum = Integer.parseInt(baseVehicleVo.getPageNum().toString());
+        int pageSize = Integer.parseInt(baseVehicleVo.getPageSize().toString());
+        com.github.pagehelper.Page<BaseVehicleTerminal> page = PageHelper
+                .startPage(pageNum, pageSize).doSelectPage(() -> baseVehicleTerminalMapper.selectList(wrapper));
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<BaseVehicleTerminalVo> pageR =
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize);
+        if (!ObjectUtils.isEmpty(page) && page.getResult().size() > 0) {
+            List<BaseVehicleTerminalVo> dto1 = page.getResult().stream().map(o -> {
+                BaseVehicleTerminalVo baseVehicleTerminalVo = new BaseVehicleTerminalVo();
+                BeanUtils.copyProperties(o, baseVehicleTerminalVo);
+                if (baseTerminal.getTerminalCode().equals(o.getTerminalCode())) {
+                    baseVehicleTerminalVo.setIsMount("2");
+                } else {
+                    baseVehicleTerminalVo.setIsMount("1");
+                }
+                return baseVehicleTerminalVo;
+            }).collect(Collectors.toList());
+            pageR.setRecords(dto1);
+        }
+        return pageR;
+    }
+
+    @Override
+    public AjaxResult vehicleTerminalAdd(BaseTerminal baseTerminal1, String userId) {
+        LambdaQueryWrapper<BaseTerminal> wrapper = new LambdaQueryWrapper<>();
+        if (!StringUtils.isEmptySunhh(baseTerminal1) && !StringUtils.isEmptySunhh(baseTerminal1.getVehicleCode())) {
+            wrapper.eq(BaseTerminal::getVehicleCode, baseTerminal1.getVehicleCode());
+        }
+        BaseTerminal baseTerminal = baseTerminalMapper.selectOne(wrapper);
+        if (StringUtils.isEmptySunhh(baseTerminal)) {
+            BaseTerminal baseTerminal2 = new BaseTerminal();
+            baseTerminal2.setVehicleCode(baseTerminal1.getVehicleCode());
+            baseTerminal2.setTerminalCode(baseTerminal1.getTerminalCode());
+            baseTerminal2.setCreateBy(userId);
+            baseTerminal2.setUpdateBy(userId);
+            Date date = new Date();
+            baseTerminal2.setCreateTime(date);
+            baseTerminal2.setUpdateTime(date);
+            int insert = baseTerminalMapper.insert(baseTerminal2);
+        } else {
+            baseTerminal.setUpdateBy(userId);
+            baseTerminal.setUpdateTime(new Date());
+            baseTerminal.setVehicleCode(baseTerminal1.getVehicleCode());
+            baseTerminal.setTerminalCode(baseTerminal1.getTerminalCode());
+            int updateById = baseTerminalMapper.updateById(baseTerminal);
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    public Boolean isMount(BaseVehicleVo baseVehicleVo) {
+        LambdaQueryWrapper<BaseTerminal> wrapper = new LambdaQueryWrapper<>();
+        if (!StringUtils.isEmptySunhh(baseVehicleVo) && !StringUtils.isEmptySunhh(baseVehicleVo.getVehicleCode())) {
+            wrapper.eq(BaseTerminal::getVehicleCode, baseVehicleVo.getVehicleCode());
+        }
+        BaseTerminal baseTerminal = baseTerminalMapper.selectOne(wrapper);
+        if (StringUtils.isEmptySunhh(baseTerminal)) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public List<BaseVehicleTerminalDto> vehicleList() {
+        List<BaseVehicleTerminalDto> dtoList = baseDeviceDynamicManagementMapper.vehicleTreelist(null);
+        List<String> strings = dtoList.stream().map(BaseVehicleTerminalDto::getVehicleCode).collect(Collectors.toList());
+        LambdaQueryWrapper<BaseVehicle> bw = new LambdaQueryWrapper<>();
+        bw.in(BaseVehicle::getVehicleCode, strings);
+        List<BaseVehicle> vehicles = baseVehicleMapper.selectList(bw);
+        for (BaseVehicleTerminalDto terminalDto : dtoList) {
+            for (BaseVehicle vehicle : vehicles) {
+                if (terminalDto.getVehicleCode().equals(vehicle.getVehicleCode())) {
+                    terminalDto.setVehicleName(vehicle.getVehicleName());
+                    break;
+                }
+            }
+        }
+        return dtoList;
+    }
 }

+ 171 - 1
business-service/src/main/java/com/ozs/service/impl/BaseVehicleTerminalServiceImpl.java

@@ -1,11 +1,24 @@
 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.core.domain.AjaxResult;
+import com.ozs.common.exception.ServiceException;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.bean.BeanValidators;
 import com.ozs.entity.BaseVehicleTerminal;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
 import com.ozs.mapper.BaseVehicleTerminalMapper;
 import com.ozs.service.BaseVehicleTerminalService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.validation.Validator;
+import java.util.Date;
+import java.util.List;
+
 /**
  * <p>
  * 机车车载终端信息表 服务实现类
@@ -17,4 +30,161 @@ import org.springframework.stereotype.Service;
 @Service
 public class BaseVehicleTerminalServiceImpl extends ServiceImpl<BaseVehicleTerminalMapper, BaseVehicleTerminal> implements BaseVehicleTerminalService {
 
+    @Autowired
+    private BaseVehicleTerminalMapper baseVehicleTerminalMapper;
+    @Autowired
+    protected Validator validator;
+
+    @Override
+    public IPage<BaseVehicleTerminal> vehicleTerminalList(BaseVehicleTerminalVo baseVehicleTerminalleVo) {
+        LambdaQueryWrapper<BaseVehicleTerminal> wrapper = new LambdaQueryWrapper<BaseVehicleTerminal>();
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminalleVo) && !StringUtils.isEmptySunhh(baseVehicleTerminalleVo.getTerminalCode())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminalleVo.getTerminalCode());
+        }
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminalleVo) && !StringUtils.isEmptySunhh(baseVehicleTerminalleVo.getTerminalName())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalName, baseVehicleTerminalleVo.getTerminalName());
+        }
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminalleVo) && !StringUtils.isEmptySunhh(baseVehicleTerminalleVo.getStatus())) {
+            wrapper.eq(BaseVehicleTerminal::getStatus, baseVehicleTerminalleVo.getStatus());
+        }
+        int pageNum = Integer.parseInt(baseVehicleTerminalleVo.getPageNum().toString());
+        int pageSize = Integer.parseInt(baseVehicleTerminalleVo.getPageSize().toString());
+        com.github.pagehelper.Page<BaseVehicleTerminal> page = PageHelper.startPage(pageNum, pageSize)
+                .doSelectPage(() -> baseVehicleTerminalMapper.selectList(wrapper));
+        com.baomidou.mybatisplus.extension.plugins.pagination.Page<BaseVehicleTerminal> pageR =
+                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize);
+        pageR.setRecords(page.getResult());
+        pageR.setTotal(page.getTotal());
+        return pageR;
+    }
+
+    @Override
+    public AjaxResult baseVehicleTerminalDetails(BaseVehicleTerminalVo baseVehicleTerminalVo) {
+        BaseVehicleTerminal baseVehicleTerminal = baseVehicleTerminalMapper.selectById(baseVehicleTerminalVo.getId());
+        return AjaxResult.success(baseVehicleTerminal);
+    }
+
+    @Override
+    public AjaxResult vehicleTerminalAdd(BaseVehicleTerminal baseVehicleTerminal, String userId) {
+        LambdaQueryWrapper<BaseVehicleTerminal> wrapper = new LambdaQueryWrapper<BaseVehicleTerminal>();
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminal) && !StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminal.getTerminalCode());
+        }
+        List<BaseVehicleTerminal> baseVehicles = baseVehicleTerminalMapper.selectList(wrapper);
+        if (baseVehicles.size() > 0) {
+            return AjaxResult.error("车载终端编码已存在!");
+        }
+        Date date = new Date();
+        baseVehicleTerminal.setCreateBy(userId);
+        baseVehicleTerminal.setUpdateBy(userId);
+        baseVehicleTerminal.setCreateTime(date);
+        baseVehicleTerminal.setUpdateTime(date);
+        int insert = baseVehicleTerminalMapper.insert(baseVehicleTerminal);
+        if (insert > 0) {
+            return AjaxResult.success();
+        } else {
+            return AjaxResult.error();
+        }
+    }
+
+    @Override
+    public AjaxResult vehicleTerminalUpdate(BaseVehicleTerminal baseVehicleTerminal, String userId) {
+        LambdaQueryWrapper<BaseVehicleTerminal> wrapper = new LambdaQueryWrapper<BaseVehicleTerminal>();
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminal) && !StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminal.getTerminalCode());
+        }
+        List<BaseVehicleTerminal> baseVehicles = baseVehicleTerminalMapper.selectList(wrapper);
+        if (baseVehicles.size() > 0) {
+            return AjaxResult.error("机车编码已存在!");
+        }
+        baseVehicleTerminal.setUpdateBy(userId);
+        baseVehicleTerminal.setUpdateTime(new Date());
+        int update = baseVehicleTerminalMapper.updateById(baseVehicleTerminal);
+        if (update > 0) {
+            return AjaxResult.success();
+        } else {
+            return AjaxResult.error();
+        }
+    }
+
+    @Override
+    public String importBaseVehicleTerminal(List<BaseVehicleTerminal> accountManageList, boolean updateSupport, String userId) {
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (BaseVehicleTerminal baseVehicleTerminal : accountManageList) {
+            try {
+//                BaseVehicle baseVehicle = new BaseVehicle();
+//                BeanUtils.copyProperties(baseVehicleTerminal, baseVehicle);
+                // 判断机车编码是否存在
+                LambdaQueryWrapper<BaseVehicleTerminal> lw = new LambdaQueryWrapper<BaseVehicleTerminal>();
+                if (!StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())) {
+                    lw.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminal.getTerminalCode());
+                }
+                BaseVehicleTerminal baseVehicle1 = baseVehicleTerminalMapper.selectOne(lw);
+                if (StringUtils.isEmptySunhh(baseVehicle1)) {
+                    BeanValidators.validateWithException(validator, baseVehicleTerminal);
+                    baseVehicleTerminal.setStatus("在线".equals(baseVehicleTerminal.getStatusStr()) ? 1 : 2);
+                    baseVehicleTerminal.setUpdateBy(userId);
+                    baseVehicleTerminal.setCreateBy(userId);
+                    Date date = new Date();
+                    baseVehicleTerminal.setCreateTime(date);
+                    baseVehicleTerminal.setUpdateTime(date);
+                    int insert = baseVehicleTerminalMapper.insert(baseVehicleTerminal);
+                    successNum++;
+                    successMsg.append(successNum + "、终端编码 " + baseVehicleTerminal.getTerminalCode() + " 导入成功");
+                } else if (updateSupport) {
+                    BeanValidators.validateWithException(validator, baseVehicleTerminal);
+                    LambdaQueryWrapper<BaseVehicleTerminal> lambdaQueryWrapper = new LambdaQueryWrapper<BaseVehicleTerminal>();
+                    if (!StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())) {
+                        lambdaQueryWrapper.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminal.getTerminalCode());
+                    }
+                    BaseVehicleTerminal baseVehicle4 = baseVehicleTerminalMapper.selectOne(lambdaQueryWrapper);
+                    if (StringUtils.isEmptySunhh(baseVehicle4)) {
+                        baseVehicleTerminal.setUpdateBy(userId);
+                        baseVehicleTerminal.setUpdateTime(new Date());
+                        baseVehicleTerminal.setId(baseVehicle4.getId());
+                        baseVehicleTerminalMapper.updateById(baseVehicleTerminal);
+                        successNum++;
+                        successMsg.append(successNum + "、终端编码 " + baseVehicleTerminal.getTerminalCode() + " 更新成功");
+                    } else {
+                        failureNum++;
+                        failureMsg.append(failureNum + "、终端编码 " + baseVehicleTerminal.getTerminalCode() + "不存在");
+                    }
+                }
+            } catch (Exception e) {
+                failureNum++;
+                String msg = failureNum + "、终端编码 " + baseVehicleTerminal.getTerminalCode() + " 导入失败:";
+                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 List<BaseVehicleTerminal> exportBaseVehicleTerminal(BaseVehicleTerminal baseVehicleTerminal) {
+        LambdaQueryWrapper<BaseVehicleTerminal> wrapper = new LambdaQueryWrapper<BaseVehicleTerminal>();
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminal) && !StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalName())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalName, baseVehicleTerminal.getTerminalName());
+        }
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminal) && !StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())) {
+            wrapper.eq(BaseVehicleTerminal::getTerminalCode, baseVehicleTerminal.getTerminalCode());
+        }
+        if (!StringUtils.isEmptySunhh(baseVehicleTerminal) && !StringUtils.isEmptySunhh(baseVehicleTerminal.getStatus())) {
+            wrapper.eq(BaseVehicleTerminal::getStatus, baseVehicleTerminal.getStatus());
+        }
+        List<BaseVehicleTerminal> baseVehicleTerminalList = baseVehicleTerminalMapper.selectList(wrapper);
+        for (BaseVehicleTerminal baseVehicleTerminal1 : baseVehicleTerminalList) {
+            baseVehicleTerminal1.setStatusStr(baseVehicleTerminal1.getStatus() == 1 ? "在线" : "离线");
+        }
+        return baseVehicleTerminalList;
+    }
 }

+ 42 - 9
business-service/src/main/resources/mapper/BaseDeviceDynamicManagementMapper.xml

@@ -4,15 +4,15 @@
 
     <select id="list" resultType="com.ozs.entity.vo.BaseCameraManagementDto" parameterType="com.ozs.entity.vo.CameraTreeVo">
 		SELECT
-			l.railway_code AS railwayCode, 
-			l.railway_name AS railwayName, 
-			a.camera_code AS cameraCode, 
-			a.line_dir AS lineDir, 
-			a.install_mile AS installMile, 
-			a.id AS id
+		l.railway_code AS railwayCode,
+		l.railway_name AS railwayName,
+		a.camera_code AS cameraCode,
+		a.line_dir AS lineDir,
+		a.install_mile AS installMile,
+		a.id AS id
 		FROM
-		    base_camera_management AS a inner join
-		    base_railway_management AS l  on  a.railway_code=l.railway_code
+		base_camera_management AS a inner join
+		base_railway_management AS l on a.railway_code=l.railway_code
 		<where>
 			<if test="railwayCode != null and railwayCode !=''">
 				concat(l.railway_name,a.camera_code)
@@ -42,5 +42,38 @@
 				</trim>
 			</if>
 		</where>
-    </select>
+	</select>
+
+	<select id="vehicleTreelist" resultType="com.ozs.entity.vo.BaseVehicleTerminalDto"
+			parameterType="com.ozs.entity.vo.VehicleTreeVo">
+		SELECT
+		a.id AS id,
+		l.railway_code AS railwayCode,
+		a.terminal_code AS terminalCode,
+		l.vehicle_code AS vehicleCode,
+		l.line_dir AS lineDir,
+		l.travel_mile AS travelMile,
+		l.terminal_longitude as terminalLongitude,
+		l.terminal_latitude as terminalLatitude,
+		l.current_time
+		FROM
+		base_vehicle_terminal AS a ,
+		(
+		select vp.*
+		from vehicle_position vp
+		where not exists (
+		select 1
+		from vehicle_position df
+		where df.current_time IS NOT NULL and df.vehicle_code = vp.vehicle_code
+		and df.current_time > vp.current_time )
+		GROUP BY vp.vehicle_code ) AS l
+		WHERE a.terminal_code=l.terminal_code
+		ORDER BY l.current_time DESC
+		<where>
+			<if test="railwayCode != null and railwayCode !=''">
+				concat(l.railway_code,a.terminal_code)
+				like concat("%",#{railwayCode},"%")
+			</if>
+		</where>
+	</select>
 </mapper>

+ 7 - 0
business-service/src/main/resources/mapper/BaseTerminalMapper.xml

@@ -2,4 +2,11 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ozs.mapper.BaseTerminalMapper">
 
+    <select id="selectMountCode" parameterType="java.lang.String" resultType="java.lang.String">
+        select terminal_code terminalCode from base_terminal where vehicle_code != #{vehicleCode}
+    </select>
+
+    <select id="selectTerminal" parameterType="java.lang.String" resultType="com.ozs.entity.BaseTerminal">
+        select * from base_terminal where vehicle_code = #{vehicleCode} limit 1
+    </select>
 </mapper>

+ 34 - 9
vehicle-admin/pom.xml

@@ -26,12 +26,37 @@
             <artifactId>spring-boot-devtools</artifactId>
             <optional>true</optional> <!-- 表示依赖不会传递 -->
         </dependency>
+        <!-- webSocket web端 消息推送 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <!-- 极光推送 -->
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jpush-client</artifactId>
+            <version>3.3.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jmessage-client</artifactId>
+            <version>1.1.8</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.jpush.api</groupId>
+            <artifactId>jiguang-common</artifactId>
+            <version>1.1.3</version>
+        </dependency>
 
         <!-- swagger3-->
-<!--        <dependency>-->
-<!--            <groupId>io.springfox</groupId>-->
-<!--            <artifactId>springfox-boot-starter</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>io.springfox</groupId>-->
+        <!--            <artifactId>springfox-boot-starter</artifactId>-->
+        <!--        </dependency>-->
 
         <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
         <dependency>
@@ -82,10 +107,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.ozs</groupId>-->
-<!--            <artifactId>business-service</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.ozs</groupId>-->
+        <!--            <artifactId>business-service</artifactId>-->
+        <!--        </dependency>-->
 
     </dependencies>
 
@@ -114,7 +139,7 @@
                     <failOnMissingWebXml>false</failOnMissingWebXml>
                     <warName>${project.artifactId}</warName>
                 </configuration>
-           </plugin>
+            </plugin>
         </plugins>
         <finalName>${project.artifactId}</finalName>
     </build>

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

@@ -407,7 +407,7 @@ public class BaseCameraManagementController extends BaseController {
             queryWrapper.eq(BaseDeviceDynamicManagement::getCameraCode, baseCameraManagement.getCameraCode());
         }
         BaseDeviceDynamicManagement baseDeviceDynamicManagement = baseDeviceDynamicManagementService.getOne(queryWrapper);
-        if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+        if (ObjectUtils.isEmpty(baseDeviceDynamicManagement)) {
             return error("设备动态管理表中没有该相机编码:" + baseCameraManagement.getCameraCode() + "的数据");
         }
         LambdaQueryWrapper<MsgAlarm> wrapper1 = new LambdaQueryWrapper<MsgAlarm>();
@@ -584,23 +584,23 @@ public class BaseCameraManagementController extends BaseController {
         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("播放回放")
+//    @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")

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

@@ -284,7 +284,5 @@ public class BaseRailwayManagementController extends BaseController {
     public AjaxResult query() {
         return AjaxResult.success(baseRailwayManagementService.list());
     }
-
-
 }
 

+ 218 - 13
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseVehicleController.java

@@ -5,15 +5,34 @@ import com.ozs.common.annotation.Log;
 import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.enums.BusinessType;
+import com.ozs.common.utils.ChineseToPingyin;
 import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
+import com.ozs.entity.BaseTerminal;
 import com.ozs.entity.BaseVehicle;
+import com.ozs.entity.CameraTree;
+import com.ozs.entity.VehiclePosition;
+import com.ozs.entity.VehicleTree;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
 import com.ozs.entity.vo.BaseVehicleVo;
+import com.ozs.entity.vo.VehicleTreeVo;
+import com.ozs.service.BaseDeviceDynamicManagementService;
 import com.ozs.service.BaseVehicleService;
+import com.ozs.service.VehiclePositionService;
+import com.ozs.system.service.DataScoreUtil;
 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.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -32,11 +51,68 @@ public class BaseVehicleController extends BaseController {
 
     @Autowired
     private BaseVehicleService baseVehicleService;
+    @Resource
+    BaseDeviceDynamicManagementService baseDeviceDynamicManagementService;
+    @Autowired
+    private VehiclePositionService vehiclePositionService;
+    @Autowired
+    private DataScoreUtil dataScoreUtil;
 
     public static void main(String[] args) {
         System.out.println(new Date().getTime());
     }
 
+    /**
+     * 车载终端挂载列表
+     *
+     * @param baseVehicleVo
+     * @return
+     */
+    @ApiOperation(value = "车载终端挂载列表")
+    @PostMapping("/vehicleTerminal")
+    @Log(title = "机车信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult vehicleTerminal(@RequestBody BaseVehicleVo baseVehicleVo) {
+        if (StringUtils.isEmptySunhh(baseVehicleVo) || StringUtils.isEmptySunhh(baseVehicleVo.getVehicleCode())) {
+            return AjaxResult.error("机车编码不能为空!");
+        }
+        IPage<BaseVehicleTerminalVo> baseVehicleTerminalVoIPage = baseVehicleService.vehicleTerminal(baseVehicleVo);
+        return AjaxResult.success(baseVehicleTerminalVoIPage);
+    }
+
+    /**
+     * 机车是否挂载终端
+     *
+     * @param baseVehicleVo
+     * @return
+     */
+    @ApiOperation(value = "机车是否挂载终端")
+    @PostMapping("/isMount")
+    @Log(title = "机车信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult isMount(@RequestBody BaseVehicleVo baseVehicleVo) {
+        if (StringUtils.isEmptySunhh(baseVehicleVo) || StringUtils.isEmptySunhh(baseVehicleVo.getVehicleCode())) {
+            return AjaxResult.error("机车编码不能为空!");
+        }
+        Boolean isMount = baseVehicleService.isMount(baseVehicleVo);
+        return AjaxResult.success(isMount);
+    }
+
+    /**
+     * 车载终端挂载 保存
+     *
+     * @param baseTerminal
+     * @return
+     */
+    @ApiOperation(value = "车载终端挂载 保存")
+    @PostMapping("/vehicleTerminalAdd")
+    @Log(title = "机车信息管理", businessType = BusinessType.INSERT)
+    public AjaxResult vehicleTerminalAdd(@RequestBody BaseTerminal baseTerminal) {
+        if (StringUtils.isEmptySunhh(baseTerminal) || StringUtils.isEmptySunhh(baseTerminal.getVehicleCode())
+                || StringUtils.isEmptySunhh(baseTerminal.getTerminalCode())) {
+            return AjaxResult.error("机车编码、终端编码不能为空!");
+        }
+        return baseVehicleService.vehicleTerminalAdd(baseTerminal, getUserId());
+    }
+
     /**
      * 机车信息表 分页查询
      *
@@ -45,12 +121,28 @@ public class BaseVehicleController extends BaseController {
      */
     @ApiOperation(value = "机车信息表 分页查询")
     @PostMapping("/vehicleList")
-    @Log(title = "机车信息表 分页查询", businessType = BusinessType.SELECT)
+    @Log(title = "机车信息管理", businessType = BusinessType.SELECT)
     public AjaxResult vehicleList(@RequestBody BaseVehicleVo baseVehicle) {
         IPage<BaseVehicle> baseVehicleList = baseVehicleService.vehicleList(baseVehicle);
         return AjaxResult.success(baseVehicleList);
     }
 
+    /**
+     * 机车信息表 详情
+     *
+     * @param baseVehicle
+     * @return
+     */
+    @ApiOperation(value = "机车信息表 详情")
+    @PostMapping("/vehicleDetails")
+    @Log(title = "机车信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult vehicleDetails(@RequestBody BaseVehicle baseVehicle) {
+        if (StringUtils.isEmptySunhh(baseVehicle) || StringUtils.isEmptySunhh(baseVehicle.getId())) {
+            return AjaxResult.error("机车id不能为空!");
+        }
+        return baseVehicleService.vehicleDetails(baseVehicle);
+    }
+
     /**
      * 机车信息表 新增
      *
@@ -59,7 +151,7 @@ public class BaseVehicleController extends BaseController {
      */
     @ApiOperation(value = "机车信息表 新增")
     @PostMapping("/vehicleAdd")
-    @Log(title = "机车信息表 新增", businessType = BusinessType.SELECT)
+    @Log(title = "机车信息管理", businessType = BusinessType.INSERT)
     public AjaxResult vehicleAdd(@RequestBody BaseVehicle baseVehicle) {
         if (StringUtils.isEmptySunhh(baseVehicle) || StringUtils.isEmptySunhh(baseVehicle.getVehicleName())
                 || StringUtils.isEmptySunhh(baseVehicle.getVehicleCode())) {
@@ -76,12 +168,12 @@ public class BaseVehicleController extends BaseController {
      */
     @ApiOperation(value = "机车信息表 修改")
     @PostMapping("/vehicleUpdate")
-    @Log(title = "机车信息表 修改", businessType = BusinessType.SELECT)
+    @Log(title = "机车信息管理", businessType = BusinessType.UPDATE)
     public AjaxResult vehicleUpdate(@RequestBody BaseVehicle baseVehicle) {
         if (StringUtils.isEmptySunhh(baseVehicle) || StringUtils.isEmptySunhh(baseVehicle.getId())) {
             return AjaxResult.error("修改ID不能为空!");
         }
-        return baseVehicleService.vehicleUpdate(baseVehicle,getUserId());
+        return baseVehicleService.vehicleUpdate(baseVehicle, getUserId());
     }
 
     /**
@@ -91,8 +183,8 @@ public class BaseVehicleController extends BaseController {
      * @return
      */
     @ApiOperation(value = "机车信息表 删除")
-    @PostMapping("/vehicleDelete")
-    @Log(title = "机车信息表 删除", businessType = BusinessType.SELECT)
+    @DeleteMapping("/vehicleDelete/{ids}")
+    @Log(title = "机车信息管理", businessType = BusinessType.DELETE)
     public AjaxResult vehicleDelete(@PathVariable List<Long> ids) {
         if (StringUtils.isEmptySunhh(ids)) {
             return AjaxResult.error("删除ID不能为空!");
@@ -106,16 +198,129 @@ public class BaseVehicleController extends BaseController {
     }
 
     /**
-     * 机车信息表 查询
+     * 机车信息导入
+     *
+     * @param file
+     * @param updateSupport
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation("机车信息导入")
+    @PostMapping("/importBaseVehicle")
+    @Log(title = "机车信息管理", businessType = BusinessType.IMPORT)
+    public AjaxResult importBaseVehicle(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelUtil<BaseVehicle> util = new ExcelUtil<BaseVehicle>(BaseVehicle.class);
+        List<BaseVehicle> accountManageList = util.importExcel(file.getInputStream());
+        String message = baseVehicleService.importBaseVehicle(accountManageList, updateSupport, getUserId());
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 机车信息导出
+     *
+     * @param response
+     */
+    @ApiOperation("机车信息导出")
+    @PostMapping("/exportBaseVehicle")
+    @Log(title = "机车信息管理", businessType = BusinessType.EXPORT)
+    public void exportBaseVehicle(HttpServletResponse response, @RequestBody BaseVehicle baseVehicle) {
+        List<BaseVehicle> baseVehicleList = baseVehicleService.exportBaseVehicle(baseVehicle);
+        ExcelUtil<BaseVehicle> util = new ExcelUtil<>(BaseVehicle.class);
+        util.exportExcel(response, baseVehicleList, "机车信息台账数据");
+    }
+
+    /**
+     * 机车信息模板下载
+     *
+     * @param response
+     */
+    @ApiOperation("机车信息模板下载")
+    @GetMapping("/downloaExcel")
+    @Log(title = "机车信息管理", businessType = BusinessType.OTHER)
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/BaseVehicle.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "机车信息模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
+    /**
+     * 首页--机车树结构
+     * 机车行驶日志中有线路编码
+     * 根据机车在行驶日志中记录的最后时间
+     * <p>
+     * 获取机车列表和线路编码,组成树结构
+     */
+    @ApiOperation("视频服务树形结构")
+    @PostMapping("/vehicleTree")
+    @Log(title = "相机台账管理", businessType = BusinessType.OTHER)
+    public AjaxResult vehicleTree(@RequestBody VehicleTreeVo vehicleTreeVo) {
+
+        vehicleTreeVo = (VehicleTreeVo) dataScoreUtil.setDataScore(getUserId(), vehicleTreeVo);
+        int count = 0;
+        if (!ObjectUtils.isEmpty(vehicleTreeVo.getMils())) {
+            vehicleTreeVo.setMils(vehicleTreeVo.getMils() * 1000);
+        }
+        VehicleTree vehicleTree = baseDeviceDynamicManagementService.vehicleTree(vehicleTreeVo);
+        List<VehicleTree> children = vehicleTree.getChildren();
+        children.sort(new Comparator<VehicleTree>() {
+            @Override
+            public int compare(VehicleTree o1, VehicleTree 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 (VehicleTree child : children) {
+            List<VehicleTree> children1 = child.getChildren();
+            children1.sort(new Comparator<VehicleTree>() {
+                @Override
+                public int compare(VehicleTree o1, VehicleTree 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 (VehicleTree tree : children1) {
+                List<VehicleTree> children2 = tree.getChildren();
+                if (children2.size() < 2) {
+                    String code = children2.get(0).getCode();
+                    tree.setCode(code);
+                    children2.remove(0);
+                } else {
+                    for (VehicleTree vehicleTree1 : children2) {
+                        count = count + 1;
+                        vehicleTree1.setName("相机" + count);
+                    }
+                    count = 0;
+                }
+            }
+        }
+        return success(vehicleTree);
+    }
+
+    /**
+     * 机车信息表 (首页地图中的机车信息)
      *
      * @return
      */
-    @ApiOperation(value = "机车信息表 查询")
-    @PostMapping("/vehicleAll")
-    @Log(title = "机车信息表 查询", businessType = BusinessType.SELECT)
-    public AjaxResult vehicleAll() {
-        List<BaseVehicle> list = baseVehicleService.list();
-        return AjaxResult.success(list);
+    @ApiOperation(value = "机车信息表 列表查询")
+    @GetMapping("/vehicleList")
+    @Log(title = "机车信息管理", businessType = BusinessType.SELECT)
+    public AjaxResult vehicleList() {
+        return AjaxResult.success(baseVehicleService.vehicleList());
     }
 }
 

+ 149 - 7
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseVehicleTerminalController.java

@@ -1,19 +1,26 @@
 package com.ozs.web.controller.accountmanagment;
 
 
-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.enums.BusinessType;
-import com.ozs.entity.BaseVehicle;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.common.utils.file.FileUtils;
+import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.entity.BaseVehicleTerminal;
+import com.ozs.entity.vo.BaseVehicleTerminalVo;
 import com.ozs.service.BaseVehicleTerminalService;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -24,13 +31,149 @@ import java.util.List;
  * @author ozs
  * @since 2023-04-11
  */
+@Slf4j
 @RestController
 @RequestMapping("/baseVehicleTerminal")
-public class BaseVehicleTerminalController {
+public class BaseVehicleTerminalController extends BaseController {
 
     @Autowired
     private BaseVehicleTerminalService baseVehicleTerminalService;
 
+    /**
+     * 车载终端信息表 分页查询
+     *
+     * @param baseVehicleTerminalVo
+     * @return
+     */
+    @ApiOperation(value = "终端信息表 分页查询")
+    @PostMapping("/vehicleTerminalList")
+    @Log(title = "车载终端管理", businessType = BusinessType.SELECT)
+    public AjaxResult vehicleTerminalList(@RequestBody BaseVehicleTerminalVo baseVehicleTerminalVo) {
+        IPage<BaseVehicleTerminal> baseVehicleTerminalIPage = baseVehicleTerminalService.vehicleTerminalList(baseVehicleTerminalVo);
+        return AjaxResult.success(baseVehicleTerminalIPage);
+    }
+
+    /**
+     * 车载终端信息表 详情
+     *
+     * @param baseVehicleTerminalVo
+     * @return
+     */
+    @ApiOperation(value = "车载终端信息表 详情")
+    @PostMapping("/baseVehicleTerminalDetails")
+    @Log(title = "车载终端管理", businessType = BusinessType.SELECT)
+    public AjaxResult baseVehicleTerminalDetails(@RequestBody BaseVehicleTerminalVo baseVehicleTerminalVo) {
+        if (StringUtils.isEmptySunhh(baseVehicleTerminalVo) || StringUtils.isEmptySunhh(baseVehicleTerminalVo.getId())) {
+            return AjaxResult.error("车载终端id不能为空!");
+        }
+        return baseVehicleTerminalService.baseVehicleTerminalDetails(baseVehicleTerminalVo);
+    }
+
+    /**
+     * 车载终端信息表 新增
+     *
+     * @param baseVehicleTerminal
+     * @return
+     */
+    @ApiOperation(value = "车载终端信息表 新增")
+    @PostMapping("/vehicleTerminalAdd")
+    @Log(title = "车载终端管理", businessType = BusinessType.INSERT)
+    public AjaxResult vehicleTerminalAdd(@RequestBody BaseVehicleTerminal baseVehicleTerminal) {
+        if (StringUtils.isEmptySunhh(baseVehicleTerminal) || StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalCode())
+                || StringUtils.isEmptySunhh(baseVehicleTerminal.getTerminalName())) {
+            return AjaxResult.error("车载终端名称、车载终端编码不能为空!");
+        }
+        return baseVehicleTerminalService.vehicleTerminalAdd(baseVehicleTerminal, getUserId());
+    }
+
+    /**
+     * 车载终端信息表 修改
+     *
+     * @param baseVehicleTerminal
+     * @return
+     */
+    @ApiOperation(value = "车载终端信息表 修改")
+    @PostMapping("/vehicleTerminalUpdate")
+    @Log(title = "车载终端管理", businessType = BusinessType.UPDATE)
+    public AjaxResult vehicleTerminalUpdate(@RequestBody BaseVehicleTerminal baseVehicleTerminal) {
+        if (StringUtils.isEmptySunhh(baseVehicleTerminal) || StringUtils.isEmptySunhh(baseVehicleTerminal.getId())) {
+            return AjaxResult.error("修改ID不能为空!");
+        }
+        return baseVehicleTerminalService.vehicleTerminalUpdate(baseVehicleTerminal, getUserId());
+    }
+
+    /**
+     * 车载终端信息表 删除
+     *
+     * @param ids
+     * @return
+     */
+    @ApiOperation(value = "车载终端信息表 删除")
+    @DeleteMapping("/vehicleTerminaleDelete/{ids}")
+    @Log(title = "车载终端管理", businessType = BusinessType.DELETE)
+    public AjaxResult vehicleDelete(@PathVariable List<Long> ids) {
+        if (StringUtils.isEmptySunhh(ids)) {
+            return AjaxResult.error("删除ID不能为空!");
+        }
+        boolean delete = baseVehicleTerminalService.removeByIds(ids);
+        if (delete) {
+            return AjaxResult.success();
+        } else {
+            return AjaxResult.error();
+        }
+    }
+
+    /**
+     * 车载终端信息导入
+     *
+     * @param file
+     * @param updateSupport
+     * @return
+     * @throws Exception
+     */
+    @ApiOperation("车载终端信息导入")
+    @PostMapping("/importBaseVehicleTerminal")
+    @Log(title = "车载终端管理", businessType = BusinessType.IMPORT)
+    public AjaxResult importBaseVehicleTerminal(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelUtil<BaseVehicleTerminal> util = new ExcelUtil<BaseVehicleTerminal>(BaseVehicleTerminal.class);
+        List<BaseVehicleTerminal> accountManageList = util.importExcel(file.getInputStream());
+        String message = baseVehicleTerminalService.importBaseVehicleTerminal(accountManageList, updateSupport, getUserId());
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 车载终端信息导出
+     *
+     * @param response
+     */
+    @ApiOperation("车载终端信息导出")
+    @PostMapping("/exportBaseVehicleTerminal")
+    @Log(title = "车载终端管理", businessType = BusinessType.EXPORT)
+    public void exportBaseVehicleTerminal(HttpServletResponse response, @RequestBody BaseVehicleTerminal baseVehicleTerminal) {
+        List<BaseVehicleTerminal> baseVehicleList = baseVehicleTerminalService.exportBaseVehicleTerminal(baseVehicleTerminal);
+        ExcelUtil<BaseVehicleTerminal> util = new ExcelUtil<>(BaseVehicleTerminal.class);
+        util.exportExcel(response, baseVehicleList, "车载终端数据");
+    }
+
+    /**
+     * 车载终端信息模板下载
+     *
+     * @param response
+     */
+    @ApiOperation("车载终端信息模板下载")
+    @GetMapping("/downloaExcel")
+    @Log(title = "车载终端管理", businessType = BusinessType.OTHER)
+    public void downloadZip(HttpServletResponse response) {
+        try {
+            InputStream resourceAsStream = this.getClass().getResourceAsStream("/template/BaseVehicleTerminal.xlsx");
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+            FileUtils.setAttachmentResponseHeader(response, "车载终端信息模板.xlsx");
+            FileUtils.writeBytesByInput(resourceAsStream, response.getOutputStream());
+        } catch (Exception e) {
+            log.error("下载文件失败", e);
+        }
+    }
+
     /**
      * 终端信息表 查询
      *
@@ -43,6 +186,5 @@ public class BaseVehicleTerminalController {
         List<BaseVehicleTerminal> list = baseVehicleTerminalService.list();
         return AjaxResult.success(list);
     }
-
 }
 

+ 7 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/DataStatisticController.java

@@ -292,6 +292,13 @@ public class DataStatisticController extends BaseController {
                     if (!ObjectUtils.isEmpty(l.getIsRelease())) {
                         l.setIsReleaseName(l.getIsRelease() == 1 ? "已解除" : "未解除");
                     }
+                    if (!ObjectUtils.isEmpty(l.getAlarmAttr())) {
+                        String[] split1 = l.getAlarmAttr().split(",");
+                        String stringBuilder = "画面,大小为" + split1[0] + "×" + split1[1] + "," +
+                                "泥石流范围为左上角坐标(" + split1[2] + "," + split1[3] + ")" +
+                                "大小" + split1[4] + "×" + split1[5];
+                        l.setAlarmAttrString(stringBuilder);
+                    }
                 });
             }
 

+ 9 - 10
vehicle-admin/src/main/java/com/ozs/web/controller/accountmanagment/MsgAlarmController.java

@@ -7,33 +7,32 @@ 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.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.entity.vo.MsgAlarmResp;
+import com.ozs.entity.vo.MsgAlarmVo;
 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 com.ozs.system.service.ISysDictTypeService;
-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.Date;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -167,10 +166,10 @@ public class MsgAlarmController extends BaseController {
                 }
                 BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
                 o.setRailwayName(baseRailwayManagement.getRailwayName());
-//                if (StringUtils.isNotEmpty(o.getReleasedBy())) {
-//                    BaseUser user = baseUserService.getUser(o.getReleasedBy());
-//                    o.setReleasedByName(user.getNickName());
-//                }
+                if (StringUtils.isNotEmpty(o.getReleasedBy())) {
+                    BaseUser user = baseUserService.getUser(o.getReleasedBy());
+                    o.setReleasedByName(user.getNickName());
+                }
                 String mils = AppendUtils.stringAppend(o.getAlarmMile());
                 o.setAlarmMiles(mils);
                 o.setLineDirName(o.getLineDir() == 1 ? "上行" : "下行");

+ 40 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/home/HomeController.java

@@ -0,0 +1,40 @@
+package com.ozs.web.controller.home;
+
+import com.ozs.common.core.controller.BaseController;
+import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.entity.vo.MsgAlarmVo;
+import com.ozs.service.MsgAlarmService;
+import com.ozs.system.service.DataScoreUtil;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * @Author : sunhh
+ * @create 2023/3/7 14:34
+ */
+@RestController
+@RequestMapping("/home")
+public class HomeController extends BaseController {
+
+    @Resource
+    private MsgAlarmService msgAlarmService;
+    @Autowired
+    private DataScoreUtil dataScoreUtil;
+
+    /**
+     * 统计数量
+     */
+    @ApiOperation(value = "统计数量")
+    @GetMapping("/statisticsNum")
+    public AjaxResult statisticsNum() {
+        MsgAlarmVo msgAlarmVo = (MsgAlarmVo) dataScoreUtil.setDataScore(getUserId(), new MsgAlarmVo());
+        Map<String, Integer> map = msgAlarmService.statisticsNum(msgAlarmVo);
+        return AjaxResult.success(map);
+    }
+}

+ 23 - 19
vehicle-admin/src/main/java/com/ozs/web/controller/monitor/SysLoginInfoController.java

@@ -1,25 +1,31 @@
 package com.ozs.web.controller.monitor;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
 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.github.pagehelper.PageHelper;
+import com.ozs.common.core.domain.vo.SysLoginInfoResq;
+import com.ozs.common.core.domain.vo.SysLoginInfoVo;
+import com.ozs.common.utils.StringUtils;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
 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.vo.SysLoginInfoVo;
+import com.ozs.common.core.page.TableDataInfo;
 import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.framework.web.service.SysPasswordService;
 import com.ozs.system.domain.SysLoginInfo;
 import com.ozs.system.service.ISysLoginInfoService;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.util.ObjectUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
 
 /**
  * 系统访问记录
@@ -52,8 +58,9 @@ public class SysLoginInfoController extends BaseController {
     @ApiOperation(value = "获取登录日志分页列表")
     @PostMapping("/list")
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
-    public AjaxResult list(@RequestBody SysLoginInfoVo sysLoginInfoVo) {
+    public AjaxResult list(@RequestBody SysLoginInfoVo sysLoginInfoVo) throws ParseException {
         LambdaQueryWrapper<SysLoginInfo> wrapper = new LambdaQueryWrapper<SysLoginInfo>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         if (!ObjectUtils.isEmpty(sysLoginInfoVo.getIpaddr())) {
             wrapper.like(SysLoginInfo::getIpaddr, sysLoginInfoVo.getIpaddr());
         }
@@ -61,18 +68,15 @@ public class SysLoginInfoController extends BaseController {
             wrapper.like(SysLoginInfo::getUserName, sysLoginInfoVo.getUserName());
         }
         if (!ObjectUtils.isEmpty(sysLoginInfoVo.getStatus())) {
-            wrapper.like(SysLoginInfo::getStatus, sysLoginInfoVo.getStatus());
-        }
-        if (!ObjectUtils.isEmpty(sysLoginInfoVo.getLoginTime())) {
-            wrapper.like(SysLoginInfo::getLoginTime, sysLoginInfoVo.getLoginTime());
+            wrapper.eq(SysLoginInfo::getStatus, sysLoginInfoVo.getStatus());
         }
         if (!ObjectUtils.isEmpty(sysLoginInfoVo.getStartTime())) {
-            wrapper.ge(SysLoginInfo::getLoginTime, sysLoginInfoVo.getStartTime());
+            wrapper.apply(StringUtils.isNotBlank(sysLoginInfoVo.getStartTime()), "date_format(login_time,'%y%m%d') >= date_format('" + sysLoginInfoVo.getStartTime() + "','%y%m%d')");
         }
         if (!ObjectUtils.isEmpty(sysLoginInfoVo.getEndTime())) {
-            wrapper.le(SysLoginInfo::getLoginTime, sysLoginInfoVo.getEndTime());
+            wrapper.apply(StringUtils.isNotBlank(sysLoginInfoVo.getEndTime()), "date_format(login_time,'%y%m%d') <= date_format('" + sysLoginInfoVo.getEndTime() + "','%y%m%d')");
         }
-            wrapper.orderByDesc(SysLoginInfo::getLoginTime);
+        wrapper.orderByDesc(SysLoginInfo::getLoginTime);
         IPage<SysLoginInfo> page = logininforService.page(new Page<>(sysLoginInfoVo.getPageNum(), sysLoginInfoVo.getPageSize()), wrapper);
         return AjaxResult.success(page);
     }
@@ -88,8 +92,8 @@ public class SysLoginInfoController extends BaseController {
     @Log(title = "登录日志", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysLoginInfo logininfor) {
-        List<SysLoginInfo> list = logininforService.selectLogininforList(logininfor);
+    public void export(HttpServletResponse response, @RequestBody SysLoginInfoResq sysLoginInfoResq) {
+        List<SysLoginInfo> list = logininforService.selectLogininforList(sysLoginInfoResq);
         ExcelUtil<SysLoginInfo> util = new ExcelUtil<SysLoginInfo>(SysLoginInfo.class);
         util.exportExcel(response, list, "登录日志");
     }

+ 21 - 20
vehicle-admin/src/main/java/com/ozs/web/controller/monitor/SysOperlogController.java

@@ -1,24 +1,31 @@
 package com.ozs.web.controller.monitor;
 
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
 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.core.domain.vo.SysLoginInfoVo;
+import com.ozs.common.core.domain.vo.SysOperlogResq;
+import com.ozs.common.core.domain.vo.SysOperlogVo;
+import com.ozs.common.utils.DateUtils;
+import com.ozs.common.utils.StringUtils;
+import com.ozs.system.domain.SysLoginInfo;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
 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.vo.SysOperlogVo;
+import com.ozs.common.core.page.TableDataInfo;
 import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.poi.ExcelUtil;
 import com.ozs.system.domain.SysOperLog;
 import com.ozs.system.service.ISysOperLogService;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.util.ObjectUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
 
 /**
  * 操作日志记录
@@ -51,9 +58,6 @@ public class SysOperlogController extends BaseController {
     @PostMapping("/list")
     public AjaxResult list(@RequestBody SysOperlogVo sysOperlogVo) {
         LambdaQueryWrapper<SysOperLog> wrapper = new LambdaQueryWrapper<SysOperLog>();
-        if (!ObjectUtils.isEmpty(sysOperlogVo.getOperId())) {
-            wrapper.like(SysOperLog::getOperId, sysOperlogVo.getOperId());
-        }
         if (!ObjectUtils.isEmpty(sysOperlogVo.getUserId())) {
             wrapper.like(SysOperLog::getUserId, sysOperlogVo.getUserId());
         }
@@ -63,19 +67,16 @@ public class SysOperlogController extends BaseController {
         if (!ObjectUtils.isEmpty(sysOperlogVo.getTitle())) {
             wrapper.like(SysOperLog::getTitle, sysOperlogVo.getTitle());
         }
-        if (!ObjectUtils.isEmpty(sysOperlogVo.getOperTime())) {
-            wrapper.like(SysOperLog::getOperTime, sysOperlogVo.getOperTime());
-        }
         if (!ObjectUtils.isEmpty(sysOperlogVo.getStartTime())) {
-            wrapper.ge(SysOperLog::getOperTime, sysOperlogVo.getStartTime());
+            wrapper.apply(StringUtils.isNotBlank(sysOperlogVo.getStartTime()), "date_format(oper_time,'%y%m%d') >= date_format('" + sysOperlogVo.getStartTime() + "','%y%m%d')");
         }
         if (!ObjectUtils.isEmpty(sysOperlogVo.getEndTime())) {
-            wrapper.le(SysOperLog::getOperTime, sysOperlogVo.getEndTime());
+            wrapper.apply(StringUtils.isNotBlank(sysOperlogVo.getEndTime()), "date_format(oper_time,'%y%m%d') <= date_format('" + sysOperlogVo.getEndTime() + "','%y%m%d')");
         }
         if (!ObjectUtils.isEmpty(sysOperlogVo.getBusinessType())) {
             wrapper.eq(SysOperLog::getBusinessType, sysOperlogVo.getBusinessType());
         }
-            wrapper.orderByDesc(SysOperLog::getOperTime);
+        wrapper.orderByDesc(SysOperLog::getOperTime);
         IPage<SysOperLog> page = operLogService.page(new Page<>(sysOperlogVo.getPageNum(), sysOperlogVo.getPageSize()), wrapper);
         return AjaxResult.success(page);
     }
@@ -91,8 +92,8 @@ public class SysOperlogController extends BaseController {
     @Log(title = "操作日志", businessType = BusinessType.EXPORT)
     @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysOperLog operLog) {
-        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+    public void export(HttpServletResponse response, @RequestBody SysOperlogResq sysOperlogResq) {
+        List<SysOperLog> list = operLogService.selectOperLogList(sysOperlogResq);
         ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
         util.exportExcel(response, list, "操作日志");
     }

+ 382 - 85
vehicle-admin/src/main/java/com/ozs/web/controller/sdk/GeoHazardMonitorTokenController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ozs.common.core.domain.AjaxResult;
+import com.ozs.common.core.domain.entity.SysUser;
 import com.ozs.common.core.redis.RedisCache;
 import com.ozs.common.exception.base.BaseException;
 import com.ozs.common.utils.ApiTokenUtils;
@@ -19,6 +20,7 @@ import com.ozs.entity.BaseDeviceDynamicManagement;
 import com.ozs.entity.BaseRailwayManagement;
 import com.ozs.entity.BaseTerminal;
 import com.ozs.entity.BaseUser;
+import com.ozs.entity.BaseVehicleTerminal;
 import com.ozs.entity.CameraTree;
 import com.ozs.entity.MsgAlarm;
 import com.ozs.entity.MsgAlarmExt;
@@ -33,6 +35,8 @@ import com.ozs.entity.vo.CameraPlayVo;
 import com.ozs.entity.vo.CameraVo;
 import com.ozs.entity.vo.Files;
 import com.ozs.entity.vo.HeartbeatVo;
+import com.ozs.entity.vo.MsgAlarmResp;
+import com.ozs.entity.vo.ParameterVo;
 import com.ozs.entity.vo.QueryAlarmVo;
 import com.ozs.entity.vo.ReleaseAlarmVo;
 import com.ozs.entity.vo.ReqMsgAlarmVo;
@@ -48,12 +52,17 @@ import com.ozs.service.BaseDeviceDynamicManagementService;
 import com.ozs.service.BaseRailwayManagementService;
 import com.ozs.service.BaseTerminalService;
 import com.ozs.service.BaseUserService;
+import com.ozs.service.BaseVehicleTerminalService;
 import com.ozs.service.MsgAlarmExtService;
 import com.ozs.service.MsgAlarmFrequencyService;
 import com.ozs.service.MsgAlarmService;
 import com.ozs.service.SvcAddressService;
 import com.ozs.service.TerminalIgnoreAlarmService;
 import com.ozs.service.VehiclePositionService;
+import com.ozs.system.domain.SysUserOnline;
+import com.ozs.system.mapper.SysUserMapper;
+import com.ozs.web.controller.monitor.SysUserOnlineController;
+import com.ozs.web.controller.websocket.WebSocketServer;
 import com.ozs.web.core.util.CameraUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -76,6 +85,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * 1. 获取身份认证控制层
@@ -86,10 +96,11 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class GeoHazardMonitorTokenController {
     public static final String PATTERN = "^([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)$";
+    public static final String PATTERNS = "^[0-9]*$";
     @Resource
     private ApiTokenUtils apiTokenUtils;
-    @Resource
-    BaseDeviceDynamicManagementService baseDeviceDynamicManagementService;
+    @Autowired
+    WebSocketServer webSocketServer;
     @Autowired
     MsgAlarmService msgAlarmService;
     @Autowired
@@ -98,6 +109,8 @@ public class GeoHazardMonitorTokenController {
     SvcAddressService svcAddressService;
     @Autowired
     BaseCameraManagementService baseCameraManagementService;
+    @Autowired
+    SysUserOnlineController sysUserOnlineController;
     //    @Value("${sdk.publish}")
 //    private String sdkUrl;
     @Autowired
@@ -120,6 +133,10 @@ public class GeoHazardMonitorTokenController {
     private RedisCache redisCache;
     @Autowired
     private ServerConfig serverConfig;
+    @Autowired
+    private BaseVehicleTerminalService baseVehicleTerminalService;
+    @Resource
+    private SysUserMapper sysUserMapper;
 
     /**
      * 获取web访问令牌
@@ -139,11 +156,24 @@ public class GeoHazardMonitorTokenController {
             jsonObject.put("data", "客户端编号不能为空");
             return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
         }
+        if (!ObjectUtils.isEmpty(svcAddress.getGrantType())) {
+            if (!svcAddress.getGrantType().toString().matches(PATTERNS)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "授权类型填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+        } else {
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "授权类型不能为空");
+            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+        }
         SvcAddress serviceOne = svcAddressService.getOne(lw);
         if (!ObjectUtils.isEmpty(serviceOne)) {
             String clientSecret = SM4Utils.decryptData_ECB(serviceOne.getClientSecret(), "4370780c9a8c43e5");
             if (clientSecret.equals(svcAddress.getClientSecret())) {
-                ArrayList<String> objects = apiTokenUtils.createGeoHazardMonitorToken(svcAddress.getGrantType(), svcAddress.getClientId(), svcAddress.getClientSecret());
+                ArrayList<String> objects = apiTokenUtils.createGeoHazardMonitorToken(svcAddress.getGrantType().toString(), svcAddress.getClientId(), svcAddress.getClientSecret());
                 if (objects.size() > 0) {
                     RespGeoHazardMonitorVo respGeoHazardMonitorVo = new RespGeoHazardMonitorVo();
                     respGeoHazardMonitorVo.setAccessToken(objects.get(1));
@@ -179,13 +209,13 @@ public class GeoHazardMonitorTokenController {
      */
     @PostMapping("/api/alarm")
     @Transactional
-    public String alarm(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String alarm(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             ReqMsgAlarmVo reqMsgAlarmVo = JSON.parseObject(s, ReqMsgAlarmVo.class);
             if (!ObjectUtils.isEmpty(reqMsgAlarmVo.getAlarmAttr())) {
                 if (!reqMsgAlarmVo.getAlarmAttr().matches(PATTERN)) {
@@ -195,6 +225,53 @@ public class GeoHazardMonitorTokenController {
                     return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
                 }
             }
+            if (!reqMsgAlarmVo.getAlarmMile().toString().matches(PATTERNS)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警里程位置填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (reqMsgAlarmVo.getLineDir() != 1 && reqMsgAlarmVo.getLineDir() != 2) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "行别填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(reqMsgAlarmVo.getAlarmRailway())) {
+                queryWrapper.eq(BaseRailwayManagement::getRailwayCode, reqMsgAlarmVo.getAlarmRailway());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+            if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "填写的报警线路编码不存在");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(reqMsgAlarmVo.getAlarmId())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警的唯一标识不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(reqMsgAlarmVo.getAlarmTime())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警时间不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (reqMsgAlarmVo.getAlarmType() < 1 || reqMsgAlarmVo.getAlarmType() > 3) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警病害类型填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (!reqMsgAlarmVo.getAlarmLevel().toString().matches(PATTERNS)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警级别填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             if (reqMsgAlarmVo.getAlarmTime().toString().length() == 10) {
                 reqMsgAlarmVo.setAlarmTime(reqMsgAlarmVo.getAlarmTime() * 1000);
             }
@@ -219,6 +296,12 @@ public class GeoHazardMonitorTokenController {
                 lw.eq(MsgAlarm::getAlarmId, reqMsgAlarmVo.getAlarmId());
             }
             MsgAlarm alarm = msgAlarmService.getOne(lw);
+            if (ObjectUtils.isEmpty(alarm)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "没有该报警唯一标识的报警信息");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             log.info("alarm:{}", alarm);
             BaseUser admin = baseUserService.getUserName("admin");
             MsgAlarmFrequency msgAlarmVice = new MsgAlarmFrequency();
@@ -237,6 +320,18 @@ public class GeoHazardMonitorTokenController {
                 Files[] files1 = reqMsgAlarmVo.getFiles();
                 if (files1.length > 0) {
                     for (int i = 0; i < files1.length; i++) {
+                        if (ObjectUtils.isEmpty(files1[i].fileUrl)) {
+                            jsonObject.put("resultCode", 0);
+                            jsonObject.put("message", "失败");
+                            jsonObject.put("data", "上传文件地址不能为空");
+                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+                        }
+                        if (files1[i].fileType < 1 || files1[i].fileType > 3) {
+                            jsonObject.put("resultCode", 0);
+                            jsonObject.put("message", "失败");
+                            jsonObject.put("data", "文件类型填写错误");
+                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+                        }
                         MsgAlarmExt msgAlarmExt = new MsgAlarmExt();
                         msgAlarmExt.setAlarmId(msgAlarm.getAlarmId());
                         msgAlarmExt.setAlarmAttPath(files1[i].fileUrl);
@@ -314,19 +409,43 @@ public class GeoHazardMonitorTokenController {
     /**
      * 报警解除接口
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/releaseAlarm")
-    public String releaseAlarm(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String releaseAlarm(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             ReleaseAlarmVo releaseAlarmVo = JSON.parseObject(s, ReleaseAlarmVo.class);
+            if (ObjectUtils.isEmpty(releaseAlarmVo.getAlarmId())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警的唯一标识不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(releaseAlarmVo.getReleaseTime())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "解除报警时间不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(releaseAlarmVo.getReleaseContent())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "解除原因不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(releaseAlarmVo.getReleaseTime())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "解除人不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             LambdaQueryWrapper<MsgAlarm> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(MsgAlarm::getAlarmId, releaseAlarmVo.getAlarmId());
             MsgAlarm msgAlarm = msgAlarmService.getOne(wrapper);
@@ -369,36 +488,127 @@ public class GeoHazardMonitorTokenController {
     /**
      * 车载心跳机制交互
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/terminal/heartbeat")
-    public String heartbeat(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    @Transactional
+    public String heartbeat(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         Map<String, Object> twoMap = new HashMap<>();
         int distance = 0;
         RespHeartbeatVo respHeartbeatVo = new RespHeartbeatVo();
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             HeartbeatVo heartbeatVo = JSON.parseObject(s, HeartbeatVo.class);
+            if (ObjectUtils.isEmpty(heartbeatVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (!heartbeatVo.getCurrentMile().toString().matches(PATTERNS)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "当前里程位置填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(heartbeatVo.getLatitude())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "当前所在纬度不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(heartbeatVo.getLongitude())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "当前所在经度不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            LambdaQueryWrapper<BaseRailwayManagement> railway = new LambdaQueryWrapper<BaseRailwayManagement>();
+            if (!ObjectUtils.isEmpty(heartbeatVo.getRailwayCode())) {
+                railway.eq(BaseRailwayManagement::getRailwayCode, heartbeatVo.getRailwayCode());
+            }
+            BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(railway);
+            if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "填写的线路编码不存在");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (heartbeatVo.getLineDir() != 1 && heartbeatVo.getLineDir() != 2) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "行别填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (!heartbeatVo.getVisualDistance().toString().matches(PATTERNS)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "司机目视距离填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (heartbeatVo.getSignalStrength() != 1 && heartbeatVo.getSignalStrength() != 2) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "信号强度填写错误");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             VehiclePosition vehiclePosition = new VehiclePosition();
             BeanUtils.copyProperties(heartbeatVo, vehiclePosition);
             LambdaQueryWrapper<BaseTerminal> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(BaseTerminal::getTerminalCode, vehiclePosition.getTerminalCode());
             BaseTerminal baseTerminal = baseTerminalService.getOne(wrapper);
+            if (ObjectUtils.isEmpty(baseTerminal)) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "关联表中没有改终端编码的信息");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             vehiclePosition.setTravelMile(heartbeatVo.getCurrentMile());
             vehiclePosition.setVehicleCode(baseTerminal.getVehicleCode());
+            vehiclePosition.setTerminalLatitude(heartbeatVo.getLatitude());
+            vehiclePosition.setTerminalLongitude(heartbeatVo.getLongitude());
             //机车行驶表添加数据
             boolean save = vehiclePositionService.save(vehiclePosition);
+            //修改车载终端经度纬度
+            BaseVehicleTerminal baseVehicleTerminal = new BaseVehicleTerminal();
+            baseVehicleTerminal.setTerminalLatitude(heartbeatVo.getLatitude());
+            baseVehicleTerminal.setTerminalLongitude(heartbeatVo.getLongitude());
+            LambdaQueryWrapper<BaseVehicleTerminal> terminal = new LambdaQueryWrapper<>();
+            terminal.eq(BaseVehicleTerminal::getTerminalCode, vehiclePosition.getTerminalCode());
+            boolean update = baseVehicleTerminalService.update(baseVehicleTerminal, terminal);
+            //*******获取终端经度纬度,将车载终端code改为机车的code,便是机车的位置
+            HeartbeatVo heartbeatVoCH = new HeartbeatVo();
+            BeanUtils.copyProperties(heartbeatVo, heartbeatVoCH);
+            //*******将终端关联的机车编码赋值给推送信息对象
+            heartbeatVoCH.setVehicleCode(baseTerminal.getVehicleCode());
+            String content = objStr(heartbeatVoCH);
+            //获取在线用户
+            List<SysUserOnline> rows = (List<SysUserOnline>) sysUserOnlineController.list(null, null).getRows();
+            if (!ObjectUtils.isEmpty(rows)) {
+                //拿到用户userNameList
+                List<String> userNameList = rows.stream().map(SysUserOnline::getUserName).collect(Collectors.toList());
+                LambdaQueryWrapper<SysUser> userWrapper = new LambdaQueryWrapper<>();
+                userWrapper.in(SysUser::getUserName, userNameList);
+                List<SysUser> sysUsers = sysUserMapper.selectList(userWrapper);
+                //拿到用户userIdList
+                List<Long> userIdList = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
+                for (Long userid : userIdList) {
+                    //推送给在线用户
+                    webSocketServer.sendOneMessage(String.valueOf(userid), content);
+                }
+            }
+
             //目视距离和里程位置
-            if (save) {
+            if (save && update) {
                 LambdaQueryWrapper<MsgAlarm> queryWrapper = new LambdaQueryWrapper<>();
-                queryWrapper.le(MsgAlarm::getAlarmMile, heartbeatVo.getCurrentMile());
-                queryWrapper.ge(MsgAlarm::getAlarmMile, (heartbeatVo.getCurrentMile() + 10000));
+                queryWrapper.ge(MsgAlarm::getAlarmMile, heartbeatVo.getCurrentMile());
+                queryWrapper.le(MsgAlarm::getAlarmMile, (heartbeatVo.getCurrentMile() + 10000));
                 queryWrapper.eq(MsgAlarm::getLineDir, heartbeatVo.getLineDir());
                 queryWrapper.orderByAsc(MsgAlarm::getAlarmMile);
                 List<MsgAlarm> list = msgAlarmService.list(queryWrapper);
@@ -409,12 +619,13 @@ public class GeoHazardMonitorTokenController {
                     camera.ge(BaseCameraManagement::getBeginMile, list.get(0).getAlarmMile());
                     camera.le(BaseCameraManagement::getEndMile, list.get(0).getAlarmMile());
                     camera.eq(BaseCameraManagement::getLineDir, heartbeatVo.getLineDir());
+                    camera.eq(BaseCameraManagement::getRailwayCode, heartbeatVo.getRailwayCode());
                     camera.orderByAsc(BaseCameraManagement::getInstallMile);
                     List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementService.list(camera);
                     List<AlarmListVo> listVos = new ArrayList<>();
                     if (baseCameraManagementList.size() > 0) {
                         //获取视频点播地址
-                        String playFlv = CameraUtil.getPlayFlv(baseCameraManagementList.get(0).getCameraCode(), baseCameraManagementList.get(0).getChannel(), false);
+                        String playFlv = CameraUtil.getPlayFlvRtsp(baseCameraManagementList.get(0).getCameraCode(), baseCameraManagementList.get(0).getChannel(), false);
                         respHeartbeatVo.setCurrentStream(playFlv);
                         respHeartbeatVo.setIsAlarm(1);
                         respHeartbeatVo.setCameraCode(baseCameraManagementList.get(0).getCameraCode());
@@ -424,12 +635,19 @@ public class GeoHazardMonitorTokenController {
                         alarmInfoVo.setAlarmId(list.get(0).getAlarmId());
                         alarmInfoVo.setAlarmMile(list.get(0).getAlarmMile());
                         alarmInfoVo.setAlarmTime(list.get(0).getAlarmTime().getTime());
+                        alarmInfoVo.setAlarmContent(list.get(0).getContent());
                         alarmInfoVo.setAlarmType(list.get(0).getAlarmType());
                         alarmInfoVo.setAlarmLevel(list.get(0).getAlarmLevel());
                         AlarmFilesVo[] files = new AlarmFilesVo[1];
                         LambdaQueryWrapper<MsgAlarmExt> ext = new LambdaQueryWrapper<>();
                         ext.eq(MsgAlarmExt::getAlarmId, list.get(0).getAlarmId());
                         MsgAlarmExt one = msgAlarmExtService.getOne(ext);
+                        if (ObjectUtils.isEmpty(one)) {
+                            jsonObject.put("resultCode", 0);
+                            jsonObject.put("message", "失败");
+                            jsonObject.put("data", "没有该报警ID的关联信息");
+                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+                        }
                         files[0] = new AlarmFilesVo();
                         files[0].setAlarmAttType(one.getAlarmAttType());
                         files[0].setAlarmAttPath(one.getAlarmAttPath());
@@ -448,6 +666,7 @@ public class GeoHazardMonitorTokenController {
                         ment.ge(BaseCameraManagement::getBeginMile, list.get(i).getAlarmMile());
                         ment.le(BaseCameraManagement::getEndMile, list.get(i).getAlarmMile());
                         ment.eq(BaseCameraManagement::getLineDir, heartbeatVo.getLineDir());
+                        ment.eq(BaseCameraManagement::getRailwayCode, heartbeatVo.getRailwayCode());
                         ment.orderByAsc(BaseCameraManagement::getInstallMile);
                         if (i == 0) {
                             wrapper.last("limit 1,1000000");
@@ -456,7 +675,7 @@ public class GeoHazardMonitorTokenController {
                         List<BaseCameraManagement> baseList = baseCameraManagementService.list(camera);
                         if (baseList.size() > 0) {
                             for (int o = 0; o < baseList.size(); o++) {
-                                String flv = CameraUtil.getPlayFlv(baseList.get(o).getCameraCode(), baseList.get(o).getChannel(), false);
+                                String flv = CameraUtil.getPlayFlvRtsp(baseList.get(o).getCameraCode(), baseList.get(o).getChannel(), false);
                                 AlarmListVo alarmListVo = new AlarmListVo();
                                 //alarmList对象
                                 alarmListVo.setCameraStream(flv);
@@ -468,6 +687,7 @@ public class GeoHazardMonitorTokenController {
                                 alarmInfoVo1.setAlarmMile(list.get(i).getAlarmMile());
                                 alarmInfoVo1.setAlarmTime(list.get(i).getAlarmTime().getTime());
                                 alarmInfoVo1.setAlarmType(list.get(i).getAlarmType());
+                                alarmInfoVo1.setAlarmContent(list.get(i).getContent());
                                 alarmInfoVo1.setAlarmLevel(list.get(i).getAlarmLevel());
                                 LambdaQueryWrapper<MsgAlarmExt> alarm = new LambdaQueryWrapper<>();
                                 alarm.eq(MsgAlarmExt::getAlarmId, list.get(0).getAlarmId());
@@ -495,22 +715,17 @@ public class GeoHazardMonitorTokenController {
                     //没有报警信息的时候
                     distance = heartbeatVo.getVisualDistance() + heartbeatVo.getCurrentMile();
                     LambdaQueryWrapper<BaseCameraManagement> base = new LambdaQueryWrapper<>();
-                    base.gt(BaseCameraManagement::getInstallMiles, distance);
+                    base.gt(BaseCameraManagement::getInstallMile, distance);
                     base.eq(BaseCameraManagement::getLineDir, heartbeatVo.getLineDir());
-                    base.orderByAsc(BaseCameraManagement::getInstallMiles);
-                    wrapper.last("limit 4");
+                    base.orderByAsc(BaseCameraManagement::getInstallMile);
+                    base.last("limit 4");
                     List<BaseCameraManagement> list1 = baseCameraManagementService.list(base);
-                    String flv = CameraUtil.getPlayFlv(list1.get(0).getCameraCode(), list1.get(0).getChannel(), false);
+                    CameraUtil.invite(list1.get(0).getCameraCode(), list1.get(0).getChannel());
+                    String flv = CameraUtil.getPlayFlvRtsp(list1.get(0).getCameraCode(), list1.get(0).getChannel(), false);
                     for (BaseCameraManagement baseCameraManagement : list1) {
-                        String flv1 = CameraUtil.getPlayFlv(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel(), false);
+                        String flv1 = CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel(), false);
                         twoMap.put(baseCameraManagement.getCameraCode(), flv1);
-                        String invite = CameraUtil.invite(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel());
-                        if (!"304".equals(invite) && !"200".equals(invite)) {
-                            jsonObject.put("resultCode", 0);
-                            jsonObject.put("message", "失败");
-                            jsonObject.put("data", "视频邀约失败,视频中心没有该相机编码或通道编码的摄像头!!!");
-                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
-                        }
+                        CameraUtil.invite(baseCameraManagement.getCameraCode(), baseCameraManagement.getChannel());
                     }
                     respHeartbeatVo.setCurrentStream(flv);
                     respHeartbeatVo.setIsAlarm(2);
@@ -541,20 +756,32 @@ public class GeoHazardMonitorTokenController {
     /**
      * 司机忽略报警接口
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/terminal/ignore")
-    public String terminalIgnore(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String terminalIgnore(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         Map<String, Object> map = new HashMap<>();
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             TerminalIgnoreVo terminalIgnoreVo = JSON.parseObject(s, TerminalIgnoreVo.class);
+            if (ObjectUtils.isEmpty(terminalIgnoreVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(terminalIgnoreVo.getAlarmId())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警唯一UUID不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             map.put("terminalCode", terminalIgnoreVo.getTerminalCode());
             map.put("alarmId", terminalIgnoreVo.getAlarmId());
             LambdaQueryWrapper<MsgAlarm> wrapper = new LambdaQueryWrapper<>();
@@ -598,19 +825,25 @@ public class GeoHazardMonitorTokenController {
     /**
      * 获取所有的相机列表接口定义
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/query/camera")
-    public String camera(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String camera(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             CameraVo cameraVo = JSON.parseObject(s, CameraVo.class);
+            if (ObjectUtils.isEmpty(cameraVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             LambdaQueryWrapper<BaseCameraManagement> wrapper = new LambdaQueryWrapper<>();
             if (!ObjectUtils.isEmpty(cameraVo.getRailwayCode())) {
                 wrapper.eq(BaseCameraManagement::getRailwayCode, cameraVo.getRailwayCode());
@@ -619,12 +852,24 @@ public class GeoHazardMonitorTokenController {
                 wrapper.eq(BaseCameraManagement::getLineDir, cameraVo.getLineDir());
             }
             List<BaseCameraManagement> list = baseCameraManagementService.list(wrapper);
+            if (list.size() <= 0) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "没有该线路编码或行别的相机信息");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             for (BaseCameraManagement baseCameraManagement : list) {
                 LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
                 if (!ObjectUtils.isEmpty(baseCameraManagement.getRailwayCode())) {
                     queryWrapper.eq(BaseRailwayManagement::getRailwayCode, baseCameraManagement.getRailwayCode());
                 }
                 BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+                if (ObjectUtils.isEmpty(baseRailwayManagement)) {
+                    jsonObject.put("resultCode", 0);
+                    jsonObject.put("message", "失败");
+                    jsonObject.put("data", "没有该线路编码的线路信息");
+                    return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+                }
                 baseCameraManagement.setRailwayName(baseRailwayManagement.getRailwayName());
             }
             list.sort(new Comparator<BaseCameraManagement>() {
@@ -665,21 +910,32 @@ public class GeoHazardMonitorTokenController {
     /**
      * 点播功能接口定义(直播流)
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/camera/play")
-    public String cameraPlay(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String cameraPlay(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         Map<String, Object> map = new HashMap<>();
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             CameraPlayVo cameraPlayVo = JSON.parseObject(s, CameraPlayVo.class);
-
+            if (ObjectUtils.isEmpty(cameraPlayVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(cameraPlayVo.getCameraCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "相机编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             LambdaQueryWrapper<BaseCameraManagement> lw = new LambdaQueryWrapper<BaseCameraManagement>();
             lw.eq(BaseCameraManagement::getCameraCode, cameraPlayVo.getCameraCode());
             BaseCameraManagement one = baseCameraManagementService.getOne(lw);
@@ -689,7 +945,7 @@ public class GeoHazardMonitorTokenController {
                 jsonObject.put("data", "没有该相机编码的相机");
                 return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
             }
-            String flv = CameraUtil.getPlayFlv(one.getCameraCode(), one.getChannel());
+            String flv = CameraUtil.getPlayFlvRtsp(one.getCameraCode(), one.getChannel(), false);
             map.put("url", flv);
             jsonObject.put("resultCode", 1);
             jsonObject.put("message", "ok");
@@ -707,19 +963,25 @@ public class GeoHazardMonitorTokenController {
     /**
      * 获取报警列表(已解除和未解除)
      *
-     * @param parameter
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/query/alarm")
-    public String queryAlarm(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String queryAlarm(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             CameraVo cameraVo = JSON.parseObject(s, CameraVo.class);
+            if (ObjectUtils.isEmpty(cameraVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             LambdaQueryWrapper<MsgAlarm> wrapper = new LambdaQueryWrapper<>();
             if (!ObjectUtils.isEmpty(cameraVo.getRailwayCode())) {
                 wrapper.eq(MsgAlarm::getRailwayCode, cameraVo.getRailwayCode());
@@ -728,6 +990,12 @@ public class GeoHazardMonitorTokenController {
                 wrapper.eq(MsgAlarm::getLineDir, cameraVo.getLineDir());
             }
             List<MsgAlarm> list = msgAlarmService.list(wrapper);
+            if (list.size() <= 0) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "没有该报警线路或行别的报警信息");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             QueryAlarmVo queryAlarmVo = new QueryAlarmVo();
             List<RespAlarmList> listVos = new ArrayList<>();
             for (MsgAlarm msgAlarm : list) {
@@ -741,14 +1009,16 @@ public class GeoHazardMonitorTokenController {
                 LambdaQueryWrapper<MsgAlarmExt> alarm = new LambdaQueryWrapper<>();
                 alarm.eq(MsgAlarmExt::getAlarmId, msgAlarm.getAlarmId());
                 List<MsgAlarmExt> list1 = msgAlarmExtService.list(alarm);
-                AlarmFilesVo[] vo = new AlarmFilesVo[list1.size()];
-                for (int i1 = 0; i1 < list1.size(); i1++) {
-                    vo[i1] = new AlarmFilesVo();
-                    vo[i1].setAlarmAttType(list1.get(i1).getAlarmAttType());
-                    vo[i1].setAlarmAttPath(list1.get(i1).getAlarmAttPath());
+                if (list1.size() > 0) {
+                    AlarmFilesVo[] vo = new AlarmFilesVo[list1.size()];
+                    for (int i1 = 0; i1 < list1.size(); i1++) {
+                        vo[i1] = new AlarmFilesVo();
+                        vo[i1].setAlarmAttType(list1.get(i1).getAlarmAttType());
+                        vo[i1].setAlarmAttPath(list1.get(i1).getAlarmAttPath());
+                    }
+                    //返回结果
+                    alarmInfoVo1.setAlarmFiles(vo);
                 }
-                //返回结果
-                alarmInfoVo1.setAlarmFiles(vo);
                 alarmListVo.setAlarmInfo(alarmInfoVo1);
                 listVos.add(alarmListVo);
             }
@@ -768,24 +1038,37 @@ public class GeoHazardMonitorTokenController {
 
     /**
      * 获取报警回放
-     * @param parameter
+     *
+     * @param parameterVo
      * @param request
      * @return
      */
     @PostMapping("/api/alarm/play")
-    public String alarmPlay(@RequestParam("parameter") String parameter, HttpServletRequest request) {
+    public String alarmPlay(@RequestBody ParameterVo parameterVo, HttpServletRequest request) {
         Map<String, Object> map = new HashMap<>();
+        String urls = null;
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
-        log.info("parameter:{}", parameter);
+        log.info("parameter:{}", parameterVo);
         JSONObject jsonObject = new JSONObject();
         if (StringUtils.isNotEmpty(token)) {
-            String s = SM4Utils.decryptData_ECB(parameter, "4370780c9a8c43e5");
+            String s = SM4Utils.decryptData_ECB(parameterVo.getParameter(), "4370780c9a8c43e5");
             TerminalIgnoreVo terminalIgnoreVo = JSON.parseObject(s, TerminalIgnoreVo.class);
+            if (ObjectUtils.isEmpty(terminalIgnoreVo.getTerminalCode())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "车载终端编码不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
+            if (ObjectUtils.isEmpty(terminalIgnoreVo.getAlarmId())) {
+                jsonObject.put("resultCode", 0);
+                jsonObject.put("message", "失败");
+                jsonObject.put("data", "报警唯一UUID不能为空");
+                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
+            }
             LambdaQueryWrapper<MsgAlarm> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(MsgAlarm::getAlarmId, terminalIgnoreVo.getAlarmId());
             MsgAlarm one = msgAlarmService.getOne(wrapper);
-            ArrayList<String> urls = new ArrayList<>();
             if (ObjectUtils.isEmpty(one)) {
                 jsonObject.put("resultCode", 0);
                 jsonObject.put("message", "失败");
@@ -800,36 +1083,34 @@ public class GeoHazardMonitorTokenController {
                 camera.orderByAsc(BaseCameraManagement::getInstallMile);
                 List<BaseCameraManagement> baseCameraManagementList = baseCameraManagementService.list(camera);
                 if (baseCameraManagementList.size() > 0) {
-                    for (BaseCameraManagement baseCameraManagement : baseCameraManagementList) {
-                        Object cacheObject = redisCache.getCacheObject("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode());
-                        if (ObjectUtils.isEmpty(cacheObject)) {
-                            String url = null;
-                            if ("1".equals(one.getIsRelease().toString())) {
-                                url = CameraUtil.historyPlayListStr(baseCameraManagement.getChannel(),
-                                        one.getAlarmTime(),
-                                        one.getReleasedTime(),
-                                        true);
-                                redisCache.setCacheObject("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode(), url);
-                                redisCache.expire("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode(), 365L, TimeUnit.DAYS);
-                            } else {
-                                url = CameraUtil.historyPlayListStr(baseCameraManagement.getChannel(),
-                                        one.getAlarmTime(),
-                                        new Date(),
-                                        false);
-                            }
-                            urls.add(serverConfig.getUrl() + url);
-                        }else{
-                            urls.add(serverConfig.getUrl() + cacheObject);
+                    BaseCameraManagement baseCameraManagement = baseCameraManagementList.get(0);
+                    Object cacheObject = redisCache.getCacheObject("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode());
+                    if (ObjectUtils.isEmpty(cacheObject)) {
+                        String url = null;
+                        if ("1".equals(one.getIsRelease().toString())) {
+                            url = CameraUtil.historyPlayListStr(baseCameraManagement.getChannel(),
+                                    one.getAlarmTime(),
+                                    one.getReleasedTime(),
+                                    true);
+                            redisCache.setCacheObject("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode(), url);
+                            redisCache.expire("STREAMING_ALARM_VIDEO:" + baseCameraManagement.getCameraCode(), 365L, TimeUnit.DAYS);
+                        } else {
+                            url = CameraUtil.historyPlayListStr(baseCameraManagement.getChannel(),
+                                    one.getAlarmTime(),
+                                    new Date(),
+                                    false);
                         }
+                        urls = serverConfig.getUrl() + url;
+                    } else {
+                        urls = serverConfig.getUrl() + cacheObject;
                     }
                 } else {
-                    jsonObject.put("resultCode", 1);
+                    jsonObject.put("resultCode", 0);
                     jsonObject.put("message", "失败");
                     jsonObject.put("data", "没有该报警里程位置的相机");
                     return SM4Utils.encryptData_ECB(JSONObject.toJSONString(jsonObject), "4370780c9a8c43e5");
                 }
-                String[] array = urls.toArray(new String[]{});
-                map.put("urls", array);
+                map.put("url", urls);
                 jsonObject.put("resultCode", 1);
                 jsonObject.put("message", "ok");
                 jsonObject.put("data", map);
@@ -843,10 +1124,26 @@ public class GeoHazardMonitorTokenController {
         }
     }
 
+    private String objStr(HeartbeatVo heartbeatVoCH) {
+        JSONObject obj = new JSONObject();
+        //data
+        obj.put("data", heartbeatVoCH);
+        //code
+        obj.put("code", 151);
+        log.info("【websocket消息】 机车地址信息:" + obj.toJSONString());
+        return obj.toJSONString();
+    }
 
     public static void main(String[] args) {
         JSONObject res = new JSONObject();
-        res.put("terminalCode", "111");
+        res.put("terminalCode", "001");
+        res.put("currentMile", 2000);
+        res.put("longitude", "200");
+        res.put("latitude", "300");
+        res.put("railwayCode", "JT01");
+        res.put("lineDir", 1);
+        res.put("visualDistance", 500);
+        res.put("signalStrength", 1);
         String s = SM4Utils.encryptData_ECB(JSONObject.toJSONString(res), "4370780c9a8c43e5");
         System.out.println(s);
     }

+ 44 - 4
vehicle-admin/src/main/java/com/ozs/web/controller/sdk/UploadController.java

@@ -2,12 +2,15 @@ package com.ozs.web.controller.sdk;
 
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ozs.common.core.domain.entity.SysDept;
 import com.ozs.common.utils.MinioUtils;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.stateSecrets.SM4Utils;
 import com.ozs.common.utils.uuid.IdUtils;
 import com.ozs.entity.BaseCameraManagement;
+import com.ozs.entity.BaseRailwayManagement;
 import com.ozs.service.BaseCameraManagementService;
+import com.ozs.service.BaseRailwayManagementService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.util.ObjectUtils;
@@ -25,7 +28,7 @@ import java.util.Map;
 
 @RestController
 public class UploadController {
-
+    public static final String PATTERN = "^[0-9]*$";
     @Value("${minio.bucketName}")
     private String bucketName;
 
@@ -35,6 +38,8 @@ public class UploadController {
     BaseCameraManagementService baseCameraManagementService;
     @Value("${base.imgUrl}")
     private String imgUrl;
+    @Autowired
+    private BaseRailwayManagementService baseRailwayManagementService;
 
 
     @PostMapping("/api/putFile")
@@ -47,15 +52,50 @@ public class UploadController {
 
         JSONObject jsonObject = new JSONObject();
         if (stream.isEmpty()) {
-            jsonObject.put("resultCode", 2);
+            jsonObject.put("resultCode", 0);
             jsonObject.put("message", "失败");
             jsonObject.put("data", "不能上传空文件哦");
             return jsonObject;
         }
+        if (lineDir!=1&&lineDir!=2){
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "行别填写错误");
+            return jsonObject;
+        }
+        if (!alarmMile.toString().matches(PATTERN)) {
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "报警里程位置填写格式不正确");
+            return jsonObject;
+        }
+        if (!size.toString().matches(PATTERN)) {
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "要上传的stream的填写格式不正确");
+            return jsonObject;
+        }
+        if (ObjectUtils.isEmpty(contentType)){
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "Content Type不能为空");
+            return jsonObject;
+        }
+        LambdaQueryWrapper<BaseRailwayManagement> queryWrapper = new LambdaQueryWrapper<BaseRailwayManagement>();
+        if (!ObjectUtils.isEmpty(alarmRailway)) {
+            queryWrapper.eq(BaseRailwayManagement::getRailwayCode, alarmRailway);
+        }
+        BaseRailwayManagement baseRailwayManagement = baseRailwayManagementService.getOne(queryWrapper);
+        if (ObjectUtils.isEmpty(baseRailwayManagement)){
+            jsonObject.put("resultCode", 0);
+            jsonObject.put("message", "失败");
+            jsonObject.put("data", "填写的报警线路编码不存在");
+            return jsonObject;
+        }
         //图片保存路径
         //String fileUploadPath ="/"+userId+"/image";
         String uploadFile = null;
-        if (stream != null && !stream.isEmpty()) {
+        if (!stream.isEmpty()) {
 
             String imageName = stream.getOriginalFilename();
             if (StringUtils.isNotBlank(imageName)) {
@@ -67,7 +107,7 @@ public class UploadController {
                 uploadFile = imgUrl+"/" + alarmRailway + "/" + lineDir + "/" + alarmMile + "/" + format1 + "/" + filename;
             }
         } else {
-            jsonObject.put("resultCode", 2);
+            jsonObject.put("resultCode", 0);
             jsonObject.put("message", "失败");
             jsonObject.put("data", "图片为null");
             return jsonObject;

+ 4 - 3
vehicle-admin/src/main/java/com/ozs/web/controller/system/SysDeptController.java

@@ -6,6 +6,7 @@ import com.ozs.common.constant.UserConstants;
 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.vo.SysDeptVo;
 import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.StringUtils;
 import com.ozs.common.utils.poi.ExcelUtil;
@@ -37,7 +38,7 @@ public class SysDeptController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list")
-    public AjaxResult list(SysDept dept) {
+    public AjaxResult list(SysDeptVo dept) {
         List<SysDept> depts = deptService.selectDeptList(dept);
         for (SysDept sysDept : depts) {
             for (SysDept dept1 : depts) {
@@ -73,7 +74,7 @@ public class SysDeptController extends BaseController {
      */
     @GetMapping("/deptTree")
     @ApiOperation("获取部门树列表")
-    public AjaxResult deptTree(SysDept dept) {
+    public AjaxResult deptTree(SysDeptVo dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
 
@@ -83,7 +84,7 @@ public class SysDeptController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:dept:list')")
     @GetMapping("/list/exclude/{deptId}")
     public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) {
-        List<SysDept> depts = deptService.selectDeptList(new SysDept());
+        List<SysDept> depts = deptService.selectDeptList(new SysDeptVo());
         depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
         return success(depts);
     }

+ 1 - 1
vehicle-admin/src/main/java/com/ozs/web/controller/system/SysDictDataController.java

@@ -71,7 +71,7 @@ public class SysDictDataController extends BaseController {
             wrapper.like(SysDictData::getDictValue, sysDictDataVo.getDictValue());
         }
         if (!ObjectUtils.isEmpty(sysDictDataVo.getDictType())) {
-            wrapper.like(SysDictData::getDictType, sysDictDataVo.getDictType());
+            wrapper.eq(SysDictData::getDictType, sysDictDataVo.getDictType());
         }
         if (!ObjectUtils.isEmpty(sysDictDataVo.getCssClass())) {
             wrapper.like(SysDictData::getCssClass, sysDictDataVo.getCssClass());

+ 2 - 1
vehicle-admin/src/main/java/com/ozs/web/controller/system/SysRoleController.java

@@ -10,6 +10,7 @@ import com.ozs.common.core.domain.entity.SysMenu;
 import com.ozs.common.core.domain.entity.SysRole;
 import com.ozs.common.core.domain.entity.SysUser;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.core.domain.vo.SysDeptVo;
 import com.ozs.common.core.domain.vo.SysRoleRequestVo;
 import com.ozs.common.core.page.TableDataInfo;
 import com.ozs.common.enums.BusinessType;
@@ -282,7 +283,7 @@ public class SysRoleController extends BaseController {
     public AjaxResult deptTree(@PathVariable("roleId") Long roleId) {
         AjaxResult ajax = AjaxResult.success();
         ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
-        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
+        ajax.put("depts", deptService.selectDeptTreeList(new SysDeptVo()));
         return ajax;
     }
 }

+ 2 - 1
vehicle-admin/src/main/java/com/ozs/web/controller/system/SysUserController.java

@@ -7,6 +7,7 @@ import com.ozs.common.core.controller.BaseController;
 import com.ozs.common.core.domain.AjaxResult;
 import com.ozs.common.core.domain.entity.*;
 import com.ozs.common.core.domain.model.LoginUser;
+import com.ozs.common.core.domain.vo.SysDeptVo;
 import com.ozs.common.core.domain.vo.SysUserVo;
 import com.ozs.common.enums.BusinessType;
 import com.ozs.common.utils.SecurityUtils;
@@ -423,7 +424,7 @@ public class SysUserController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/deptTree")
     @Log(title = "用户管理", businessType = BusinessType.OTHER)
-    public AjaxResult deptTree(SysDept dept) {
+    public AjaxResult deptTree(SysDeptVo dept) {
         return success(deptService.selectDeptTreeList(dept));
     }
 

+ 470 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/websocket/JPushUtil.java

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

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

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

+ 140 - 0
vehicle-admin/src/main/java/com/ozs/web/controller/websocket/WebSocketServer.java

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

+ 2 - 1
vehicle-admin/src/main/java/com/ozs/web/core/config/CaneraConfig.java

@@ -38,5 +38,6 @@ public class CaneraConfig {
     @Value("${base.bakUrl:http://124.70.58.209:18891}")
     private String bakUrl;
 
-
+    @Value("${base.bakUrl:rtsp://124.70.58.209:8554}")
+    private String bakUrlRtsp;
 }

+ 27 - 7
vehicle-admin/src/main/java/com/ozs/web/core/util/CameraUtil.java

@@ -10,8 +10,6 @@ import com.ozs.common.exception.base.BaseException;
 import com.ozs.common.utils.DateUtils;
 import com.ozs.common.utils.HttpClientUtil;
 import com.ozs.common.utils.http.HttpUtils;
-import com.ozs.common.utils.stateSecrets.SM4Utils;
-import com.ozs.entity.MsgAlarm;
 import com.ozs.service.BaseCameraManagementService;
 import com.ozs.system.mapper.SysDictDataMapper;
 import com.ozs.web.core.config.CaneraConfig;
@@ -47,6 +45,7 @@ public class CameraUtil {
     private static String transcribeFilePath;
     private static String webUrl;
     private static String bakUrl;
+    private static String bakUrlRtsp;
     private static CmdCameraUtil cUtil;
 
     @Autowired
@@ -152,7 +151,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
                 // 如果没有解除,把生成的文件放入要删除的定时任务 redis key 中
                 fileTs.add(newfilePath);
             }
-            mergeVideoTsFile.put(new Date().getTime() + "", fileTs);
+            mergeVideoTsFile.put(System.currentTimeMillis() + "", fileTs);
             rc.deleteObject(tsFilekey);
             if (mergeVideoTsFile.size() > 0) {
                 rc.setCacheMap(tsFilekey, mergeVideoTsFile);
@@ -164,7 +163,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         }
 
     }
-    
+
     /**
      * 实时播放的拼接流
      *
@@ -179,6 +178,27 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         return webUrl + "/hdl/" + channel + "/" + cameraCode + ".flv";
 
 
+//        if (!flay) {
+//            return bakUrl + "/ws/" + channel + "/" + cameraCode + ".flv";
+//        }
+//        return webUrl + "/ws/" + channel + "/" + cameraCode + ".flv";
+    }
+
+
+    /**
+     * Rtsp实时播放的拼接流
+     *
+     * @param cameraCode 相机编码
+     * @param channel    相机通道
+     * @return
+     */
+    public static String getPlayFlvRtsp(String cameraCode, String channel, boolean flay) {
+        if (!flay) {
+            return bakUrlRtsp + "/" + channel + "/" + cameraCode;
+        }
+        return bakUrlRtsp + "/" + channel + "/" + cameraCode;
+
+
 //        if (!flay) {
 //            return bakUrl + "/ws/" + channel + "/" + cameraCode + ".flv";
 //        }
@@ -201,8 +221,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         }
         return result;
     }
-    
-    
+
 
     /**
      * 开启录制功能
@@ -279,7 +298,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         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)) {
+        if (!StringUtils.isBlank(s) && !"null".equals(s) && !s.startsWith("<!DOCTYPE html>")) {
             List<Map<String, Object>> maps = JSON.parseArray(s, Map.class);
             if (ObjectUtils.isEmpty(maps)) {
                 return null;
@@ -441,6 +460,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         transcribeFilePath = caneraConfig.getTranscribeFilePath();
         webUrl = caneraConfig.getWebUrl();
         bakUrl = caneraConfig.getBakUrl();
+        bakUrlRtsp=caneraConfig.getBakUrlRtsp();
         rc = redisCache;
         cUtil = cmdCameraUtil;
     }

+ 1 - 1
vehicle-admin/src/main/resources/application.yml

@@ -39,7 +39,7 @@ server:
 # 日志配置
 logging:
   level:
-    com.ruoyi: debug
+    com.ozs: debug
     org.springframework: warn
 
 # 用户配置

BIN
vehicle-admin/src/main/resources/template/BaseVehicle.xlsx


BIN
vehicle-admin/src/main/resources/template/BaseVehicleTerminal.xlsx