From 0abccf5e570dce53a802bca4ce25118dd900692c Mon Sep 17 00:00:00 2001
From: aijinhui <aijinhui>
Date: Fri, 23 Feb 2024 14:07:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml                                   |   29 +
 ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java    |   16 
 ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java            |   65 --
 ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java |  262 ++++++++++
 ard-work/src/main/java/com/ruoyi/app/application/service/impl/ArdAppApplicationServiceImpl.java   |  184 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java                             |    4 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java                  |    1 
 ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java         |  159 ++----
 ard-work/src/main/java/com/ruoyi/app/position/mapper/ArdAppPositionMapper.java                    |    5 
 ard-work/src/main/resources/mapper/app/ArdAppPositionMapper.xml                                   |   12 
 ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java                         |   85 +++
 ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java         |    4 
 ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml                       |   40 +
 ard-work/src/main/java/com/ruoyi/utils/forest/SYClient.java                                       |    3 
 ard-work/src/main/java/com/ruoyi/app/position/appcontainer/AppContainer.java                      |   19 
 ard-work/src/main/java/com/ruoyi/app/application/service/IArdAppApplicationService.java           |    2 
 ard-work/pom.xml                                                                                  |    9 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java                  |   10 
 ard-work/src/main/java/com/ruoyi/app/application/controller/ArdAppApplicationController.java      |   14 
 ruoyi-admin/src/main/resources/application-prod.yml                                               |   11 
 ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java                 |    9 
 ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java            |    4 
 ard-work/src/main/java/com/ruoyi/device/uav/websocketclient/UAVWebsocketClient.java               |   45 +
 ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java                               |  386 ++++++++++++++++
 ruoyi-admin/src/main/resources/application-dev.yml                                                |   36 +
 25 files changed, 1,227 insertions(+), 187 deletions(-)

diff --git a/ard-work/pom.xml b/ard-work/pom.xml
index 8a51372..d7e3021 100644
--- a/ard-work/pom.xml
+++ b/ard-work/pom.xml
@@ -196,7 +196,14 @@
             <artifactId>orai18n</artifactId>
             <version>12.1.0.2.0</version>
         </dependency>
-<!--        <dependency>-->
+        <!-- WebSocket客户端 -->
+        <dependency>
+            <groupId>org.java-websocket</groupId>
+            <artifactId>Java-WebSocket</artifactId>
+            <version>1.3.8</version>
+        </dependency>
+
+        <!--        <dependency>-->
 <!--            <groupId>com.alibaba</groupId>-->
 <!--            <artifactId>druid</artifactId>-->
 <!--            <version>1.2.15</version>-->
diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java
index 8925dfe..8a8c4ba 100644
--- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java
+++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java
@@ -248,4 +248,20 @@
         return AjaxResult.success(result);
     }
 
+    @GetMapping("/getWellDataByPatrolplanIdAndPosition")
+    @ApiOperation("查询最近巡检设备动静态属性")
+    public AjaxResult getWellDataByPatrolplanIdAndPosition(@RequestBody Map<String,Object> para){
+        SysConfig config = new SysConfig();
+        config.setConfigKey("3coracle");
+        List<SysConfig> sysConfigResult = sysConfigService.selectConfigList(config);
+        Map<String,Object> result = ardAlarmpointsWellService.getWellDataByPatrolplanIdAndPosition(para,sysConfigResult);
+        return AjaxResult.success(result);
+    }
+
+    @GetMapping("/getWellById")
+    @ApiOperation("根据查询兴趣点基本属性")
+    public AjaxResult getWellById(@RequestBody Map<String,String> para){
+        ArdAlarmpointsWell result = ardAlarmpointsWellService.getWellById(para.get("id"));
+        return AjaxResult.success(result);
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java
index b6f8a26..b2e992b 100644
--- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java
+++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java
@@ -7,6 +7,7 @@
 import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWellDeptVo;
 import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWellParam;
 import com.ruoyi.common.annotation.DataScope;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
@@ -101,6 +102,9 @@
 
     List<ArdAlarmpointsWellDeptVo> wellListDept(List<Long> deptList);
 
+    ArdAlarmpointsWell getWellDataByPatrolplanIdAndPosition(@Param("patrolplanId") String patrolplanId,@Param("longitude") Double longitude,@Param("latitude") Double latitude);
+
+    ArdAlarmpointsWell getWellById(String id);
     List<ArdAlarmpointsWell> conditionList(ArdAlarmpointsWellParam ardAlarmpointsWellParam);
 
 }
diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java
index 8c539e3..62c34fe 100644
--- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java
+++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java
@@ -137,4 +137,8 @@
      * 查询油井动静态数据
      */
     Map<String,Object> getWellDataByWellId(String wellId, List<SysConfig> config);
+
+    Map<String,Object> getWellDataByPatrolplanIdAndPosition(Map<String,Object> para,List<SysConfig> sysConfigResult);
+
+    ArdAlarmpointsWell getWellById(String id);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java
index e6cc1d2..00fefb1 100644
--- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.alarmpoints.well.service.impl;
 
+import java.math.BigDecimal;
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -575,6 +576,267 @@
         return result;
     }
 
