瀏覽代碼

根据uavSn获取无人机及所属部门集合

bihs 2 周之前
父節點
當前提交
f06500f5dd

+ 6 - 0
pom.xml

@@ -114,6 +114,12 @@
             <artifactId>isoparser</artifactId>
             <version>1.1.22</version>
         </dependency>
+
+        <!-- SpringBoot Websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 698 - 7
src/main/java/com/sooka/sponest/monitor/uav/controller/CentermonitorTUavController.java

@@ -11,7 +11,9 @@ import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.sooka.sponest.monitor.remoteapi.service.center.system.RemoteService;
 import com.sooka.sponest.monitor.uav.domain.CentermonitorTUav;
+import com.sooka.sponest.monitor.uav.domain.dto.CentermonitorTUavDTO;
 import com.sooka.sponest.monitor.uav.service.ICentermonitorTUavService;
+import com.sooka.sponest.monitor.websocket.WebSocketUsers;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.config.RequestConfig;
@@ -32,9 +34,13 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.net.ssl.SSLContext;
 import javax.servlet.http.HttpServletResponse;
+import javax.websocket.*;
 import java.io.IOException;
+import java.net.URI;
 import java.nio.charset.StandardCharsets;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 无人机Controller
@@ -62,9 +68,11 @@ public class CentermonitorTUavController extends BaseController {
 
     private static final String REQUEST_URL = "https://47.93.50.30/etkqq/login";
 
+    /**
+     * 2.登录鉴权
+     */
     @GetMapping("/getToken")
     public String getToken() {
-
         try (CloseableHttpClient httpClient = createCustomHttpClient()) {
             HttpPost httpPost = new HttpPost(REQUEST_URL);
             // 使用 JSON 处理库构建请求体
@@ -88,11 +96,8 @@ public class CentermonitorTUavController extends BaseController {
                 log.error("请求失败,状态码: {}", statusCode);
                 return "请求失败,状态码: " + statusCode;
             }
-        } catch (IOException e) {
-            log.error("请求发生异常: {}", e.getMessage(), e);
-            return "请求发生异常: " + e.getMessage();
         } catch (Exception e) {
-            throw new RuntimeException(e);
+            return "请求发生异常: " + e.getMessage();
         }
     }
 
@@ -115,7 +120,7 @@ public class CentermonitorTUavController extends BaseController {
                 if (responseEntity != null) {
                     JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
                     String returnUrl = requestUrl + "/tower/pub/zgtt?sign=" + json.get("data").toString();
-                    return AjaxResult.success("操作成功",returnUrl);
+                    return AjaxResult.success("操作成功", returnUrl);
                 } else {
                     log.error("响应实体为空");
                     return AjaxResult.error("响应实体为空");
@@ -129,6 +134,683 @@ public class CentermonitorTUavController extends BaseController {
         return AjaxResult.error("请求失败");
     }
 
+    /**
+     * 无人机组织树
+     */
+    @GetMapping("/getCopterTree")
+    public AjaxResult getCopterTree() {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            R<String> requestResult = remoteService.uavSignUrl();
+            if (requestResult == null || requestResult.getData() == null) {
+                log.error("获取的请求 URL 为空");
+                return AjaxResult.error("获取的请求 URL 为空");
+            }
+            String requestUrl = requestResult.getData();
+            // 使用 HttpGet 进行 GET 请求
+            HttpGet httpGet = new HttpGet(requestUrl + "/etkqq/copterMetaData/getCopterTree");
+            httpGet.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机详细信息
+     */
+    @GetMapping("/getCopterBasicData/{copterId}")
+    public AjaxResult getCopterBasicData(@PathVariable("copterId") String copterId) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            R<String> requestResult = remoteService.uavSignUrl();
+            if (requestResult == null || requestResult.getData() == null) {
+                log.error("获取的请求 URL 为空");
+                return AjaxResult.error("获取的请求 URL 为空");
+            }
+            String requestUrl = requestResult.getData();
+            // 使用 HttpGet 进行 GET 请求
+            HttpGet httpGet = new HttpGet(requestUrl + "/etkqq/copterMetaData/getCopterBasicData?copterId=" + copterId);
+            httpGet.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 机库组织树
+     */
+    @GetMapping("/getOrgTree")
+    public AjaxResult getOrgTree() {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            R<String> requestResult = remoteService.uavSignUrl();
+            if (requestResult == null || requestResult.getData() == null) {
+                log.error("获取的请求 URL 为空");
+                return AjaxResult.error("获取的请求 URL 为空");
+            }
+            String requestUrl = requestResult.getData();
+            // 使用 HttpGet 进行 GET 请求
+            HttpGet httpGet = new HttpGet(requestUrl + "/etkqq/security/getOrgTree");
+            httpGet.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 机库详细信息
+     */
+    @GetMapping("/getBoxBasicData/{boxId}")
+    public AjaxResult getBoxBasicData(@PathVariable("boxId") String boxId) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            R<String> requestResult = remoteService.uavSignUrl();
+            if (requestResult == null || requestResult.getData() == null) {
+                log.error("获取的请求 URL 为空");
+                return AjaxResult.error("获取的请求 URL 为空");
+            }
+            String requestUrl = requestResult.getData();
+            // 使用 HttpGet 进行 GET 请求
+            HttpGet httpGet = new HttpGet(requestUrl + "/etkqq/boxMetaData/getBoxBasicData?boxId=" + boxId);
+            httpGet.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机直播视频
+     */
+    @PostMapping("/openLive")
+    public AjaxResult openLive(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/box/openLive");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{" +
+                    "\"copterId\": \"" + map.get("copterId") + "\", " +
+                    "\"boxId\": \"" + map.get("boxId") + "\", " +
+                    "\"copterSn\": \"" + map.get("copterSn") + "\", " +
+                    "\"boxSn\": \"" + map.get("boxSn") + "\" ," +
+                    "\"type\": \"" + map.get("type") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机控制指令
+     */
+    @PostMapping("/realControl")
+    public AjaxResult realControl(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/box/realControl");
+            // 使用 JSON 处理库构建请求体
+            LinkedHashMap<String, Object> point = (LinkedHashMap<String, Object>) map.get("point");
+            String requestBody = "{" +
+                    "\"boxId\": \"" + map.get("boxId") + "\", " +
+                    "\"copterId\": \"" + map.get("copterId") + "\", " +
+                    "\"boxSn\": \"" + map.get("boxSn") + "\" ," +
+                    "\"code\": \"" + map.get("code") + "\", " +
+                    "\"speed\": \"" + map.get("speed") + "\", " +
+                    "\"angle\": \"" + map.get("angle") + "\", " +
+                    "\"mode\": \"" + map.get("mode") + "\", " +
+                    "\"point\": {" +
+                    "\"latitude\": \"" + point.get("latitude") + "\", " +
+                    "\"longitude\": \"" + point.get("longitude") + "\", " +
+                    "\"altitude\": \"" + point.get("altitude") + "\"" +
+                    "}" +
+                    "}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机实时轨迹
+     */
+    @PostMapping("/currentWayline")
+    public AjaxResult currentWayline(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/task/currentWayline");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{\"copterSn\": \"" + map.get("copterSn") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机历史轨迹
+     */
+    @PostMapping("/historyWayline")
+    public AjaxResult historyWayline(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/task/historyWayline");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{\"copterSn\": \"" + map.get("copterSn") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString(), json.get("result"));
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 喊话器喊话
+     */
+    @PostMapping("/drcSpeakerTtsPlayStart")
+    public AjaxResult drcSpeakerTtsPlayStart(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/box/drcSpeakerTtsPlayStart");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{" +
+                    "\"boxSn\": \"" + map.get("boxSn") + "\" ," +
+                    "\"copterSn\": \"" + map.get("copterSn") + "\", " +
+                    "\"name\": \"" + map.get("name") + "\", " +
+                    "\"text\": \"" + map.get("text") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 开始执行计划
+     */
+    @GetMapping("/startPlan")
+    public AjaxResult startPlan(@RequestParam(value = "boxSn") String boxSn, @RequestParam(value = "planId") String planId) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            R<String> requestResult = remoteService.uavSignUrl();
+            if (requestResult == null || requestResult.getData() == null) {
+                log.error("获取的请求 URL 为空");
+                return AjaxResult.error("获取的请求 URL 为空");
+            }
+            String requestUrl = requestResult.getData();
+            // 使用 HttpGet 进行 GET 请求
+            HttpGet httpGet = new HttpGet(requestUrl + "/etkqq/boxMetaData/getBoxBasicData?boxSn=" + boxSn + "&planId=" + planId);
+            httpGet.setHeader("Authorization", jsonObject.get("token").toString());
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpGet);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 快速执飞
+     */
+    @PostMapping("/fastFlying")
+    public AjaxResult fastFlying(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/plan/fastFlying");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{" +
+                    "\"boxSn\": \"" + map.get("boxSn") + "\" ," +
+                    "\"boxId\": \"" + map.get("boxId") + "\", " +
+                    "\"copterId\": \"" + map.get("copterId") + "\", " +
+                    "\"copterSn\": \"" + map.get("copterSn") + "\", " +
+                    "\"longitude\": \"" + map.get("longitude") + "\", " +
+                    "\"latitude\": \"" + map.get("latitude") + "\", " +
+                    "\"flySpeed\": \"" + map.get("flySpeed") + "\", " +
+                    "\"boxPosition\": \"" + map.get("boxPosition") + "\", " +
+                    "\"expand2\": \"" + map.get("expand2") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 规划航线
+     */
+    //todo 待完善 且调用接口返回500 根据增删改查修改返回类型
+    @PostMapping("/operationTask")
+    public AjaxResult operationTask(@RequestBody CentermonitorTUavDTO dto) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        LinkedHashMap<String, Object> task = new LinkedHashMap<>();
+        task.put("taskType", dto.getTaskType());
+        task.put("taskName", dto.getTaskName());
+        task.put("heightMode", dto.getHeightMode());
+        task.put("relativeHeight", dto.getRelativeHeight());
+        task.put("globalHeight", dto.getGlobalHeight());
+        task.put("returnAltitude", dto.getReturnAltitude());
+        task.put("completeAction", dto.getCompleteAction());
+        task.put("flySpeed", dto.getFlySpeed());
+        task.put("lostSignal", dto.getLostSignal());
+        task.put("flyCourse", dto.getFlyCourse());
+        task.put("flySeconds", dto.getFlySeconds());
+        task.put("waypointNum", dto.getWaypointNum());
+        task.put("boxPosition", dto.getBoxPosition());
+        task.put("resolution", dto.getResolution());
+        task.put("headingOverlap", dto.getHeadingOverlap());
+        task.put("sideOverlap", dto.getSideOverlap());
+        task.put("heading", dto.getHeading());
+        task.put("wayLineYaw", dto.getWayLineYaw());
+        task.put("cameraId", dto.getCameraId());
+        task.put("wayPointList", dto.getWayPointList());
+        task.put("boxId", dto.getBoxId());
+        task.put("type", dto.getType());
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/task/operationTask");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = JSONObject.toJSONString(task);
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        //todo websocket
+        WebSocketUsers.sendMessageToUsersByText(JSON.toJSONString(AjaxResult.success("10002",new ArrayList<>())));
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 规划计划
+     */
+    //todo 待完善 且调用接口返回500 根据增删改查修改返回类型
+    @PostMapping("/operationPlan")
+    public AjaxResult operationPlan(@RequestBody Map<String, Object> map) {
+        String token = getToken();
+        JSONObject jsonObject = JSONObject.parseObject(token);
+        if (token == null) {
+            return AjaxResult.error("获取 token 失败");
+        }
+        R<String> requestResult = remoteService.uavSignUrl();
+        if (requestResult == null || requestResult.getData() == null) {
+            log.error("获取的请求 URL 为空");
+            return AjaxResult.error("获取的请求 URL 为空");
+        }
+        String requestUrl = requestResult.getData();
+        try (CloseableHttpClient httpClient = createCustomHttpClient()) {
+            HttpPost httpPost = new HttpPost(requestUrl + "/etkqq/plan/operationPlan");
+            // 使用 JSON 处理库构建请求体
+            String requestBody = "{" +
+                    "\"caption\": \"" + map.get("caption") + "\" ," +
+                    "\"planType\": \"" + map.get("planType") + "\", " +
+                    "\"businessType\": \"" + map.get("businessType") + "\", " +
+                    "\"isAi\": \"" + map.get("isAi") + "\", " +
+                    "\"aiMode\": \"" + map.get("aiMode") + "\", " +
+                    "\"isHover\": \"" + map.get("isHover") + "\", " +
+                    "\"taskId\": \"" + map.get("taskId") + "\", " +
+                    "\"type\": \"" + map.get("type") + "\", " +
+                    "\"boxId\": \"" + map.get("boxId") + "\"}";
+            StringEntity entity = new StringEntity(requestBody, StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", jsonObject.get("token").toString());
+
+            // 发送请求
+            HttpResponse response = httpClient.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (responseEntity != null) {
+                    JSONObject json = JSON.parseObject(EntityUtils.toString(responseEntity, StandardCharsets.UTF_8));
+                    return AjaxResult.success(json.get("retMsg").toString());
+                }
+            } else {
+                log.error("请求失败,状态码: {}", statusCode);
+                return AjaxResult.error("请求失败,状态码: " + statusCode);
+            }
+        } catch (Exception e) {
+            log.error("发生未知异常", e);
+        }
+        return AjaxResult.success("操作成功,暂无数据");
+    }
+
+    /**
+     * 无人机机库实时数据
+     */
+    //todo 未测试接口连通性
+    @GetMapping("/getHangarRealTimeData")
+    public String getHangarRealTimeData(@RequestParam(value = "copterSn") String copterSn,@RequestParam(value = "boxSn") String boxSn) {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final StringBuilder response = new StringBuilder();
+        try {
+            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+            String uri = "wss://47.93.50.30/etkqq/api/websocket/100";
+
+            Session session = container.connectToServer(new Endpoint() {
+                @Override
+                public void onOpen(Session session, EndpointConfig config) {
+                    String message = String.format("{\"copterSn\": \"%s\", \"boxSn\": \"%s\"}",
+                            copterSn, boxSn);
+                    session.addMessageHandler(new MessageHandler.Whole<String>() {
+                        @Override
+                        public void onMessage(String msg) {
+                            response.append(msg);
+                            latch.countDown();
+                        }
+                    });
+                    session.getAsyncRemote().sendText(message);
+                }
+            }, ClientEndpointConfig.Builder.create().build(), new URI(uri));
+            latch.await(10, TimeUnit.SECONDS);
+            session.close();
+            return response.toString();
+        } catch (Exception e) {
+            return "Error: " + e.getMessage();
+        }
+    }
+
+    /**
+     * 机库日志
+     */
+    //todo 未测试接口连通性
+    @GetMapping("/getHangarLog")
+    public String getHangarLog(@RequestParam(value = "copterSn") String copterSn,@RequestParam(value = "boxSn") String boxSn) {
+        final CountDownLatch latch = new CountDownLatch(1);
+        final StringBuilder response = new StringBuilder();
+        try {
+            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
+            String uri = "wss://47.93.50.30/etkqq/api/websocket/102";
+
+            Session session = container.connectToServer(new Endpoint() {
+                @Override
+                public void onOpen(Session session, EndpointConfig config) {
+                    String message = String.format("{\"copterSn\": \"%s\", \"boxSn\": \"%s\"}",
+                            copterSn, boxSn);
+                    session.addMessageHandler(new MessageHandler.Whole<String>() {
+                        @Override
+                        public void onMessage(String msg) {
+                            response.append(msg);
+                            latch.countDown();
+                        }
+                    });
+                    session.getAsyncRemote().sendText(message);
+                }
+            }, ClientEndpointConfig.Builder.create().build(), new URI(uri));
+            latch.await(10, TimeUnit.SECONDS);
+            session.close();
+            return response.toString();
+        } catch (Exception e) {
+            return "Error: " + e.getMessage();
+        }
+    }
 
     /**
      * 工厂方法:创建自定义配置的 HttpClient
@@ -221,4 +903,13 @@ public class CentermonitorTUavController extends BaseController {
     public AjaxResult selectCentermonitorTUavByDeptId() {
         return AjaxResult.success(centermonitorTUavService.selectCentermonitorTUavByDeptId());
     }
+
+    /**
+     * 根据uavSn获取无人机及所属部门集合
+     */
+    @GetMapping("/selectUavByUavId/{uavSn}")
+    public AjaxResult selectUavByUavId(@PathVariable("uavSn") String uavSn) {
+        return AjaxResult.success(centermonitorTUavService.selectUavByUavSn(uavSn));
+    }
+
 }

+ 32 - 0
src/main/java/com/sooka/sponest/monitor/uav/domain/CentermonitorTUav.java

@@ -5,6 +5,8 @@ import com.ruoyi.common.core.web.domain.BaseEntity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import java.util.List;
+
 /**
  * 无人机对象 centermonitor_t_uav
  *
@@ -79,6 +81,18 @@ public class CentermonitorTUav extends BaseEntity {
     @Excel(name = "部门id")
     private String deptId;
 
+    /**
+     * 部门名称
+     */
+    @Excel(name = "部门名称")
+    private String deptName;
+
+    /**
+     * 部门集合
+     */
+    @Excel(name = "部门集合")
+    private List<CentermonitorTUavdept> deptList;
+
     public void setId(Long id) {
         this.id = id;
     }
@@ -167,6 +181,22 @@ public class CentermonitorTUav extends BaseEntity {
         return deptId;
     }
 
+    public String getDeptName() {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName) {
+        this.deptName = deptName;
+    }
+
+    public List<CentermonitorTUavdept> getDeptList() {
+        return deptList;
+    }
+
+    public void setDeptList(List<CentermonitorTUavdept> deptList) {
+        this.deptList = deptList;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
@@ -181,6 +211,8 @@ public class CentermonitorTUav extends BaseEntity {
                 .append("uavId", getUavId())
                 .append("uavSn", getUavSn())
                 .append("deptId", getDeptId())
+                .append("deptName", getDeptName())
+                .append("deptList", getDeptList())
                 .toString();
     }
 }

+ 50 - 0
src/main/java/com/sooka/sponest/monitor/uav/domain/dto/CentermonitorTUavDTO.java

@@ -0,0 +1,50 @@
+package com.sooka.sponest.monitor.uav.domain.dto;
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CentermonitorTUavDTO {
+    private Integer taskType;
+    private String taskName;
+    private Integer heightMode;
+    private Integer relativeHeight;
+    private Integer globalHeight;
+    private Integer returnAltitude;
+    private Integer completeAction;
+    private Integer flySpeed;
+    private Integer lostSignal;
+    private Integer flyCourse;
+    private Integer flySeconds;
+    private Integer waypointNum;
+    private String boxPosition;
+    private Double resolution;
+    private Integer headingOverlap;
+    private Integer sideOverlap;
+    private Integer heading;
+    private Integer wayLineYaw;
+    private Integer cameraId;
+    private List<WayPoint> wayPointList;
+    private Integer boxId;
+    private String type;
+
+    @Data
+    public static class WayPoint {
+        private Integer number;
+        private String latitude;
+        private String longitude;
+        private Double relativeHeight;
+        private Double altitude;
+        private String expand2;
+        private List<Action> actions;
+    }
+
+    @Data
+    public static class Action {
+        private Integer number;
+        private Integer actionType;
+        private Integer actionParam;
+    }
+}

+ 1 - 0
src/main/java/com/sooka/sponest/monitor/uav/mapper/CentermonitorTUavMapper.java

@@ -68,4 +68,5 @@ public interface CentermonitorTUavMapper {
      */
     List<CentermonitorTUav> selectCentermonitorTUavByDeptId(@Param("deptId") String deptId);
 
+    CentermonitorTUav selectUavByUavSn(@Param("uavSn") String uavSn);
 }

+ 2 - 0
src/main/java/com/sooka/sponest/monitor/uav/mapper/CentermonitorTUavdeptMapper.java

@@ -60,4 +60,6 @@ public interface CentermonitorTUavdeptMapper {
      */
     public int deleteCentermonitorTUavdeptByIds(Long[] ids);
 
+    public List<CentermonitorTUavdept> selectUavdeptByUavId(@Param("uavId") Long uavId);
+
 }

+ 2 - 0
src/main/java/com/sooka/sponest/monitor/uav/service/ICentermonitorTUavService.java

@@ -64,4 +64,6 @@ public interface ICentermonitorTUavService {
      * @return
      */
     List<CentermonitorTUav> selectCentermonitorTUavByDeptId();
+
+    CentermonitorTUav selectUavByUavSn(String uavSn);
 }

+ 14 - 1
src/main/java/com/sooka/sponest/monitor/uav/service/impl/CentermonitorTUavServiceImpl.java

@@ -3,11 +3,12 @@ package com.sooka.sponest.monitor.uav.service.impl;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.sooka.sponest.monitor.uav.domain.CentermonitorTUav;
 import com.sooka.sponest.monitor.uav.mapper.CentermonitorTUavMapper;
+import com.sooka.sponest.monitor.uav.mapper.CentermonitorTUavdeptMapper;
 import com.sooka.sponest.monitor.uav.service.ICentermonitorTUavService;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Collections;
 import java.util.List;
 
 
@@ -21,6 +22,8 @@ import java.util.List;
 public class CentermonitorTUavServiceImpl implements ICentermonitorTUavService {
     @Autowired
     private CentermonitorTUavMapper centermonitorTUavMapper;
+    @Autowired
+    private CentermonitorTUavdeptMapper centermonitorTUavdeptMapper;
 
     /**
      * 查询无人机
@@ -90,6 +93,7 @@ public class CentermonitorTUavServiceImpl implements ICentermonitorTUavService {
 
     /**
      * 根据部门id查询无人机列表
+     *
      * @return
      */
     @Override
@@ -97,4 +101,13 @@ public class CentermonitorTUavServiceImpl implements ICentermonitorTUavService {
         Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
         return centermonitorTUavMapper.selectCentermonitorTUavByDeptId(String.valueOf(deptId));
     }
+
+    @Override
+    public CentermonitorTUav selectUavByUavSn(String uavSn) {
+        CentermonitorTUav centermonitorTUav = centermonitorTUavMapper.selectUavByUavSn(uavSn);
+        if (ObjectUtils.isNotEmpty(centermonitorTUav)) {
+            centermonitorTUav.setDeptList(centermonitorTUavdeptMapper.selectUavdeptByUavId(centermonitorTUav.getId()));
+        }
+        return centermonitorTUav;
+    }
 }

+ 51 - 0
src/main/java/com/sooka/sponest/monitor/websocket/SemaphoreUtils.java

@@ -0,0 +1,51 @@
+package com.sooka.sponest.monitor.websocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.Semaphore;
+
+/**
+ * 信号量相关处理
+ *
+ * @author ruoyi
+ */
+public class SemaphoreUtils {
+
+    /**
+     * SemaphoreUtils 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(SemaphoreUtils.class);
+
+    /**
+     * 获取信号量
+     *
+     * @param semaphore
+     * @return
+     */
+    public static boolean tryAcquire(Semaphore semaphore) {
+        boolean flag = false;
+
+        try {
+            flag = semaphore.tryAcquire();
+        } catch (Exception e) {
+            LOGGER.error("获取信号量异常", e);
+        }
+
+        return flag;
+    }
+
+    /**
+     * 释放信号量
+     *
+     * @param semaphore
+     */
+    public static void release(Semaphore semaphore) {
+
+        try {
+            semaphore.release();
+        } catch (Exception e) {
+            LOGGER.error("释放信号量异常", e);
+        }
+    }
+}

+ 19 - 0
src/main/java/com/sooka/sponest/monitor/websocket/WebSocketConfig.java

@@ -0,0 +1,19 @@
+package com.sooka.sponest.monitor.websocket;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+
+/**
+ * websocket 配置
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class WebSocketConfig {
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}

+ 91 - 0
src/main/java/com/sooka/sponest/monitor/websocket/WebSocketServer.java

@@ -0,0 +1,91 @@
+package com.sooka.sponest.monitor.websocket;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.util.concurrent.Semaphore;
+
+/**
+ * websocket 消息处理
+ *
+ * @author ruoyi
+ */
+@Component
+@ServerEndpoint("/ws")
+public class WebSocketServer {
+    /**
+     * WebSocketServer 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);
+
+    /**
+     * 默认最多允许同时在线人数100
+     */
+    public static int socketMaxOnlineCount = 100;
+
+    private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);
+
+    /**
+     * 连接建立成功调用的方法
+     */
+    @OnOpen
+    public void onOpen(Session session) throws Exception {
+        boolean semaphoreFlag = false;
+        // 尝试获取信号量
+        semaphoreFlag = SemaphoreUtils.tryAcquire(socketSemaphore);
+        if (!semaphoreFlag) {
+            // 未获取到信号量
+            LOGGER.error("\n 当前在线人数超过限制数: {}", socketMaxOnlineCount);
+            WebSocketUsers.sendMessageToUserByText(session, "当前在线人数超过限制数:" + socketMaxOnlineCount);
+            session.close();
+        } else {
+            // 添加用户
+            WebSocketUsers.put(session.getId(), session);
+            LOGGER.info("\n 建立连接 : {}", session);
+            LOGGER.info("\n 当前人数 : {}", WebSocketUsers.getUsers().size());
+            WebSocketUsers.sendMessageToUserByText(session, "连接成功");
+        }
+    }
+
+    /**
+     * 连接关闭时处理
+     */
+    @OnClose
+    public void onClose(Session session) {
+        LOGGER.info("\n 关闭连接 : {}", session);
+        // 移除用户
+        WebSocketUsers.remove(session.getId());
+        // 获取到信号量则需释放
+        SemaphoreUtils.release(socketSemaphore);
+    }
+
+    /**
+     * 抛出异常时处理
+     */
+    @OnError
+    public void onError(Session session, Throwable exception) throws Exception {
+        if (session.isOpen()) {
+            // 关闭连接
+            session.close();
+        }
+        String sessionId = session.getId();
+        LOGGER.info("\n 连接异常 : {}", sessionId);
+        LOGGER.info("\n 异常信息 : {}", exception);
+        // 移出用户
+        WebSocketUsers.remove(sessionId);
+        // 获取到信号量则需释放
+        SemaphoreUtils.release(socketSemaphore);
+    }
+
+    /**
+     * 服务器接收到客户端消息时调用的方法
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {
+        String msg = message.replace("你", "我").replace("吗", "");
+        WebSocketUsers.sendMessageToUserByText(session, msg);
+    }
+}

+ 121 - 0
src/main/java/com/sooka/sponest/monitor/websocket/WebSocketUsers.java

@@ -0,0 +1,121 @@
+package com.sooka.sponest.monitor.websocket;
+
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.websocket.Session;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * websocket 客户端用户集
+ *
+ * @author ruoyi
+ */
+@Slf4j
+public class WebSocketUsers {
+    /**
+     * WebSocketUsers 日志控制器
+     */
+    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketUsers.class);
+
+    /**
+     * 用户集
+     */
+    private static Map<String, Session> USERS = new ConcurrentHashMap<String, Session>();
+
+    /**
+     * 存储用户
+     *
+     * @param key     唯一键
+     * @param session 用户信息
+     */
+    public static void put(String key, Session session) {
+        USERS.put(key, session);
+    }
+
+    /**
+     * 移除用户
+     *
+     * @param session 用户信息
+     * @return 移除结果
+     */
+    public static boolean remove(Session session) {
+        String key = null;
+        boolean flag = USERS.containsValue(session);
+        if (flag) {
+            Set<Map.Entry<String, Session>> entries = USERS.entrySet();
+            for (Map.Entry<String, Session> entry : entries) {
+                Session value = entry.getValue();
+                if (value.equals(session)) {
+                    key = entry.getKey();
+                    break;
+                }
+            }
+        } else {
+            return true;
+        }
+        return remove(key);
+    }
+
+    /**
+     * 移出用户
+     *
+     * @param key 键
+     */
+    public static boolean remove(String key) {
+        LOGGER.info("\n 正在移出用户 - {}", key);
+        Session remove = USERS.remove(key);
+        if (remove != null) {
+            boolean containsValue = USERS.containsValue(remove);
+            LOGGER.info("\n 移出结果 - {}", containsValue ? "失败" : "成功");
+            return containsValue;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 获取在线用户列表
+     *
+     * @return 返回用户集合
+     */
+    public static Map<String, Session> getUsers() {
+        return USERS;
+    }
+
+    /**
+     * 群发消息文本消息
+     *
+     * @param message 消息内容
+     */
+    public static void sendMessageToUsersByText(String message) {
+        Collection<Session> values = USERS.values();
+        for (Session value : values) {
+            sendMessageToUserByText(value, message);
+            log.info("message:{}", message);
+        }
+    }
+
+    /**
+     * 发送文本消息
+     *
+     * @param userName 自己的用户名
+     * @param message  消息内容
+     */
+    public static void sendMessageToUserByText(Session session, String message) {
+        if (session != null) {
+            try {
+                session.getBasicRemote().sendText(message);
+            } catch (IOException e) {
+                LOGGER.error("\n[发送消息异常]", e);
+            }
+        } else {
+            LOGGER.info("\n[你已离线]");
+        }
+    }
+}

+ 12 - 7
src/main/resources/mapper/monitor/uav/CentermonitorTUavMapper.xml

@@ -16,7 +16,7 @@
         <result property="uavId" column="uav_id"/>
         <result property="uavSn" column="uav_sn"/>
         <result property="deptId" column="dept_id"/>
-        <result property="deptNames" column="deptNames"/>
+        <result property="deptName" column="dept_name"/>
     </resultMap>
 
     <sql id="selectCentermonitorTUavVo">
@@ -29,8 +29,7 @@
                height,
                uav_name,
                uav_id,
-               uav_sn,
-               dept_id
+               uav_sn
         from centermonitor_t_uav
     </sql>
 
@@ -48,7 +47,6 @@
             <if test="uavName != null  and uavName != ''">and uav_name like concat('%', #{uavName}, '%')</if>
             <if test="uavId != null  and uavId != ''">and uav_id = #{uavId}</if>
             <if test="uavSn != null  and uavSn != ''">and uav_sn = #{uavSn}</if>
-            <if test="deptId != null  and deptId != ''">and dept_id = #{deptId}</if>
         </where>
     </select>
 
@@ -69,7 +67,6 @@
             <if test="uavName != null">uav_name,</if>
             <if test="uavId != null">uav_id,</if>
             <if test="uavSn != null">uav_sn,</if>
-            <if test="deptId != null">dept_id,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="baseStationName != null">#{baseStationName},</if>
@@ -81,7 +78,6 @@
             <if test="uavName != null">#{uavName},</if>
             <if test="uavId != null">#{uavId},</if>
             <if test="uavSn != null">#{uavSn},</if>
-            <if test="deptId != null">#{deptId},</if>
         </trim>
     </insert>
 
@@ -97,7 +93,6 @@
             <if test="uavName != null">uav_name = #{uavName},</if>
             <if test="uavId != null">uav_id = #{uavId},</if>
             <if test="uavSn != null">uav_sn = #{uavSn},</if>
-            <if test="deptId != null">dept_id = #{deptId},</if>
         </trim>
         where id = #{id}
     </update>
@@ -124,4 +119,14 @@
         WHERE
             ctud.dept_id = #{deptId}
     </select>
+
+    <select id="selectUavByUavSn" parameterType="Long" resultMap="CentermonitorTUavResult">
+        SELECT ctu.*,
+               GROUP_CONCAT(ctud.dept_id) dept_id,
+               GROUP_CONCAT(ctud.dept_name) dept_name
+        FROM centermonitor_t_uav ctu
+                 LEFT JOIN centermonitor_t_uavdept ctud ON ctud.uav_id = ctu.id
+        where ctu.uav_sn = #{uavSn}
+        group by ctu.uav_id
+    </select>
 </mapper>

+ 4 - 0
src/main/resources/mapper/monitor/uav/CentermonitorTUavdeptMapper.xml

@@ -83,4 +83,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </delete>
 
+    <select id="selectUavdeptByUavId" parameterType="Long" resultMap="CentermonitorTUavdeptResult">
+        <include refid="selectCentermonitorTUavdeptVo"/>
+        where uav_id = #{uavId}
+    </select>
 </mapper>