diff --git a/zc-business/src/main/java/com/zc/business/controller/VideoController.java b/zc-business/src/main/java/com/zc/business/controller/VideoController.java new file mode 100644 index 00000000..17bed0e4 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/VideoController.java @@ -0,0 +1,305 @@ +package com.zc.business.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.zc.common.core.httpclient.OkHttp; +import com.zc.common.core.httpclient.exception.HttpException; +import com.zc.common.core.httpclient.request.RequestParams; +import okhttp3.Response; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.ruoyi.common.constant.Constants.HTTP; + + +/** + * License + * + * @author Athena-xiepufeng + */ +@RestController +@RequestMapping("/video") +public class VideoController extends BaseController { + + private static final String USERNAME = "jhgskj"; + private static final String PASSWORD = "jhgskj@2023"; + private static String TOKEN; + + private final static String URL = HTTP + "10.166.147.60:9021"; + + public static final Integer UNAUTHORIZED = 401; + + + public static final Integer ERROR = 500; + + /** + * 查询附近相机 + */ + @GetMapping(value = "/nearCamListDistance") + public JSONObject nearCamListDistance(String devLat, String devLon) throws HttpException, IOException { + + JSONObject jsonResult = null; + + // 1000 米 + String distance = "1000"; + + OkHttp okHttp = new OkHttp(); + + RequestParams requestParams = new RequestParams(); + requestParams.put("devLat", devLat); + requestParams.put("devLon", devLon); + requestParams.put("distance", distance); + + Map header = new HashMap<>(); + + if (VideoController.TOKEN == null) { + getToken(); + } + + header.put("Authorization", TOKEN); + + Response response // 请求响应 + = okHttp + .headers(header) + .url(URL + "/videoInfo/api/nearCamListDistance") // 请求地址 + .data(requestParams) // 请求参数 + .get(); // 请求方法 + + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + + if (jsonResult.containsKey("code") && UNAUTHORIZED.equals(jsonResult.getInteger("code"))) { + getToken(); + okHttp.get(); + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + } + } + } + + return jsonResult; + + } + + /** + * 根据桩号查询附近相机 + */ + @GetMapping(value = "/nearCamListPileNum") + public Object nearCamListPileNum(String pileNum) throws HttpException, IOException { + + // 获取济菏运管中心相机信息 + JSONObject camInfo = getCamByDept("1301730"); + + if (!camInfo.containsKey("data")) { + return camInfo; + } + + JSONArray camData = camInfo.getJSONArray("data"); + + List resultList = new ArrayList<>(); + + camData.forEach(item -> { + JSONObject jsonObject = (JSONObject) item; + if (isNearbyPileNum(pileNum, jsonObject.getString("pileNum"))) { + resultList.add(item); + } + }); + + return AjaxResult.success(resultList); + } + + /** + * 获取视频流信息 + */ + @GetMapping(value = "/externalVideoStreaming") + public JSONObject externalVideoStreaming(String camId) throws HttpException, IOException { + + JSONObject jsonResult = null; + + OkHttp okHttp = new OkHttp(); + + RequestParams requestParams = new RequestParams(); + requestParams.put("type", "1"); + requestParams.put("camId", camId); + + Map header = new HashMap<>(); + + if (VideoController.TOKEN == null) { + getToken(); + } + + header.put("Authorization", TOKEN); + + Response response // 请求响应 + = okHttp + .headers(header) + .url(URL + "/videoInfo/api/externalVideoStreaming") // 请求地址 + .data(requestParams) // 请求参数 + .post(); // 请求方法 + + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + + if (jsonResult.containsKey("code") && UNAUTHORIZED.equals(jsonResult.getInteger("code"))) { + getToken(); + okHttp.post(); + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + } + } + } + + return jsonResult; + } + + + /** + * 云平台控制 + */ + @GetMapping(value = "/PTZControl") + public JSONObject PTZControl(String camId, String cmdType, String speed) throws HttpException, IOException { + + JSONObject jsonResult = null; + + OkHttp okHttp = new OkHttp(); + + RequestParams requestParams = new RequestParams(); + requestParams.put("msgType", "3"); + requestParams.put("camId", camId); + requestParams.put("cmdType", cmdType); + requestParams.put("speed", speed); + + Map header = new HashMap<>(); + + if (VideoController.TOKEN == null) { + getToken(); + } + + header.put("Authorization", TOKEN); + + Response response // 请求响应 + = okHttp + .headers(header) + .url(URL + "/videoInfo/api/PTZControl") // 请求地址 + .data(requestParams) // 请求参数 + .get(); // 请求方法 + + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + + if (jsonResult.containsKey("code") && UNAUTHORIZED.equals(jsonResult.getInteger("code"))) { + getToken(); + okHttp.get(); + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + } + } + } + + return jsonResult; + } + + + public void getToken() throws HttpException, IOException { + + OkHttp okHttp = new OkHttp(); + + RequestParams requestParams = new RequestParams(); + requestParams.put("username", USERNAME); + requestParams.put("password", PASSWORD); + + Response response // 请求响应 + = okHttp + .url(URL + "/apiLogin") // 请求地址 + .data(requestParams) // 请求参数 + .post(); // 请求方法 + + if (response.body() != null) { + JSONObject jsonResult = JSONObject.parseObject(response.body().string()); + if (jsonResult.containsKey("token")) { + VideoController.TOKEN = jsonResult.getString("token"); + } + } + } + + + /** + * 根据组织机构获取摄像机信息 + * @param deptId 机构id + * @return + */ + public JSONObject getCamByDept(String deptId) throws HttpException, IOException { + JSONObject jsonResult = null; + + OkHttp okHttp = new OkHttp(); + + RequestParams requestParams = new RequestParams(); + requestParams.put("deptId", deptId); + + Map header = new HashMap<>(); + + if (VideoController.TOKEN == null) { + getToken(); + } + + header.put("Authorization", TOKEN); + + Response response // 请求响应 + = okHttp + .headers(header) + .url(URL + "/system/camera/camList") // 请求地址 + .data(requestParams) // 请求参数 + .get(); // 请求方法 + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + + if (jsonResult.containsKey("code") && UNAUTHORIZED.equals(jsonResult.getInteger("code"))) { + getToken(); + okHttp.get(); + if (response.body() != null) { + jsonResult = JSONObject.parseObject(response.body().string()); + } + } + } + + return jsonResult; + } + + /** + * 判断是否是附近桩号 + * @return + */ + private boolean isNearbyPileNum(String centralPileNum, String nearbyPileNum) { + + int centralPileNumMetre = pileNumTransformMetre(centralPileNum); + int nearbyPileNumMetre = pileNumTransformMetre(nearbyPileNum); + + return (nearbyPileNumMetre <= centralPileNumMetre + 1000) && (nearbyPileNumMetre >= centralPileNumMetre - 1000); + } + + + /** + * 转换转换成米 + * @param pileNum 桩号 + * @return + */ + private int pileNumTransformMetre(String pileNum) { + String[] parts = pileNum.split("[+ ]"); + if (parts.length < 2) { + return 0; + } + int kilometer = Integer.parseInt(parts[0].substring(1)); // 移除开头的字母 + int meter = Integer.parseInt(parts[1]); + return kilometer * 1000 + meter; + } + +}