+    @Override
+    public Map<String, Object> getWellDataByPatrolplanIdAndPosition(Map<String, Object> para, List<SysConfig> config) {
+        String patrolplanId = (String) para.get("patrolplanId");
+        Double longitude = null;
+        Double latitude = null;
+        try{
+            longitude = (Double) para.get("longitude");
+            latitude = (Double) para.get("latitude");
+        } catch (Exception e){
+            longitude = ((BigDecimal) para.get("longitude")).doubleValue();
+            latitude = ((BigDecimal) para.get("latitude")).doubleValue();
+        }
+        ArdAlarmpointsWell ardAlarmpointsWell = ardAlarmpointsWellMapper.getWellDataByPatrolplanIdAndPosition(patrolplanId,longitude,latitude);
+        if(ardAlarmpointsWell != null){
+            Map<String, Object> result = new HashMap();
+            if (ardAlarmpointsWell.getWellId() != null) {
+                result.put("wellId", ardAlarmpointsWell.getWellId());
+            } else {
+                result.put("wellId", "");
+            }
+            if (ardAlarmpointsWell.getWellNumber() != null) {
+                result.put("wellNumber", ardAlarmpointsWell.getWellNumber());
+            } else {
+                result.put("wellNumber", "");
+            }
+            if (ardAlarmpointsWell.getOilProduction() != null) {
+                result.put("oilProduction", ardAlarmpointsWell.getOilProduction());
+            } else {
+                result.put("oilProduction", "");
+            }
+            if (ardAlarmpointsWell.getWellBlock() != null) {
+                result.put("wellBlock", ardAlarmpointsWell.getWellBlock());
+            } else {
+                result.put("wellBlock", "");
+            }
+            if (ardAlarmpointsWell.getProductionDate() != null) {
+                result.put("productionDate", ardAlarmpointsWell.getProductionDate());
+            } else {
+                result.put("productionDate", "");
+            }
+            if (ardAlarmpointsWell.getDisplacementMode() != null) {
+                result.put("displacementMode", ardAlarmpointsWell.getDisplacementMode());
+            } else {
+                result.put("displacementMode", "");
+            }
+            if (ardAlarmpointsWell.getSurroundingEnvironment() != null) {
+                result.put("surroundingEnvironment", ardAlarmpointsWell.getSurroundingEnvironment());
+            } else {
+                result.put("surroundingEnvironment", "");
+            }
+            if (ardAlarmpointsWell.getWellType() != null) {
+                result.put("wellType", ardAlarmpointsWell.getWellType());
+            } else {
+                result.put("wellType", "");
+            }
+            if (ardAlarmpointsWell.getInstalledLoad() != null) {
+                result.put("installedLoad", ardAlarmpointsWell.getInstalledLoad());
+            } else {
+                result.put("installedLoad", "");
+            }
+            if (ardAlarmpointsWell.getMeteringStation() != null) {
+                result.put("meteringStation", ardAlarmpointsWell.getMeteringStation());
+            } else {
+                result.put("meteringStation", "");
+            }
+            if (ardAlarmpointsWell.getTransferStation() != null) {
+                result.put("transferStation", ardAlarmpointsWell.getTransferStation());
+            } else {
+                result.put("transferStation", "");
+            }
+            if (ardAlarmpointsWell.getDehydrationStation() != null) {
+                result.put("dehydrationStation", ardAlarmpointsWell.getDehydrationStation());
+            } else {
+                result.put("dehydrationStation", "");
+            }
+            if (ardAlarmpointsWell.getRunStatus() != null) {
+                result.put("runStatus", ardAlarmpointsWell.getRunStatus());
+            } else {
+                result.put("runStatus", "");
+            }
+            if (ardAlarmpointsWell.getLongitude() != null) {
+                result.put("longitude", ardAlarmpointsWell.getLongitude());
+            } else {
+                result.put("longitude", "");
+            }
+            if (ardAlarmpointsWell.getLatitude() != null) {
+                result.put("latitude", ardAlarmpointsWell.getLatitude());
+            } else {
+                result.put("latitude", "");
+            }
+            if (ardAlarmpointsWell.getAltitude() != null) {
+                result.put("altitude", ardAlarmpointsWell.getAltitude());
+            } else {
+                result.put("altitude", "");
+            }
+            if (ardAlarmpointsWell.getUserId() != null) {
+                result.put("userId", ardAlarmpointsWell.getUserId());
+            } else {
+                result.put("userId", "");
+            }
+            if (ardAlarmpointsWell.getDeptId() != null) {
+                result.put("deptId", ardAlarmpointsWell.getDeptId());
+                SysDept sysDept = sysDeptMapper.selectDeptById(ardAlarmpointsWell.getDeptId());//查询兴趣点所在部门
+                if (sysDept != null) {
+                    result.put("deptName", sysDept.getDeptName());
+                } else {
+                    result.put("deptName", "");
+                }
+            } else {
+                result.put("deptId", "");
+                result.put("deptName", "");
+            }
+            if (ardAlarmpointsWell.getCreateBy() != null) {
+                result.put("createBy", ardAlarmpointsWell.getCreateBy());
+            } else {
+                result.put("createBy", "");
+            }
+            if (ardAlarmpointsWell.getCreateTime() != null) {
+                result.put("createTime", ardAlarmpointsWell.getCreateTime());
+            } else {
+                result.put("createTime", "");
+            }
+            if (ardAlarmpointsWell.getUpdateBy() != null) {
+                result.put("updateBy", ardAlarmpointsWell.getUpdateBy());
+            } else {
+                result.put("updateBy", "");
+            }
+            if (ardAlarmpointsWell.getUpdateTime() != null) {
+                result.put("updateTime", ardAlarmpointsWell.getUpdateTime());
+            } else {
+                result.put("updateTime", "");
+            }
+            if (config.size() != 0) {
+                String oracle = config.get(0).getConfigValue();
+                String[] oracleArr = oracle.split(";");
+                if (oracleArr.length == 3) {
+                    String url = oracle.split(";")[0];
+                    String username = oracle.split(";")[1];
+                    String password = oracle.split(";")[2];
+                    try {
+                        int checkMark = checkTable(url, username, password, "\'RTU_DATA_YJ_8\'");//三厂表存在
+                        if (checkMark == 1) {
+                            Map<String, Object> resultRTU = getRtuDataYjByJH(url, username, password, "RTU_DATA_YJ_8", "\'" + ardAlarmpointsWell.getWellId() + "\'");
+                            result.putAll(resultRTU);
+                        } else {
+                            result.put("wellRunningState", "n");//油井运行状态
+                            result.put("totalPowerConsumption", "n");//总耗电量
+                            result.put("communicationMachine", "n");//设备通讯
+                            result.put("remark", "n");//备注
+                            result.put("singleWellWaterTemperature", "n");//单井掺水温度//
+                            result.put("meteringPlantWaterPressure", "n");//计量间掺水压力//
+                            result.put("torque", "n");//扭矩
+                            result.put("MAT", "n");//回油温度
+                            result.put("TGP", "n");//井口油压
+                            result.put("CPV", "n");//井口套压
+                            result.put("ADL", "n");//A相电流
+                            result.put("ADY", "n");//A相电压
+                            result.put("BDL", "n");//B相电流
+                            result.put("BDY", "n");//B相电压
+                            result.put("CDL", "n");//C相电流
+                            result.put("CDY", "n");//C相电压
+                            result.put("UCV", "n");//上行电流
+                            result.put("DCV", "n");//下行电流
+                            result.put("SLV", "n");//冲程
+                            result.put("CHC", "n");//冲次
+                            result.put("BPV", "n");//井口回压
+                            result.put("ZWG", "n");//总无功功率
+                            result.put("ZYG", "n");//总有功功率
+                            result.put("GYS", "n");//功率因数
+                            result.put("UWL", "n");//最大载荷
+                            result.put("DWL", "n");//最小载荷
+                            result.put("ZHS", "n");//转速
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                } else if (oracleArr.length == 4) {
+                    String url = oracle.split(";")[0];
+                    String username = oracle.split(";")[1];
+                    String password = oracle.split(";")[2];
+                    String prod = oracle.split(";")[3];
+                    try {
+                        //int checkMark = checkTable(url,username,password,"\'RTU_DATA_YJ_8\'");//三厂表存在
+                        int checkMark = checkTable(url, username, password, "\'" + prod + ".RTU_DATA_YJ_8\'");//三厂表存在
+                        if (checkMark == 1) {
+                            Map<String, Object> resultRTU = getRtuDataYjByJH(url, username, password, prod + ".RTU_DATA_YJ_8", "\'" + ardAlarmpointsWell.getWellId() + "\'");
+                            result.putAll(resultRTU);
+                        } else {
+                            result.put("wellRunningState", "n");//油井运行状态
+                            result.put("totalPowerConsumption", "n");//总耗电量
+                            result.put("communicationMachine", "n");//设备通讯
+                            result.put("remark", "n");//备注
+                            result.put("singleWellWaterTemperature", "n");//单井掺水温度//
+                            result.put("meteringPlantWaterPressure", "n");//计量间掺水压力//
+                            result.put("torque", "n");//扭矩
+                            result.put("MAT", "n");//回油温度
+                            result.put("TGP", "n");//井口油压
+                            result.put("CPV", "n");//井口套压
+                            result.put("ADL", "n");//A相电流
+                            result.put("ADY", "n");//A相电压
+                            result.put("BDL", "n");//B相电流
+                            result.put("BDY", "n");//B相电压
+                            result.put("CDL", "n");//C相电流
+                            result.put("CDY", "n");//C相电压
+                            result.put("UCV", "n");//上行电流
+                            result.put("DCV", "n");//下行电流
+                            result.put("SLV", "n");//冲程
+                            result.put("CHC", "n");//冲次
+                            result.put("BPV", "n");//井口回压
+                            result.put("ZWG", "n");//总无功功率
+                            result.put("ZYG", "n");//总有功功率
+                            result.put("GYS", "n");//功率因数
+                            result.put("UWL", "n");//最大载荷
+                            result.put("DWL", "n");//最小载荷
+                            result.put("ZHS", "n");//转速
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            } else {
+                result.put("wellRunningState", "n");//油井运行状态
+                result.put("totalPowerConsumption", "n");//总耗电量
+                result.put("communicationMachine", "n");//设备通讯
+                result.put("remark", "n");//备注
+                result.put("singleWellWaterTemperature", "n");//单井掺水温度//
+                result.put("meteringPlantWaterPressure", "n");//计量间掺水压力//
+                result.put("torque", "n");//扭矩
+                result.put("MAT", "n");//回油温度
+                result.put("TGP", "n");//井口油压
+                result.put("CPV", "n");//井口套压
+                result.put("ADL", "n");//A相电流
+                result.put("ADY", "n");//A相电压
+                result.put("BDL", "n");//B相电流
+                result.put("BDY", "n");//B相电压
+                result.put("CDL", "n");//C相电流
+                result.put("CDY", "n");//C相电压
+                result.put("UCV", "n");//上行电流
+                result.put("DCV", "n");//下行电流
+                result.put("SLV", "n");//冲程
+                result.put("CHC", "n");//冲次
+                result.put("BPV", "n");//井口回压
+                result.put("ZWG", "n");//总无功功率
+                result.put("ZYG", "n");//总有功功率
+                result.put("GYS", "n");//功率因数
+                result.put("UWL", "n");//最大载荷
+                result.put("DWL", "n");//最小载荷
+                result.put("ZHS", "n");//转速
+            }
+            return result;
+        }else{
+            return null;
+        }
+    }
+
+    @Override
+    public ArdAlarmpointsWell getWellById(String id) {
+        ArdAlarmpointsWell result = ardAlarmpointsWellMapper.getWellById(id);
+        return result;
+    }
+
     public int checkTable(String url, String username, String password, String tableName) throws ClassNotFoundException, SQLException {
         Connection connection = null;
 
diff --git a/ard-work/src/main/java/com/ruoyi/app/application/controller/ArdAppApplicationController.java b/ard-work/src/main/java/com/ruoyi/app/application/controller/ArdAppApplicationController.java
index 72120d3..4a3ee50 100644
--- a/ard-work/src/main/java/com/ruoyi/app/application/controller/ArdAppApplicationController.java
+++ b/ard-work/src/main/java/com/ruoyi/app/application/controller/ArdAppApplicationController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.app.application.controller;
 
+import java.awt.geom.QuadCurve2D;
 import java.util.List;
 import java.util.Map;
 import javax.servlet.http.HttpServletResponse;
@@ -223,4 +224,17 @@
             return AjaxResult.error();
         }
     }
+
+    @GetMapping("/getSoilderAndCarPositionByCommanderIdNear")
+    @ApiOperation("PC端指挥端查看单兵端及车辆位置")
+    public AjaxResult getSoilderAndCarPositionByCommanderIdNear(@RequestBody Map<String, Double> para) {
+        String commanderId = SecurityUtils.getUserId();
+        try{
+            Map<String,Map<String,List<Map<String,Object>>>> result = ardAppApplicationService.getSoilderAndCarPositionByCommanderId(commanderId,para);
+            return AjaxResult.success(result);
+        }catch(Exception e){
+            e.printStackTrace();
+            return AjaxResult.error();
+        }
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/application/service/IArdAppApplicationService.java b/ard-work/src/main/java/com/ruoyi/app/application/service/IArdAppApplicationService.java
index 1e74376..9ebdecf 100644
--- a/ard-work/src/main/java/com/ruoyi/app/application/service/IArdAppApplicationService.java
+++ b/ard-work/src/main/java/com/ruoyi/app/application/service/IArdAppApplicationService.java
@@ -78,4 +78,6 @@
     public int approvalCheckPositionOwn(String soilderId,Map<String,String> para);
 
     public List<Map<String,Object>> getCheckPositionNo(String commanderId);///
+
+    public Map<String,Map<String,List<Map<String,Object>>>> getSoilderAndCarPositionByCommanderId(String commanderId,Map<String, Double> para);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/application/service/impl/ArdAppApplicationServiceImpl.java b/ard-work/src/main/java/com/ruoyi/app/application/service/impl/ArdAppApplicationServiceImpl.java
index 4fc1bcf..5918261 100644
--- a/ard-work/src/main/java/com/ruoyi/app/application/service/impl/ArdAppApplicationServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/app/application/service/impl/ArdAppApplicationServiceImpl.java
@@ -1,12 +1,29 @@
 package com.ruoyi.app.application.service.impl;
 
+import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
+import com.ruoyi.app.position.appcontainer.AppContainer;
+import com.ruoyi.app.position.domain.ArdAppPosition;
+import com.ruoyi.app.position.mapper.ArdAppPositionMapper;
+import com.ruoyi.common.core.domain.entity.SysConfig;
 import com.ruoyi.common.core.domain.entity.SysRole;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.sy.domain.ArdSyUser;
+import com.ruoyi.sy.mapper.ArdSyCarMapper;
+import com.ruoyi.sy.mapper.ArdSyUserMapper;
+import com.ruoyi.system.mapper.SysConfigMapper;
+import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.mapper.SysRoleMapper;
+import com.ruoyi.system.mapper.SysUserMapper;
+import com.ruoyi.utils.forest.SYClient;
+import com.ruoyi.utils.gis.GisUtil;
 import com.ruoyi.utils.websocket.util.WebSocketUtils;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import com.ruoyi.common.utils.StringUtils;
@@ -34,6 +51,30 @@
 
     @Resource
     private SysRoleMapper sysRoleMapper;
+
+    @Resource
+    private SysUserMapper userMapper;
+
+    @Resource
+    private SysDeptMapper sysDeptMapper;
+
+    @Resource
+    private ArdAppPositionMapper ardAppPositionMapper;
+
+    @Resource
+    private ArdSyUserMapper ardSyUserMapper;
+
+    @Resource
+    private SysConfigMapper sysConfigMapper;
+
+    @Resource
+    private ArdSyCarMapper ardSyCarMapper;
+
+    @Resource
+    private SYClient sYClient;
+
+    @Value("${minio.endpoint}")
+    private String minioEndpoint;
 
     private Map<String,Thread> threadMap = new HashMap();
 
@@ -404,4 +445,147 @@
         }
         return ardAppApplicationList;
     }
+
+    @Override
+    public Map<String,Map<String,List<Map<String,Object>>>> getSoilderAndCarPositionByCommanderId(String commanderId,Map<String, Double> para) {
+        Map<String,Map<String,List<Map<String,Object>>>> mapResault = new HashMap();
+        SysUser sysUser = userMapper.selectUserById(commanderId);//获取系统用户
+        List<Long> deptIdList = new ArrayList();
+        deptIdList.add(sysUser.getDeptId());
+        deptIdList = getOwnAndChildrenDeptIdList(deptIdList,new ArrayList());//递归查询下属部门主键
+        List<SysUser> sysUsersResult = userMapper.getOwnAndChildrenSoilderListAll(deptIdList);
+        List<SysUser> sysUsersResultOnline = sysUsersResult.stream().filter(sysUserTest -> sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//在线用户
+        List<SysUser> sysUsersResultOffline = sysUsersResult.stream().filter(sysUserTest -> !sysUserTest.getAppOnlineState().equals("1")).collect(Collectors.toList());//离线用户
+        List<Map<String,Object>> sysUsersOnlineList = new ArrayList();
+        List<Map<String,Object>> sysUsersOfflineList = new ArrayList();
+        for(SysUser sysUserIn : sysUsersResultOnline){
+            Map<String,Object> map = new HashMap();
+            map.put("userId",sysUserIn.getUserId());
+            map.put("deptId",sysUserIn.getDeptId());
+            map.put("userName",sysUserIn.getUserName());
+            map.put("nickName",sysUserIn.getNickName());
+            try{
+                map.put("longitude", AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLongitude());
+                map.put("latitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLatitude());
+                map.put("altitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getAltitude());
+            }catch(Exception e){
+                ArdAppPosition ardAppPosition = ardAppPositionMapper.getLastAPPPositionByUserId(sysUserIn.getUserId());
+                map.put("longitude",ardAppPosition.getLongitude());
+                map.put("latitude",ardAppPosition.getLatitude());
+                map.put("altitude",ardAppPosition.getAltitude());
+            }
+            sysUsersOnlineList.add(map);
+        }
+        List<Map<String,Object>> sysUsersOnlineNearList = new ArrayList();//在200米内
+        for(Map<String,Object> mapOn : sysUsersOnlineList){
+            Double longitude = (Double) mapOn.get("longitude");
+            Double latitude = (Double) mapOn.get("latitude");
+            double distance = GisUtil.getDistance(para.get("longitude"),para.get("latitude"),longitude,latitude);
+            if(distance <= 200){
+                sysUsersOnlineNearList.add(mapOn);
+            }
+        }
+        Map<String,List<Map<String,Object>>> appMap = new HashMap();
+        appMap.put("onlineApp",sysUsersOnlineNearList);
+        for(SysUser sysUserIn : sysUsersResultOffline){
+            Map<String,Object> map = new HashMap();
+            map.put("userId",sysUserIn.getUserId());
+            map.put("deptId",sysUserIn.getDeptId());
+            map.put("userName",sysUserIn.getUserName());
+            map.put("nickName",sysUserIn.getNickName());
+            sysUsersOfflineList.add(map);
+        }
+        appMap.put("offlineApp",sysUsersOfflineList);
+        mapResault.put("app",appMap);
+
+        ArdSyUser ardSyUserPara = new ArdSyUser();
+        ardSyUserPara.setSysUserId(commanderId);
+        List<ArdSyUser> ardSyUserList = ardSyUserMapper.selectArdSyUserList(ardSyUserPara);//查询挂接的三一账号
+
+        String syURL = "";
+        List<SysConfig> sysConfigResult = sysConfigMapper.selectByType("syCarPT");
+        if(sysConfigResult.size() > 0){
+            syURL = sysConfigResult.get(0).getConfigValue();
+        }
+
+        if(ardSyUserList.size() == 0 || syURL.equals("")){
+            List<Map<String,Object>> onlineCar = new ArrayList();
+            List<Map<String,Object>> offlineCar = new ArrayList();
+            Map<String,List<Map<String,Object>>> carMap = new HashMap();
+            carMap.put("onlineCar",onlineCar);
+            carMap.put("offlineCar",offlineCar);
+            mapResault.put("car",carMap);
+            return mapResault;
+        }
+
+        List<String> carIdList = ardSyCarMapper.selectArdSyCarByDeptIds(deptIdList);
+        String carIds = "";
+        for(String carId : carIdList){
+            carIds = carIds + carId + ",";
+        }
+        carIds = carIds.substring(0,carIds.length() - 1);
+        String passwordMd5 = DigestUtils.md5Hex(ardSyUserList.get(0).getPassword());
+        Map<String,Object> syLoginResult = sYClient.logIn(syURL, passwordMd5, ardSyUserList.get(0).getUserId());
+        String sessionId = (String) syLoginResult.get("sessionId");
+        Map<String,Object> carNearPositionResult = sYClient.getCarNearPositionByCarId(syURL, carIds, ardSyUserList.get(0).getUserId(),sessionId);
+        if(((String)carNearPositionResult.get("rspCode")).equals("1")){
+            List<Map<String,Object>> SYCarPositionList = (List<Map<String, Object>>) carNearPositionResult.get("list");
+            //筛选在线
+            List<Map<String,Object>> onlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("在线")).collect(Collectors.toList());
+            //筛选200米范围内
+            List<Map<String,Object>> onlineSYCarPositionNearList = new ArrayList();//在200米内
+            for(Map<String,Object> mapOn : onlineSYCarPositionList){
+                Double longitude = new BigDecimal((String) mapOn.get("lng")).doubleValue();
+                Double latitude = new BigDecimal((String) mapOn.get("lat")).doubleValue();
+                double distance = GisUtil.getDistance(para.get("longitude"),para.get("latitude"),longitude,latitude);
+                if(distance <= 200){
+                    mapOn.put("longitude",longitude);
+                    mapOn.put("latitude",latitude);
+                    onlineSYCarPositionNearList.add(mapOn);
+                }
+            }
+
+            //for(Map<String,Object> sycar : onlineSYCarPositionList){
+            for(Map<String,Object> sycar : onlineSYCarPositionNearList){
+                Map<String,Object> map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId"));
+                String carModel = this.minioEndpoint + "/" + (String) map.get("carModel");
+                map.put("carModel",carModel);
+                sycar.putAll(map);
+            }
+            //筛选离线
+            List<Map<String,Object>> offlineSYCarPositionList = SYCarPositionList.stream().filter(map -> ((String)map.get("stateCn")).startsWith("离线")).collect(Collectors.toList());
+            for(Map<String,Object> sycar : offlineSYCarPositionList){
+                Map<String,Object> map = ardSyCarMapper.getArdSyCarAndDeptByCarId((String)sycar.get("carId"));
+                String carModel = this.minioEndpoint + "/" + (String) map.get("carModel");
+                map.put("carModel",carModel);
+                sycar.putAll(map);
+            }
+            Map<String,List<Map<String,Object>>> carMap = new HashMap();
+            //carMap.put("onlineCar",onlineSYCarPositionList);
+            carMap.put("onlineCar",onlineSYCarPositionNearList);
+            carMap.put("offlineCar",offlineSYCarPositionList);
+            mapResault.put("car",carMap);
+        }else{
+            List<Map<String,Object>> onlineCar = new ArrayList();
+            List<Map<String,Object>> offlineCar = new ArrayList();
+            Map<String,List<Map<String,Object>>> carMap = new HashMap();
+            carMap.put("onlineCar",onlineCar);
+            carMap.put("offlineCar",offlineCar);
+            mapResault.put("car",carMap);
+            return mapResault;
+        }
+
+        return mapResault;
+    }
+
+    public List<Long> getOwnAndChildrenDeptIdList(List<Long> deptIdList,List<Long> deptIdListr){
+        deptIdListr.addAll(deptIdList);
+        List<Long> result = sysDeptMapper.getChildrenDeptIdList(deptIdList);
+        if(result.size() != 0){
+            deptIdListr.addAll(result);
+            result = getOwnAndChildrenDeptIdList(result,deptIdListr);
+        }
+        deptIdListr = deptIdListr.stream().distinct().collect(Collectors.toList());
+        return deptIdListr;
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/appcontainer/AppContainer.java b/ard-work/src/main/java/com/ruoyi/app/position/appcontainer/AppContainer.java
new file mode 100644
index 0000000..96ed100
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/app/position/appcontainer/AppContainer.java
@@ -0,0 +1,19 @@
+package com.ruoyi.app.position.appcontainer;
+
+import com.ruoyi.app.position.domain.ArdAppPosition;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AppContainer {
+
+    private static Map<String, ArdAppPosition> ardAppPositionMap = new HashMap();
+
+    public static Map<String, ArdAppPosition> getArdAppPositionMap() {
+        return ardAppPositionMap;
+    }
+
+    public static void setArdAppPositionMap(Map<String, ArdAppPosition> ardAppPositionMap) {
+        ardAppPositionMap = ardAppPositionMap;
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
index 7565542..7bd5258 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
@@ -239,67 +239,22 @@
         }
     }
 
-    /*@PostMapping("/sendCheckCommandersPosition")
-    @ApiOperation("发起查看指挥端位置")
-    public AjaxResult sendCheckCommandersPosition(@RequestBody Map<String,Object> para) {
-        String usersId = SecurityUtils.getUserId();
+    @GetMapping("/getAPPPositionByUserIdAndTime")
+    @ApiOperation("查看APP历史位置")
+    public AjaxResult getAPPPositionByUserIdAndTime(@RequestBody Map<String,String> para) {
         try{
-            ardAppPositionService.sendCheckCommandersPosition(usersId,para);
-            return AjaxResult.success();
-        }catch(Exception e){
-            return AjaxResult.error();
-        }
-    }*/
-
-    /*@PostMapping("/sendCheckSYCarsPosition")
-    @ApiOperation("发起查看车辆位置")
-    public AjaxResult sendCheckSYCarsPosition(@RequestBody Map<String,Object> para) {
-        String usersId = SecurityUtils.getUserId();
-        try{
-            ardAppPositionService.sendCheckSYCarsPosition(usersId,para);
-            return AjaxResult.success();
-        }catch(Exception e){
-            return AjaxResult.error();
-        }
-    }*/
-
-    /*@GetMapping("/getCheckCommandersPosition")
-    @ApiOperation("指挥端查看指挥端位置申请")
-    public AjaxResult getCheckCommandersPosition() {//弃用
-        String usersId = SecurityUtils.getUserId();
-        try{
-            List<Map<String,Object>> result = ardAppPositionService.getCheckCommandersPosition(usersId);
+            List<ArdAppPosition> result = ardAppPositionService.getAPPPositionByUserIdAndTime(para);
             return AjaxResult.success(result);
         }catch(Exception e){
             e.printStackTrace();
             return AjaxResult.error();
         }
-    }*/
+    }
 
-    /*@GetMapping("/getCheckSYCarsPosition")
-    @ApiOperation("指挥端查看车辆位置申请")
-    public AjaxResult getCheckSYCarsPosition() {//弃用
-        String usersId = SecurityUtils.getUserId();
-        try{
-            List<Map<String,Object>> result = ardAppPositionService.getCheckSYCarsPosition(usersId);
-            return AjaxResult.success(result);
-        }catch(Exception e){
-            e.printStackTrace();
-            return AjaxResult.error();
-        }
-    }*/
-
-    /*@GetMapping("/getCheckPosition")
-    @ApiOperation("指挥端查看位置申请")
-    public AjaxResult getCheckPosition() {
-        String usersId = SecurityUtils.getUserId();
-        try{
-            Map<String,List<Map<String,Object>>> result = ardAppPositionService.getCheckPosition(usersId);
-            return AjaxResult.success(result);
-        }catch(Exception e){
-            e.printStackTrace();
-            return AjaxResult.error();
-        }
-    }*/
+    @GetMapping("/getOnlineAPPSoilderByCommanderId")
+    public AjaxResult getOnlineAPPSoilderByCommanderId() {
+        String userId = SecurityUtils.getUserId();
+        return success(ardAppPositionService.getOnlineAPPSoilderByCommanderId(userId));
+    }
 
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/mapper/ArdAppPositionMapper.java b/ard-work/src/main/java/com/ruoyi/app/position/mapper/ArdAppPositionMapper.java
index 83c5a45..2f81a24 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/mapper/ArdAppPositionMapper.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/mapper/ArdAppPositionMapper.java
@@ -4,6 +4,7 @@
 import java.util.Map;
 
 import com.ruoyi.app.position.domain.ArdAppPosition;
+import org.apache.ibatis.annotations.Param;
 
 
 /**
@@ -70,4 +71,8 @@
     public int deleteArdAppPositionByIds(String[] ids);
 
     public List<Map<String,Object>> getOnlineCommanderPosition(String soilderId);
+
+    public List<ArdAppPosition> getAPPPositionByUserIdAndTime(@Param("userId") String userId,@Param("beginTime") String beginTime,@Param("endTime") String endTime);
+
+    public ArdAppPosition getLastAPPPositionByUserId(String userId);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java b/ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java
index 64e1606..68c1db2 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/service/IArdAppPositionService.java
@@ -88,13 +88,8 @@
 
     public List<Map<String,Object>> getOnlineCommanderPosition(String soilderId);
 
-    //public void sendCheckCommandersPosition(String usersId,Map<String,Object> para);
+    public List<ArdAppPosition> getAPPPositionByUserIdAndTime(Map<String,String> para);
 
-    //public void sendCheckSYCarsPosition(String usersId,Map<String,Object> para);
+    public List<Map<String,Object>> getOnlineAPPSoilderByCommanderId(String userId);
 
-    //public List<Map<String,Object>> getCheckCommandersPosition(String usersId);
-
-    //public List<Map<String,Object>> getCheckSYCarsPosition(String usersId);
-
-    //public Map<String,List<Map<String,Object>>> getCheckPosition(String usersId);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java
index b6105ec..837d4fc 100644
--- a/ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/app/position/service/impl/ArdAppPositionServiceImpl.java
@@ -1,11 +1,10 @@
 package com.ruoyi.app.position.service.impl;
 
-import com.alibaba.fastjson2.JSON;
 import com.ruoyi.alarm.wall.domain.ArdAlarmWall;
-import com.ruoyi.alarm.wall.mapper.ArdAlarmWallMapper;
 import com.ruoyi.alarm.wall.service.IArdAlarmWallService;
 import com.ruoyi.alarmpoints.wall.domain.ArdWall;
 import com.ruoyi.alarmpoints.wall.mapper.ArdWallMapper;
+import com.ruoyi.app.position.appcontainer.AppContainer;
 import com.ruoyi.app.position.domain.ArdAppPosition;
 import com.ruoyi.app.position.mapper.ArdAppPositionMapper;
 import com.ruoyi.app.position.service.IArdAppPositionService;
@@ -15,16 +14,15 @@
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.scheduling.domian.SchedulingParam;
+import com.ruoyi.system.mapper.SysDeptMapper;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.utils.gis.GisUtil;
 import com.ruoyi.utils.gis.Point;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -52,6 +50,8 @@
     IArdAlarmWallService ardAlarmWallService;
     @Resource
     private SysUserMapper sysUserMapper;
+    @Resource
+    private SysDeptMapper sysDeptMapper;
 
     Map<String, String> firstAlarmMap = new HashMap<>();//首次报警缓存key:用户id_围栏id value: 报警id
     /**
@@ -98,7 +98,12 @@
         ardAppPosition.setId(IdUtils.simpleUUID());
         ardAppPosition.setCreateTime(DateUtils.getNowDate());
         ardAppPositionMapper.insertArdAppPosition(ardAppPosition);
-        return DetectionWallAlarm(ardAppPosition);
+        try{
+            return DetectionWallAlarm(ardAppPosition);
+        }finally {
+            AppContainer.getArdAppPositionMap().put(ardAppPosition.getUserId(),ardAppPosition);//实时位置存入容器
+        }
+
     }
 
     /**
@@ -478,111 +483,53 @@
         return result;
     }
 
-    /*@Override
-    public void sendCheckCommandersPosition(String usersId,Map<String, Object> para) {
-        String reason = (String) para.get("reason");
-        List<String> usersIdList = (List<String>) para.get("usersIdList");
-        for(String commanderId : usersIdList){
-            //设置key为checkCommanderPosition_指挥端主键_单兵端主键
-            String key = "checkCommanderPosition_" + commanderId + "_" + usersId;
-            Map<String,Object> value = new HashMap();
-            value.put("reason",reason);
-            value.put("state","0");
-            value.put("begin","");
-            value.put("commanderId",commanderId);
-            value.put("soilderId",usersId);
-            redisCache.setCacheObject(key, JSON.toJSONString(value));
-        }
-    }*/
-
-    /*@Override
-    public void sendCheckSYCarsPosition(String usersId, Map<String, Object> para) {
-        String reason = (String) para.get("reason");
-        List<String> usersIdList = (List<String>) para.get("usersIdList");
-        for(String commanderId : usersIdList){
-            //设置key为checkSYCarsPosition_指挥端主键/PC端主键_单兵端主键
-            String key = "checkSYCarsPosition_" + commanderId + "_" + usersId;
-            Map<String,Object> value = new HashMap();
-            value.put("reason",reason);
-            value.put("state","0");
-            value.put("begin","");
-            value.put("commanderId",commanderId);
-            value.put("soilderId",usersId);
-            redisCache.setCacheObject(key, JSON.toJSONString(value));
-        }
-    }*/
-
-    /*@Override
-    public List<Map<String, Object>> getCheckCommandersPosition(String usersId) {
-        String key = "checkCommanderPosition_" + usersId + "_";
-        List<Object> keyValueList = redisCache.getListKey(key);
-        List<Map<String, Object>> result = new ArrayList();
-        for(Object o : keyValueList){
-            Map<String,Object> map = JSON.parseObject((String) o);
-            if(((String)map.get("state")).equals("0")){//state为0就是未审批
-                SysUser sysUser = sysUserMapper.selectUserById((String) map.get("soilderId"));
-                map.put("userName",sysUser.getUserName());
-                result.add(map);
-            }
-        }
+    @Override
+    public List<ArdAppPosition> getAPPPositionByUserIdAndTime(Map<String, String> para) {
+        String userId = para.get("userId");
+        String beginTime = para.get("beginTime");
+        String endTime = para.get("endTime");
+        List<ArdAppPosition> result = ardAppPositionMapper.getAPPPositionByUserIdAndTime(userId,beginTime,endTime);
         return result;
-    }*/
+    }
 
-    /*@Override
-    public List<Map<String, Object>> getCheckSYCarsPosition(String usersId) {
-        String key = "checkSYCarsPosition_" + usersId + "_";
-        List<Object> keyValueList = redisCache.getListKey(key);
-        List<Map<String, Object>> result = new ArrayList();
-        for(Object o : keyValueList){
-            Map<String,Object> map = JSON.parseObject((String) o);
-            if(((String)map.get("state")).equals("0")){//state为0就是未审批
-                SysUser sysUser = sysUserMapper.selectUserById((String) map.get("soilderId"));
-                map.put("userName",sysUser.getUserName());
-                result.add(map);
+    @Override
+    public List<Map<String,Object>> getOnlineAPPSoilderByCommanderId(String userId) {
+        SysUser sysUser = sysUserMapper.selectUserById(userId);//获取系统用户
+        List<Long> deptIdList = new ArrayList();
+        deptIdList.add(sysUser.getDeptId());
+        deptIdList = getOwnAndChildrenDeptIdList(deptIdList,new ArrayList());//递归查询下属部门主键
+        List<SysUser> result = sysUserMapper.getOwnAndChildrenOnlineSoilderList(deptIdList);
+        List<Map<String,Object>> resultList = new ArrayList();
+        for(SysUser sysUserIn : result){
+            Map<String,Object> map = new HashMap();
+            map.put("userId",sysUserIn.getUserId());
+            map.put("deptId",sysUserIn.getDeptId());
+            map.put("userName",sysUserIn.getUserName());
+            map.put("nickName",sysUserIn.getNickName());
+            try{
+                map.put("longitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLongitude());
+                map.put("latitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getLatitude());
+                map.put("altitude",AppContainer.getArdAppPositionMap().get(sysUserIn.getUserId()).getAltitude());
+            }catch(Exception e){
+                ArdAppPosition ardAppPosition = ardAppPositionMapper.getLastAPPPositionByUserId(sysUserIn.getUserId());
+                map.put("longitude",ardAppPosition.getLongitude());
+                map.put("latitude",ardAppPosition.getLatitude());
+                map.put("altitude",ardAppPosition.getAltitude());
             }
+            resultList.add(map);
         }
-        return result;
-    }*/
+        return resultList;
+    }
 
-    /*@Override
-    public Map<String, List<Map<String, Object>>> getCheckPosition(String usersId) {
-        Map<String, List<Map<String, Object>>> result = new HashMap();
-        //查看指挥端位置申请
-        String keyCommanderPosition = "checkCommanderPosition_" + usersId + "_";
-        List<Object> keyValueCommanderPositionList = redisCache.getListKey(keyCommanderPosition);
-        List<Map<String, Object>> resultCommanderPosition = new ArrayList();
-        for(Object o : keyValueCommanderPositionList){
-            Map<String,Object> map = JSON.parseObject((String) o);
-            if(((String)map.get("state")).equals("0")){//state为0就是未审批
-                SysUser sysUser = sysUserMapper.selectUserById((String) map.get("soilderId"));
-                map.put("userName",sysUser.getUserName());
-                if(sysUser.getNickName() != null){
-                    map.put("nickName",sysUser.getNickName());
-                }else{
-                    map.put("nickName",sysUser.getNickName());
-                }
-                resultCommanderPosition.add(map);
-            }
+    public List<Long> getOwnAndChildrenDeptIdList(List<Long> deptIdList,List<Long> deptIdListr){
+        deptIdListr.addAll(deptIdList);
+        List<Long> result = sysDeptMapper.getChildrenDeptIdList(deptIdList);
+        if(result.size() != 0){
+            deptIdListr.addAll(result);
+            result = getOwnAndChildrenDeptIdList(result,deptIdListr);
         }
-        //查看车辆位置申请
-        String keySYCarsPosition = "checkSYCarsPosition_" + usersId + "_";
-        List<Object> keyValueSYCarsPositionList = redisCache.getListKey(keySYCarsPosition);
-        List<Map<String, Object>> resultSYCarsPosition = new ArrayList();
-        for(Object o : keyValueSYCarsPositionList){
-            Map<String,Object> map = JSON.parseObject((String) o);
-            if(((String)map.get("state")).equals("0")){//state为0就是未审批
-                SysUser sysUser = sysUserMapper.selectUserById((String) map.get("soilderId"));
-                map.put("userName",sysUser.getUserName());
-                if(sysUser.getNickName() != null){
-                    map.put("nickName",sysUser.getNickName());
-                }else{
-                    map.put("nickName",sysUser.getNickName());
-                }
-                resultSYCarsPosition.add(map);
-            }
-        }
-        result.put("commander",resultCommanderPosition);
-        result.put("SYCars",resultSYCarsPosition);
-        return result;
-    }*/
+        deptIdListr = deptIdListr.stream().distinct().collect(Collectors.toList());
+        return deptIdListr;
+    }
+
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java b/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java
index 2a009f9..3ce9f56 100644
--- a/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java
+++ b/ard-work/src/main/java/com/ruoyi/device/uav/service/UavService.java
@@ -1,5 +1,6 @@
 package com.ruoyi.device.uav.service;
 
+import com.alibaba.fastjson.JSON;
 import com.dtflys.forest.exceptions.ForestNetworkException;
 import com.dtflys.forest.exceptions.ForestRuntimeException;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -8,9 +9,13 @@
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.ConfigUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.device.uav.websocketclient.UAVWebsocketClient;
+import com.ruoyi.sy.controller.ArdSyCarController;
 import com.ruoyi.utils.forest.UavClient;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections4.map.HashedMap;
+import org.java_websocket.WebSocket;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpMethod;
@@ -24,7 +29,9 @@
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.util.Map;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.*;
 
 @Service
 @Slf4j(topic = "uav")
@@ -46,6 +53,11 @@
 
     private Map uavUser;//登录的用户信息
     private ObjectMapper om = new ObjectMapper();
+
+    private Map<String, UAVWebsocketClient> UAVWebsocketClientMap = new HashedMap();
+
+    private String token;
+
     @Autowired
     private UavClient uavClient;
     @Autowired
@@ -56,6 +68,8 @@
 
         getUavConfig();
         this.login();
+        //创建无人机Websocket客户端
+        createWebsocketCients();
     }
 
     private void getUavConfig() {
@@ -85,8 +99,12 @@
             String token = this.getToken();
             res = (String) requestMethod.invoke(this.uavClient, this.host + url, token, data);
         } catch (IllegalAccessException e) {
+            System.out.println("doUavRequest 访问失败");
+            System.out.println(url);
             log.error("doUavRequest 访问失败" + e.getMessage());
         } catch (InvocationTargetException e) {
+            System.out.println("doUavRequest 执行失败");
+            System.out.println(url);
             log.error("doUavRequest 执行失败" + e.getMessage());
             e.printStackTrace();
         }
@@ -107,12 +125,17 @@
             String res = uavClient.GET(this.host+"manage/api/v1/devices", token, "{}");
             res+="";
             //System.out.println(res);
+
+            //token赋值
+            this.token = token;
         } catch (ForestNetworkException fe) {
             if (fe.getStatusCode() == 401) {//token失效,重新登录
                 this.login();
                 //再次获取token
                 uavUser = redisCache.getCacheMap("uav:uavUser");
                 token = (String) uavUser.get("access_token");
+                //token赋值
+                this.token = token;
                 return token;
             }
         }
