From b7ad0a907f59a2bc0455565e76c12bf152016469 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 27 十月 2023 18:06:46 +0800 Subject: [PATCH] 合并pr 优化sql --- src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java | 176 ++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 102 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java old mode 100644 new mode 100755 index b3c8ef9..1986b65 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java @@ -1,10 +1,10 @@ package com.genersoft.iot.vmp.vmanager.gb28181.device; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSONObject; import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.Device; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; @@ -14,35 +14,42 @@ import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.service.IDeviceChannelService; import com.genersoft.iot.vmp.service.IDeviceService; +import com.genersoft.iot.vmp.service.IInviteStreamService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.vmanager.bean.BaseTree; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.commons.compress.utils.IOUtils; -import org.apache.http.HttpResponse; +import org.apache.ibatis.annotations.Options; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; -import javax.sip.DialogState; -import java.io.*; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; +import java.text.ParseException; import java.util.*; @Tag(name = "鍥芥爣璁惧鏌ヨ", description = "鍥芥爣璁惧鏌ヨ") @SuppressWarnings("rawtypes") -@CrossOrigin + @RestController @RequestMapping("/api/device/query") public class DeviceQuery { @@ -57,6 +64,9 @@ @Autowired private IRedisCatchStorage redisCatchStorage; + + @Autowired + private IInviteStreamService inviteStreamService; @Autowired private SIPCommander cmder; @@ -70,9 +80,6 @@ @Autowired private DynamicTask dynamicTask; - @Autowired - private SubscribeHolder subscribeHolder; - /** * 浣跨敤ID鏌ヨ鍥芥爣璁惧 * @param deviceId 鍥芥爣ID @@ -81,10 +88,9 @@ @Operation(summary = "鏌ヨ鍥芥爣璁惧") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @GetMapping("/devices/{deviceId}") - public ResponseEntity<Device> devices(@PathVariable String deviceId){ + public Device devices(@PathVariable String deviceId){ - Device device = storager.queryVideoDevice(deviceId); - return new ResponseEntity<>(device,HttpStatus.OK); + return storager.queryVideoDevice(deviceId); } /** @@ -97,9 +103,11 @@ @Parameter(name = "page", description = "褰撳墠椤�", required = true) @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺", required = true) @GetMapping("/devices") + @Options() public PageInfo<Device> devices(int page, int count){ - - return storager.queryVideoDeviceList(page, count); +// if (page == null) page = 0; +// if (count == null) count = 20; + return storager.queryVideoDeviceList(page, count,null); } /** @@ -123,18 +131,17 @@ @Parameter(name = "online", description = "鏄惁鍦ㄧ嚎") @Parameter(name = "channelType", description = "璁惧/瀛愮洰褰�-> false/true") @Parameter(name = "catalogUnderDevice", description = "鏄惁鐩村睘涓庤澶囩殑鐩綍") - public ResponseEntity<PageInfo> channels(@PathVariable String deviceId, + public PageInfo<DeviceChannel> channels(@PathVariable String deviceId, int page, int count, @RequestParam(required = false) String query, @RequestParam(required = false) Boolean online, @RequestParam(required = false) Boolean channelType, @RequestParam(required = false) Boolean catalogUnderDevice) { - if (StringUtils.isEmpty(query)) { + if (ObjectUtils.isEmpty(query)) { query = null; } - PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); - return new ResponseEntity<>(pageResult,HttpStatus.OK); + return storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count); } /** @@ -144,7 +151,7 @@ */ @Operation(summary = "鍚屾璁惧閫氶亾") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) - @PostMapping("/devices/{deviceId}/sync") + @GetMapping("/devices/{deviceId}/sync") public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { @@ -154,11 +161,8 @@ boolean status = deviceService.isSyncRunning(deviceId); // 宸插瓨鍦ㄥ垯杩斿洖杩涘害 if (status) { - WVPResult<SyncStatus> wvpResult = new WVPResult<>(); - wvpResult.setCode(0); SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); - wvpResult.setData(channelSyncStatus); - return wvpResult; + return WVPResult.success(channelSyncStatus); } deviceService.sync(device); @@ -176,16 +180,16 @@ @Operation(summary = "绉婚櫎璁惧") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @DeleteMapping("/devices/{deviceId}/delete") - public ResponseEntity<String> delete(@PathVariable String deviceId){ + public String delete(@PathVariable String deviceId){ if (logger.isDebugEnabled()) { logger.debug("璁惧淇℃伅鍒犻櫎API璋冪敤锛宒eviceId锛�" + deviceId); } // 娓呴櫎redis璁板綍 - boolean isSuccess = storager.delete(deviceId); + boolean isSuccess = deviceService.delete(deviceId); if (isSuccess) { - redisCatchStorage.clearCatchByDeviceId(deviceId); + inviteStreamService.clearInviteInfo(deviceId); // 鍋滄姝よ澶囩殑璁㈤槄鏇存柊 Set<String> allKeys = dynamicTask.getAllKeys(); for (String key : allKeys) { @@ -200,10 +204,10 @@ } JSONObject json = new JSONObject(); json.put("deviceId", deviceId); - return new ResponseEntity<>(json.toString(),HttpStatus.OK); + return json.toString(); } else { logger.warn("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�"); - return new ResponseEntity<String>("璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�", HttpStatus.INTERNAL_SERVER_ERROR); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧淇℃伅鍒犻櫎API璋冪敤澶辫触锛�"); } } @@ -227,7 +231,7 @@ @Parameter(name = "online", description = "鏄惁鍦ㄧ嚎") @Parameter(name = "channelType", description = "璁惧/瀛愮洰褰�-> false/true") @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") - public ResponseEntity<PageInfo> subChannels(@PathVariable String deviceId, + public PageInfo<DeviceChannel> subChannels(@PathVariable String deviceId, @PathVariable String channelId, int page, int count, @@ -238,11 +242,10 @@ DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); if (deviceChannel == null) { PageInfo<DeviceChannel> deviceChannelPageResult = new PageInfo<>(); - return new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK); + return deviceChannelPageResult; } - PageInfo pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); - return new ResponseEntity<>(pageResult,HttpStatus.OK); + return storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); } /** @@ -255,9 +258,8 @@ @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @Parameter(name = "channel", description = "閫氶亾淇℃伅", required = true) @PostMapping("/channel/update/{deviceId}") - public ResponseEntity updateChannel(@PathVariable String deviceId,DeviceChannel channel){ + public void updateChannel(@PathVariable String deviceId,DeviceChannel channel){ deviceChannelService.updateChannel(deviceId, channel); - return new ResponseEntity<>(null,HttpStatus.OK); } /** @@ -271,11 +273,32 @@ @Parameter(name = "streamMode", description = "鏁版嵁娴佷紶杈撴ā寮�, 鍙栧�硷細" + "UDP锛坲dp浼犺緭锛夛紝TCP-ACTIVE锛坱cp涓诲姩妯″紡,鏆備笉鏀寔锛夛紝TCP-PASSIVE锛坱cp琚姩妯″紡锛�", required = true) @PostMapping("/transport/{deviceId}/{streamMode}") - public ResponseEntity updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ - Device device = storager.queryVideoDevice(deviceId); + public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ + Device device = deviceService.getDevice(deviceId); device.setStreamMode(streamMode); - deviceService.updateDevice(device); - return new ResponseEntity<>(null,HttpStatus.OK); + deviceService.updateCustomDevice(device); + } + + /** + * 娣诲姞璁惧淇℃伅 + * @param device 璁惧淇℃伅 + * @return + */ + @Operation(summary = "娣诲姞璁惧淇℃伅") + @Parameter(name = "device", description = "璁惧", required = true) + @PostMapping("/device/add/") + public void addDevice(Device device){ + + if (device == null || device.getDeviceId() == null) { + throw new ControllerException(ErrorCode.ERROR400); + } + + // 鏌ョ湅deviceId鏄惁瀛樺湪 + boolean exist = deviceService.isExist(device.getDeviceId()); + if (exist) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧缂栧彿宸插瓨鍦�"); + } + deviceService.addDevice(device); } /** @@ -286,15 +309,11 @@ @Operation(summary = "鏇存柊璁惧淇℃伅") @Parameter(name = "device", description = "璁惧", required = true) @PostMapping("/device/update/") - public ResponseEntity<WVPResult<String>> updateDevice(Device device){ + public void updateDevice(Device device){ if (device != null && device.getDeviceId() != null) { - deviceService.updateDevice(device); + deviceService.updateCustomDevice(device); } - WVPResult<String> result = new WVPResult<>(); - result.setCode(0); - result.setMsg("success"); - return new ResponseEntity<>(result,HttpStatus.OK); } /** @@ -317,13 +336,18 @@ result.setResult(new ResponseEntity(String.format("璁惧%s涓嶅瓨鍦�", deviceId),HttpStatus.OK)); return result; } - cmder.deviceStatusQuery(device, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); + try { + cmder.deviceStatusQuery(device, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("鑾峰彇璁惧鐘舵�佸け璐ワ紝閿欒鐮侊細 %s, %s", event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 鑾峰彇璁惧鐘舵��: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } result.onTimeout(()->{ logger.warn(String.format("鑾峰彇璁惧鐘舵�佽秴鏃�")); // 閲婃斁rtpserver @@ -370,14 +394,19 @@ Device device = storager.queryVideoDevice(deviceId); String key = DeferredResultHolder.CALLBACK_CMD_ALARM + deviceId; String uuid = UUID.randomUUID().toString(); - cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { - RequestMessage msg = new RequestMessage(); - msg.setId(uuid); - msg.setKey(key); - msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); - resultHolder.invokeResult(msg); - }); - DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); + try { + cmder.alarmInfoQuery(device, startPriority, endPriority, alarmMethod, alarmType, startTime, endTime, event -> { + RequestMessage msg = new RequestMessage(); + msg.setId(uuid); + msg.setKey(key); + msg.setData(String.format("璁惧鎶ヨ鏌ヨ澶辫触锛岄敊璇爜锛� %s, %s",event.statusCode, event.msg)); + resultHolder.invokeResult(msg); + }); + } catch (InvalidArgumentException | SipException | ParseException e) { + logger.error("[鍛戒护鍙戦�佸け璐 璁惧鎶ヨ鏌ヨ: {}", e.getMessage()); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage()); + } + DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String >> (3 * 1000L); result.onTimeout(()->{ logger.warn(String.format("璁惧鎶ヨ鏌ヨ瓒呮椂")); // 閲婃斁rtpserver @@ -402,7 +431,8 @@ wvpResult.setCode(-1); wvpResult.setMsg("鍚屾灏氭湭寮�濮�"); }else { - wvpResult.setCode(0); + wvpResult.setCode(ErrorCode.SUCCESS.getCode()); + wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); wvpResult.setData(channelSyncStatus); if (channelSyncStatus.getErrorMsg() != null) { wvpResult.setMsg(channelSyncStatus.getErrorMsg()); @@ -414,24 +444,20 @@ @GetMapping("/{deviceId}/subscribe_info") @Operation(summary = "鑾峰彇璁惧鐨勮闃呯姸鎬�") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) - public WVPResult<Map<String, String>> getSubscribeInfo(@PathVariable String deviceId) { + public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { Set<String> allKeys = dynamicTask.getAllKeys(); - Map<String, String> dialogStateMap = new HashMap<>(); + Map<String, Integer> dialogStateMap = new HashMap<>(); for (String key : allKeys) { if (key.startsWith(deviceId)) { ISubscribeTask subscribeTask = (ISubscribeTask)dynamicTask.get(key); - DialogState dialogState = subscribeTask.getDialogState(); - if (dialogState == null) { - continue; - } if (subscribeTask instanceof CatalogSubscribeTask) { - dialogStateMap.put("catalog", dialogState.toString()); + dialogStateMap.put("catalog", 1); }else if (subscribeTask instanceof MobilePositionSubscribeTask) { - dialogStateMap.put("mobilePosition", dialogState.toString()); + dialogStateMap.put("mobilePosition", 1); } } } - WVPResult<Map<String, String>> wvpResult = new WVPResult<>(); + WVPResult<Map<String, Integer>> wvpResult = new WVPResult<>(); wvpResult.setCode(0); wvpResult.setData(dialogStateMap); return wvpResult; @@ -441,12 +467,16 @@ @Operation(summary = "璇锋眰鎴浘") @Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true) @Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true) - public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId) { + @Parameter(name = "mark", description = "鏍囪瘑", required = false) + public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) { try { - final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + ".jpg").toPath()); + final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + (mark == null? ".jpg": ("_" + mark + ".jpg"))).toPath()); resp.setContentType(MediaType.IMAGE_PNG_VALUE); + ServletOutputStream outputStream = resp.getOutputStream(); IOUtils.copy(in, resp.getOutputStream()); + in.close(); + outputStream.close(); } catch (IOException e) { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); } @@ -502,7 +532,6 @@ return new ResponseEntity<>(pageInfo,HttpStatus.OK); } - /** * 鏌ヨ鍥芥爣鏍戜笅鐨勯�氶亾 * @param deviceId 璁惧ID @@ -518,7 +547,6 @@ @Parameter(name = "count", description = "姣忛〉鏉℃暟", required = true) @GetMapping("/tree/channel/{deviceId}") public ResponseEntity<PageInfo> getChannelInTreeNode(@PathVariable String deviceId, @RequestParam(required = false) String parentId, int page, int count){ - if (page <= 0) { page = 1; -- Gitblit v1.8.0