@@ -141,6 +164,367 @@
         }
     }
 
+    public void createWebsocketCients(){
+        /*String ip = this.host.replace("http://", "");
+        if(this.UAVWebsocketClientMap.get("status") != null && this.UAVWebsocketClientMap.get("control") != null){
+            //无人机状态灭活
+            UAVWebsocketClient uavStatusWebsocketClient = this.UAVWebsocketClientMap.get("status");
+            uavStatusWebsocketClient.getHeartBeatTimer().cancel();
+            uavStatusWebsocketClient.close();
+            //无人机控制灭活
+            UAVWebsocketClient uavControlWebsocketClient = this.UAVWebsocketClientMap.get("control");
+            uavControlWebsocketClient.getHeartBeatTimer().cancel();
+            uavControlWebsocketClient.close();
+
+            this.UAVWebsocketClientMap.remove("status");
+            this.UAVWebsocketClientMap.remove("control");
+        }
+
+        String uavStatusWsURL = "ws://" + ip + "api/v1/ws?x-auth-token=" + token;
+        System.out.println(uavStatusWsURL);
+        UAVWebsocketClient uavStatusWebsocketClient;
+        try {
+            uavStatusWebsocketClient = new UAVWebsocketClient(new URI(uavStatusWsURL));
+            uavStatusWebsocketClient.connect();
+            System.out.println("连接中。。。");
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            if(!uavStatusWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                uavStatusWebsocketClient.close();
+                return;
+            }
+            Date date = new Date();
+            Timer heartBeatTimer = new Timer();
+            TimerTask heartBeatTask = new TimerTask(){
+                public void run(){
+                    Map<String,Object> para = new HashMap();
+                    para.put("biz_code", "user_cmd");
+                    para.put("version", "1.0");
+                    Date date = new Date();
+                    para.put("time_stamp", String.valueOf(date.getTime()));
+                    Map<String,String> payload = new HashMap();
+                    payload.put("timeStamp", String.valueOf(date.getTime()));
+                    Map<String,Object> data = new HashMap();
+                    data.put("dataHead", "0x7479");
+                    data.put("cmdCode", "0x02");
+                    data.put("payload", payload);
+                    para.put("data", data);
+                    try{
+                        uavStatusWebsocketClient.send(JSON.toJSONString(para));
+                        System.out.println("无人机状态心跳发送");
+                    }catch(Exception e){
+                        e.printStackTrace();
+                        System.out.println(uavStatusWebsocketClient.getServerUri());
+                    }
+                }
+            };
+            uavStatusWebsocketClient.setHeartBeatTimer(heartBeatTimer);
+            heartBeatTimer.scheduleAtFixedRate(heartBeatTask,date,10*1000);
+            this.UAVWebsocketClientMap.put("status", uavStatusWebsocketClient);
+        } catch (NumberFormatException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (URISyntaxException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        String uavControlWsURL = "ws://" + ip + "api/v1/ws/cmd?x-auth-token=" + token;
+        System.out.println(uavControlWsURL);
+        UAVWebsocketClient uavControlWebsocketClient;
+        try {
+            uavControlWebsocketClient = new UAVWebsocketClient(new URI(uavControlWsURL));
+            uavControlWebsocketClient.connect();
+            System.out.println("连接中。。。");
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            if(!uavControlWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                //无人机状态灭活
+                UAVWebsocketClient uavStatusWebsocketClient0 =  this.UAVWebsocketClientMap.get("status");
+                uavStatusWebsocketClient0.getHeartBeatTimer().cancel();
+                uavStatusWebsocketClient0.close();
+
+                uavControlWebsocketClient.close();
+                return;
+            }
+            Date date = new Date();
+            Timer heartBeatTimer = new Timer();
+            TimerTask heartBeatTask = new TimerTask(){
+                public void run(){
+                    Map<String,Object> para = new HashMap();
+                    para.put("biz_code", "user_cmd");
+                    para.put("version", "1.0");
+                    Date date = new Date();
+                    para.put("time_stamp", String.valueOf(date.getTime()));
+                    Map<String,String> payload = new HashMap();
+                    payload.put("timeStamp", String.valueOf(date.getTime()));
+                    Map<String,Object> data = new HashMap();
+                    data.put("dataHead", "0x7479");
+                    data.put("cmdCode", "0x02");
+                    data.put("payload", payload);
+                    para.put("data", data);
+                    try{
+                        uavControlWebsocketClient.send(JSON.toJSONString(para));
+                        System.out.println("无人机控制心跳发送");
+                    }catch(Exception e){
+                        e.printStackTrace();
+                        System.out.println(uavControlWebsocketClient.getServerUri());
+                    }
+                }
+            };
+            uavControlWebsocketClient.setHeartBeatTimer(heartBeatTimer);
+            heartBeatTimer.scheduleAtFixedRate(heartBeatTask,date,10*1000);
+            this.UAVWebsocketClientMap.put("control", uavControlWebsocketClient);
+        } catch (NumberFormatException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (URISyntaxException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }*/
+        String ip = this.host.replace("http://", "");
+        Date date = new Date();
+        Timer heartBeatTimer = new Timer();
+        TimerTask heartBeatTask = new TimerTask(){
+            public void run(){
+                if(token != null){//判断是否为null
+                    if(UAVWebsocketClientMap.get("status") != null && UAVWebsocketClientMap.get("control") != null){
+                        String oldURL = UAVWebsocketClientMap.get("status").getServerUri().toString();
+                        String oldToken = oldURL.split("x-auth-token=")[1];
+                        if(!oldToken.equals(token)){//token更新从新创建客户端
+                            //原客户端灭活
+                            UAVWebsocketClientMap.get("status").close();//无人机状态灭活
+                            UAVWebsocketClientMap.get("control").close();//无人机控制灭活
+                            UAVWebsocketClientMap.remove("status");
+                            UAVWebsocketClientMap.remove("control");
+
+                            String uavStatusWsURL = "ws://" + ip + "api/v1/ws?x-auth-token=" + token;
+                            UAVWebsocketClient uavStatusWebsocketClient = null;
+                            try {
+                                uavStatusWebsocketClient = new UAVWebsocketClient(new URI(uavStatusWsURL));
+                                uavStatusWebsocketClient.connect();
+                                System.out.println("连接中。。。");
+                                try {
+                                    Thread.sleep(1000);
+                                } catch (InterruptedException e) {
+                                    // TODO Auto-generated catch block
+                                    e.printStackTrace();
+                                }
+                                if(!uavStatusWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                                    uavStatusWebsocketClient.close();
+                                    uavStatusWebsocketClient = null;
+                                }
+                            } catch (NumberFormatException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            } catch (URISyntaxException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+
+                            String uavControlWsURL = "ws://" + ip + "api/v1/ws/cmd?x-auth-token=" + token;
+                            UAVWebsocketClient uavControlWebsocketClient = null;
+                            try {
+                                uavControlWebsocketClient = new UAVWebsocketClient(new URI(uavControlWsURL));
+                                uavControlWebsocketClient.connect();
+                                System.out.println("连接中。。。");
+                                try {
+                                    Thread.sleep(1000);
+                                } catch (InterruptedException e) {
+                                    // TODO Auto-generated catch block
+                                    e.printStackTrace();
+                                }
+                                if(!uavControlWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                                    //无人机状态灭活
+                                    UAVWebsocketClient uavStatusWebsocketClient0 =  UAVWebsocketClientMap.get("status");
+                                    uavStatusWebsocketClient0.close();
+
+                                    uavControlWebsocketClient.close();
+                                    uavStatusWebsocketClient0 = null;
+                                    uavControlWebsocketClient = null;
+                                    //return;
+                                }
+                            } catch (NumberFormatException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            } catch (URISyntaxException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+                            if(uavStatusWebsocketClient != null || uavControlWebsocketClient != null){
+                                UAVWebsocketClientMap.put("status", uavStatusWebsocketClient);
+                                UAVWebsocketClientMap.put("control", uavControlWebsocketClient);
+
+                                Map<String,Object> para = new HashMap();
+                                para.put("biz_code", "user_cmd");
+                                para.put("version", "1.0");
+                                Date date = new Date();
+                                para.put("time_stamp", String.valueOf(date.getTime()));
+                                Map<String,String> payload = new HashMap();
+                                payload.put("timeStamp", String.valueOf(date.getTime()));
+                                Map<String,Object> data = new HashMap();
+                                data.put("dataHead", "0x7479");
+                                data.put("cmdCode", "0x02");
+                                data.put("payload", payload);
+                                para.put("data", data);
+                                try{
+                                    uavStatusWebsocketClient.send(JSON.toJSONString(para));
+                                    uavControlWebsocketClient.send(JSON.toJSONString(para));
+                                    //System.out.println("无人机心跳发送");
+                                }catch(Exception e){
+                                    e.printStackTrace();
+                                    System.out.println(uavStatusWebsocketClient.getServerUri());
+                                    System.out.println(uavControlWebsocketClient.getServerUri());
+                                    //无人机状态灭活
+                                    uavStatusWebsocketClient = UAVWebsocketClientMap.get("status");
+                                    uavStatusWebsocketClient.close();
+                                    //无人机控制灭活
+                                    uavControlWebsocketClient = UAVWebsocketClientMap.get("control");
+                                    uavControlWebsocketClient.close();
+
+                                    UAVWebsocketClientMap.remove("status");
+                                    UAVWebsocketClientMap.remove("control");
+                                }
+                            }
+                        }else{
+                            Map<String,Object> para = new HashMap();
+                            para.put("biz_code", "user_cmd");
+                            para.put("version", "1.0");
+                            Date date = new Date();
+                            para.put("time_stamp", String.valueOf(date.getTime()));
+                            Map<String,String> payload = new HashMap();
+                            payload.put("timeStamp", String.valueOf(date.getTime()));
+                            Map<String,Object> data = new HashMap();
+                            data.put("dataHead", "0x7479");
+                            data.put("cmdCode", "0x02");
+                            data.put("payload", payload);
+                            para.put("data", data);
+                            UAVWebsocketClient uavStatusWebsocketClient = UAVWebsocketClientMap.get("status");
+                            UAVWebsocketClient uavControlWebsocketClient = UAVWebsocketClientMap.get("control");
+                            try{
+                                uavStatusWebsocketClient.send(JSON.toJSONString(para));
+                                uavControlWebsocketClient.send(JSON.toJSONString(para));
+                                //System.out.println("无人机心跳发送");
+                            }catch(Exception e){
+                                e.printStackTrace();
+                                System.out.println(uavStatusWebsocketClient.getServerUri());
+                                System.out.println(uavControlWebsocketClient.getServerUri());
+                                //无人机状态灭活
+                                uavStatusWebsocketClient = UAVWebsocketClientMap.get("status");
+                                uavStatusWebsocketClient.close();
+                                //无人机控制灭活
+                                uavControlWebsocketClient = UAVWebsocketClientMap.get("control");
+                                uavControlWebsocketClient.close();
+
+                                UAVWebsocketClientMap.remove("status");
+                                UAVWebsocketClientMap.remove("control");
+                            }
+                        }
+                    }else{
+                        String uavStatusWsURL = "ws://" + ip + "api/v1/ws?x-auth-token=" + token;
+                        System.out.println(uavStatusWsURL);
+                        UAVWebsocketClient uavStatusWebsocketClient = null;
+                        try {
+                            uavStatusWebsocketClient = new UAVWebsocketClient(new URI(uavStatusWsURL));
+                            uavStatusWebsocketClient.connect();
+                            System.out.println("连接中。。。");
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+                            if(!uavStatusWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                                uavStatusWebsocketClient.close();
+                                uavStatusWebsocketClient = null;
+                            }
+                        } catch (NumberFormatException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        } catch (URISyntaxException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+
+                        String uavControlWsURL = "ws://" + ip + "api/v1/ws/cmd?x-auth-token=" + token;
+                        System.out.println(uavControlWsURL);
+                        UAVWebsocketClient uavControlWebsocketClient = null;
+                        try {
+                            uavControlWebsocketClient = new UAVWebsocketClient(new URI(uavControlWsURL));
+                            uavControlWebsocketClient.connect();
+                            System.out.println("连接中。。。");
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                // TODO Auto-generated catch block
+                                e.printStackTrace();
+                            }
+                            if(!uavControlWebsocketClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)){
+                                //无人机状态灭活
+                                UAVWebsocketClient uavStatusWebsocketClient0 =  UAVWebsocketClientMap.get("status");
+                                uavStatusWebsocketClient0.close();
+
+                                uavControlWebsocketClient.close();
+                                uavStatusWebsocketClient0 = null;
+                                uavControlWebsocketClient = null;
+                            }
+                        } catch (NumberFormatException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        } catch (URISyntaxException e) {
+                            // TODO Auto-generated catch block
+                            e.printStackTrace();
+                        }
+                        if(uavStatusWebsocketClient != null || uavControlWebsocketClient != null){
+                            UAVWebsocketClientMap.put("status", uavStatusWebsocketClient);
+                            UAVWebsocketClientMap.put("control", uavControlWebsocketClient);
+
+                            Map<String,Object> para = new HashMap();
+                            para.put("biz_code", "user_cmd");
+                            para.put("version", "1.0");
+                            Date date = new Date();
+                            para.put("time_stamp", String.valueOf(date.getTime()));
+                            Map<String,String> payload = new HashMap();
+                            payload.put("timeStamp", String.valueOf(date.getTime()));
+                            Map<String,Object> data = new HashMap();
+                            data.put("dataHead", "0x7479");
+                            data.put("cmdCode", "0x02");
+                            data.put("payload", payload);
+                            para.put("data", data);
+                            try{
+                                uavStatusWebsocketClient.send(JSON.toJSONString(para));
+                                uavControlWebsocketClient.send(JSON.toJSONString(para));
+                                //System.out.println("无人机心跳发送");
+                            }catch(Exception e){
+                                e.printStackTrace();
+                                System.out.println(uavStatusWebsocketClient.getServerUri());
+                                System.out.println(uavControlWebsocketClient.getServerUri());
+                                //无人机状态灭活
+                                uavStatusWebsocketClient = UAVWebsocketClientMap.get("status");
+                                uavStatusWebsocketClient.close();
+                                //无人机控制灭活
+                                uavControlWebsocketClient = UAVWebsocketClientMap.get("control");
+                                uavControlWebsocketClient.close();
+
+                                UAVWebsocketClientMap.remove("status");
+                                UAVWebsocketClientMap.remove("control");
+                            }
+                        }
+                    }
+                }
+            }
+        };
+        heartBeatTimer.scheduleAtFixedRate(heartBeatTask,date,10*1000);
+    }
+
 
     public String Encrypt(String sSrc, String sKey) {
         if (sKey == null) {
diff --git a/ard-work/src/main/java/com/ruoyi/device/uav/websocketclient/UAVWebsocketClient.java b/ard-work/src/main/java/com/ruoyi/device/uav/websocketclient/UAVWebsocketClient.java
new file mode 100644
index 0000000..4c0712b
--- /dev/null
+++ b/ard-work/src/main/java/com/ruoyi/device/uav/websocketclient/UAVWebsocketClient.java
@@ -0,0 +1,45 @@
+package com.ruoyi.device.uav.websocketclient;
+
+import org.java_websocket.client.WebSocketClient;
+import org.java_websocket.handshake.ServerHandshake;
+
+import java.net.URI;
+import java.util.Timer;
+
+public class UAVWebsocketClient extends WebSocketClient {
+
+    private URI serverUri;
+
+    public UAVWebsocketClient(URI serverUri) {
+        super(serverUri);
+        this.serverUri = serverUri;
+    }
+
+    public URI getServerUri() {
+        return serverUri;
+    }
+
+    public void setServerUri(URI serverUri) {
+        this.serverUri = serverUri;
+    }
+
+    @Override
+    public void onOpen(ServerHandshake serverHandshake) {
+
+    }
+
+    @Override
+    public void onMessage(String s) {
+
+    }
+
+    @Override
+    public void onClose(int i, String s, boolean b) {
+
+    }
+
+    @Override
+    public void onError(Exception e) {
+
+    }
+}
diff --git a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
index de5e323..54487b2 100644
--- a/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/sy/service/impl/ArdSyCarServiceImpl.java
@@ -901,6 +901,23 @@
 
     @Override
     public Results chaseCarByCarId(String usersId, String carId, String cycle) {
+        ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId);
+        String userId ="";
+        String password = "";
+        if(ardSyUser != null){
+            userId = ardSyUser.getUserId();
+            password = DigestUtils.md5Hex(ardSyUser.getPassword());
+        }else{
+            return Results.error("没有挂接三一车辆用户");
+        }
+        List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
+        String syURL = "";
+        if(syURLResult.size() != 0){
+            syURL = syURLResult.get(0).getConfigValue();
+        }else{
+            return Results.error("三一车辆地址未录入");
+        }
+
         String sessionId = "";
         for(String key : ONLINE_USER_SESSIONS.keySet()){
             if(key.startsWith(usersId + "_")){
@@ -916,6 +933,10 @@
                     userCarTimerMap.get(usersId).cancel();
                     userCarTimerMap.remove(usersId);
                     PositionContainer.getUserPositionMap().remove(usersId);
+                    Map<String,Object> loginResult = sYClient.logIn(syURL, password, userId);
+                    String sySessionId = (String) loginResult.get("sessionId");
+                    String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d";
+                    sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s推送
                     System.out.println("停止追踪");
                 }
                 return Results.succeed("停止追踪");
@@ -927,6 +948,19 @@
                     Map<String, Map<String, Object>> map = new HashMap();
                     map.put(carId, new HashMap());
                     PositionContainer.getUserPositionMap().put(usersId, map);
+
+                    Map<String,Object> loginResult = sYClient.logIn(syURL, password, userId);
+                    String sySessionId = (String) loginResult.get("sessionId");
+                    List<SysConfig> distanceSYResult = sysConfigMapper.selectByType("31time");
+                    String time = "";
+                    if(distanceSYResult.size() != 0){
+                        time = distanceSYResult.get(0).getConfigValue();
+                    }else{
+                        return Results.error("三一车辆定时未录入");
+                    }
+                    String params = "%7B%220020%22:%220%22,%220029%22:%22"+time+"%22%7d";
+                    sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//开始追踪,改为定时推送
+
                     Map<String, Object> position = PositionContainer.getCarPositionMap().get(carId);//查询当前车辆位置
                     if (position != null) {
                         if (position.size() != 0) {
@@ -954,6 +988,25 @@
                                             userCarTimerMap.get(usersId).cancel();
                                             userCarTimerMap.remove(usersId);
                                             PositionContainer.getUserPositionMap().remove(usersId);
+
+                                            ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId);
+                                            String userId ="";
+                                            String password = "";
+                                            if(ardSyUser != null){
+                                                userId = ardSyUser.getUserId();
+                                                password = ardSyUser.getPassword();
+                                            }
+                                            List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
+                                            String syURL = "";
+                                            if(syURLResult.size() != 0){
+                                                syURL = syURLResult.get(0).getConfigValue();
+                                            }
+                                            if(!userId.equals("") && !password.equals("") && !syURL.equals("")){
+                                                Map<String,Object> loginResult = sYClient.logIn(syURL, password, userId);
+                                                String sySessionId = (String) loginResult.get("sessionId");
+                                                String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d";
+                                                sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s
+                                            }
                                             System.out.println("用户离线,停止追踪");
                                         }
                                     }
@@ -969,6 +1022,19 @@
                     Map<String, Map<String, Object>> map = new HashMap();
                     map.put(carId, new HashMap());
                     PositionContainer.getUserPositionMap().put(usersId, map);
+
+                    Map<String,Object> loginResult = sYClient.logIn(syURL, password, userId);
+                    String sySessionId = (String) loginResult.get("sessionId");
+                    List<SysConfig> distanceSYResult = sysConfigMapper.selectByType("31time");
+                    String time = "";
+                    if(distanceSYResult.size() != 0){
+                        time = distanceSYResult.get(0).getConfigValue();
+                    }else{
+                        return Results.error("三一车辆定时未录入");
+                    }
+                    String params = "%7B%220020%22:%220%22,%220029%22:%22"+time+"%22%7d";
+                    sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//开始追踪,改为定时推送
+
                     Map<String, Object> position = PositionContainer.getCarPositionMap().get(carId);//查询当前车辆位置
                     if (position != null) {
                         if (position.size() != 0) {
@@ -996,6 +1062,25 @@
                                             userCarTimerMap.get(usersId).cancel();
                                             userCarTimerMap.remove(usersId);
                                             PositionContainer.getUserPositionMap().remove(usersId);
+
+                                            ArdSyUser ardSyUser = ardSyUserMapper.userById(usersId);
+                                            String userId ="";
+                                            String password = "";
+                                            if(ardSyUser != null){
+                                                userId = ardSyUser.getUserId();
+                                                password = ardSyUser.getPassword();
+                                            }
+                                            List<SysConfig> syURLResult = sysConfigMapper.selectByType("syCarPT");
+                                            String syURL = "";
+                                            if(syURLResult.size() != 0){
+                                                syURL = syURLResult.get(0).getConfigValue();
+                                            }
+                                            if(!userId.equals("") && !password.equals("") && !syURL.equals("")){
+                                                Map<String,Object> loginResult = sYClient.logIn(syURL, password, userId);
+                                                String sySessionId = (String) loginResult.get("sessionId");
+                                                String params = "%7B%220020%22:%220%22,%220029%22:%2230%22%7d";
+                                                sYClient.changePositionSendMode(syURL, carId,104,"CmdSetParam",params,sySessionId);//停止追踪,改为定时30s
+                                            }
                                             System.out.println("用户离线,停止追踪");
                                         }
                                     }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/SYClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/SYClient.java
index f0cac0f..d515734 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/forest/SYClient.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/SYClient.java
@@ -41,4 +41,7 @@
 
     @Get(url = "${syURL}/gps-web/api/get_alarm_h_pfm_detail.jsp?carId=${carId}&startTime=${startTime}&endTime=${endTime}&typeIds=&speed=&duration=&alarmSrcs=&alarmLevels=1&sessionId=${sessionId}")
     Map<String,Object> getAlarmHPfmCountDetail(@Var("syURL") String syURL, @Var("carId") String carId,@Var("sessionId") String sessionId,@Var("startTime") String startTime,@Var("endTime") String endTime);
+
+    @Get(url = "${syURL}/gps-web/api/send_cmd.jsp?params=${paramsStr}&userId=admin&loginType=user&carId=${carId}&cmdId=${cmdId}&cmd=${cmd}&sessionId=${sessionId}")
+    Map<String,Object> changePositionSendMode(@Var("syURL") String syURL, @Var("carId") String carId,@Var("cmdId") Integer cmdId,@Var("cmd") String cmd,@Var("paramsStr") String paramsStr,@Var("sessionId") String sessionId);
 }
diff --git a/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml b/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml
index 938f638..5d4b794 100644
--- a/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml
+++ b/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml
@@ -70,6 +70,32 @@
                  left join sys_user u on u.user_id = c.user_id
     </sql>
 
+    <resultMap type="ArdAlarmpointsWell" id="ArdAlarmpointsWellOnlyResult">
+        <result property="id" column="id"/>
+        <result property="wellId" column="well_id"/>
+        <result property="wellNumber" column="well_number"/>
+        <result property="oilProduction" column="oil_production"/>
+        <result property="wellBlock" column="well_block"/>
+        <result property="productionDate" column="production_date"/>
+        <result property="displacementMode" column="displacement_mode"/>
+        <result property="surroundingEnvironment" column="surrounding_environment"/>
+        <result property="wellType" column="well_type"/>
+        <result property="installedLoad" column="installed_load"/>
+        <result property="meteringStation" column="metering_station"/>
+        <result property="transferStation" column="transfer_station"/>
+        <result property="dehydrationStation" column="dehydration_station"/>
+        <result property="runStatus" column="run_status"/>
+        <result property="longitude" column="longitude"/>
+        <result property="latitude" column="latitude"/>
+        <result property="altitude" column="altitude"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
     <select id="selectArdAlarmpointsWellList" parameterType="ArdAlarmpointsWell" resultMap="ArdAlarmpointsWellResult">
         <include refid="selectArdAlarmpointsWellVo"/>
         <where>
@@ -259,6 +285,20 @@
         </foreach>
     </select>
 
+    <select id="getWellDataByPatrolplanIdAndPosition" resultMap="ArdAlarmpointsWellOnlyResult">
+        select aaw.* from ard_app_patrolplan aap
+        inner join ard_app_patrolpoint aap0 on aap.id = aap0.patrolplan_id
+        inner join ard_alarmpoints_well aaw on aap0.alarmpoints_id = aaw.id
+        where del is null and aap.id = #{patrolplanId}
+        and f_compute_distance(cast(#{longitude} as decimal),cast(#{latitude} as decimal),aaw.longitude,aaw.latitude)
+        &lt;= (select cast(sc.config_value as decimal) from sys_config sc where sc.config_key = 'appAlarmPointsDistance')
+        order by f_compute_distance(cast(#{longitude} as decimal),cast(#{latitude} as decimal),aaw.longitude,aaw.latitude) desc limit 1 offset 0
+    </select>
+
+    <select id="getWellById" resultMap="ArdAlarmpointsWellOnlyResult">
+        select aaw.* from ard_alarmpoints_well aaw where aaw.id = #{id}
+    </select>
+
 
     <select id="conditionList" parameterType="List"
             resultType="com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWellDeptVo">
diff --git a/ard-work/src/main/resources/mapper/app/ArdAppPositionMapper.xml b/ard-work/src/main/resources/mapper/app/ArdAppPositionMapper.xml
index f9c55f4..0517147 100644
--- a/ard-work/src/main/resources/mapper/app/ArdAppPositionMapper.xml
+++ b/ard-work/src/main/resources/mapper/app/ArdAppPositionMapper.xml
@@ -97,4 +97,16 @@
         and aaa.state = '1' and su.app_online_state = '1'
         order by aap.create_time desc limit 1 offset 0
     </select>
+
+    <select id="getAPPPositionByUserIdAndTime" parameterType="java.lang.String" resultMap="ArdAppPositionResult">
+        select * from ard_app_position aap
+        where aap.user_id = #{userId} and aap.create_time &gt;= #{beginTime}
+        and aap.create_time &lt;= #{endTime} order by aap.create_time asc
+    </select>
+
+    <select id="getLastAPPPositionByUserId" parameterType="java.lang.String" resultMap="ArdAppPositionResult">
+        select * from ard_app_position aap
+        where aap.user_id = #{userId}
+        order by aap.create_time desc limit 1 offset 0
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
index bb69bbe..d81d647 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -265,4 +265,5 @@
             return Results.succeed("修改密码成功!");
         }
     }
+
 }
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 83a4fca..97be1dc 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -2,6 +2,17 @@
 server:
   # 服务器的HTTP端口,默认为8080
   port: 8080
+  ssl:
+    # 开启HTTPS,并配置自签名证书
+    enabled: true
+    #秘钥库文件名称,即上面生成的自签名证书
+    key-store: classpath:keystore
+    # 生成秘钥库文件的密码
+    key-store-password: 123456
+    # 秘钥库类型(JKS为jdk的keytool工具默认生成的秘钥库类型)
+    key-store-type: JKS
+    # 秘钥别名
+    key-alias: tomcat
   servlet:
     # 应用的访问路径
     context-path: /
@@ -18,23 +29,24 @@
 # 日志配置
 logging:
   level:
-    com.ruoyi.common.filter.MyI18nInterceptor: debug
+    com.ruoyi.common.filter.MyI18nInterceptor: info
     authorize: info
     minio: info
-    hikSdk: debug
-    dhSdk: debug
-    sdk: debug
-    vtdu: debug
+    hikSdk: info
+    dhSdk: info
+    sdk: info
+    vtdu: info
     stealAlarm: info
     websocket: info
-    patrolInspectionTask: info
-    mqtt: info
+    patrolInspectionTask: debug
+    mqtt: debug
     guideQueue: debug
     rongCloud: info
-    cmd: info
+    cmd: debug
+    alarm: debug
     uav: info
-    sy: debug
-    mqttCar: debug
+    sy: info
+    mqttCar: info
 ## knife4j配置
 knife4j:
   # knife4j增强功能,开启后下面参数才生效
@@ -61,7 +73,7 @@
 #全部主题:minioEvent,radar,stealelec,tube,camera,external,accessControl,apponekey,digitization3
 mqtt:
   host: tcp://192.168.2.15:1883
-  clientId: Server-227
+  clientId: Server
   username: admin
   password: admin
   topic: minioEvent,radar,stealelec,tube,camera,external,accessControl,apponekey,digitization3,radarForceGuide
@@ -70,4 +82,4 @@
   enabled: true
 #三一车辆开关
 syCar:
-  enabled: true
\ No newline at end of file
+  enabled: true
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index 97b38c7..e0ebd19 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -2,6 +2,17 @@
 server:
   # 服务器的HTTP端口,默认为8080
   port: 8080
+  ssl:
+    # 开启HTTPS,并配置自签名证书
+    enabled: true
+    #秘钥库文件名称,即上面生成的自签名证书
+    key-store: classpath:keystore
+    # 生成秘钥库文件的密码
+    key-store-password: 123456
+    # 秘钥库类型(JKS为jdk的keytool工具默认生成的秘钥库类型)
+    key-store-type: JKS
+    # 秘钥别名
+    key-alias: tomcat
   servlet:
     # 应用的访问路径
     context-path: /
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
index c7567df..f132a51 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -144,4 +144,8 @@
     List<SysUser> getOnlineCommander(String usersId);
 
     List<SysUser> getOnlinePC(@Param("usersId") String usersId,@Param("onLinePCIdList")List<String> onLinePCIdList);
+
+    List<SysUser> getOwnAndChildrenOnlineSoilderList(@Param("deptIdList")List<Long> deptIdList);
+
+    List<SysUser> getOwnAndChildrenSoilderListAll(@Param("deptIdList")List<Long> deptIdList);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 9e26b0f..a37f029 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -18,6 +18,7 @@
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
+import com.ruoyi.system.mapper.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,11 +37,6 @@
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
@@ -77,6 +73,9 @@
     private RedisCache redisCache;
     @Resource
     private ArdAlarmTypeConfigMapper ardAlarmTypeConfigMapper;
+
+    @Resource
+    private SysDeptMapper sysDeptMapper;
 
     /**
      * 项目启动时,初始化参数到缓存
@@ -647,4 +646,5 @@
         queryWrapper.eq("dept_id",deptId).eq("del_flag","0").eq("app_user_type","1");
         return userMapper.selectList(queryWrapper);
     }
+
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
index 18bfb26..a014700 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -342,4 +342,33 @@
             #{userId}
         </foreach>
     </select>
+
+    <select id="getOwnAndChildrenOnlineSoilderList" resultMap="SysUserOnlyResult">
+        select distinct su.user_id,su.dept_id,su.user_name,
+        concat(su.nick_name,'(',sd.dept_name,')') as nick_name from sys_user su
+        inner join sys_user_role sur on su.user_id = sur.user_id
+        inner join sys_role sr on sur.role_id = sr.role_id
+        inner join sys_dept sd on su.dept_id = sd.dept_id
+        where sr.role_key = 'appUser' and su.dept_id in
+        <foreach collection="deptIdList" item="deptId" open="(" close=")" separator=",">
+            #{deptId}
+        </foreach>
+        and su.app_online_state = '1' and su.status = '0' and su.del_flag = '0'
+        order by su.dept_id asc
+    </select>
+
+    <select id="getOwnAndChildrenSoilderListAll" resultMap="SysUserOnlyResult">
+        select distinct su.user_id,su.dept_id,su.user_name,
+        concat(su.nick_name,'(',sd.dept_name,')') as nick_name,
+        su.app_online_state from sys_user su
+        inner join sys_user_role sur on su.user_id = sur.user_id
+        inner join sys_role sr on sur.role_id = sr.role_id
+        inner join sys_dept sd on su.dept_id = sd.dept_id
+        where sr.role_key = 'appUser' and su.dept_id in
+        <foreach collection="deptIdList" item="deptId" open="(" close=")" separator=",">
+            #{deptId}
+        </foreach>
+        and su.status = '0' and su.del_flag = '0'
+        order by su.dept_id asc
+    </select>
 </mapper> 
\ No newline at end of file

--
Gitblit v1.9.3