diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java index 39e121fdf..4d302fec4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java @@ -150,6 +150,9 @@ public class CommonGBChannel { @Schema(description = "更新时间") private String updateTime; + @Schema(description = "流唯一编号,存在表示正在直播") + private String streamId; + public String encode(String serverDeviceId) { return encode(null, serverDeviceId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonRecordInfo.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonRecordInfo.java new file mode 100644 index 000000000..9f2efa913 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonRecordInfo.java @@ -0,0 +1,14 @@ +package com.genersoft.iot.vmp.gb28181.bean; + +import lombok.Data; + +@Data +public class CommonRecordInfo { + + // 开始时间 + private String startTime; + + // 结束时间 + private String endTime; + +} diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java index 699d18d50..94010da63 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java @@ -179,9 +179,6 @@ public class DeviceChannel extends CommonGBChannel { @Schema(description = "子设备数") private int subCount; - @Schema(description = "流唯一编号,存在表示正在直播") - private String streamId; - @Schema(description = "是否含有音频") private boolean hasAudio; diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java index 452e13886..c6853330f 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java @@ -3,16 +3,20 @@ package com.genersoft.iot.vmp.gb28181.bean; import com.genersoft.iot.vmp.utils.DateUtil; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import java.time.Instant; import java.time.temporal.TemporalAccessor; /** - * @description:设备录像bean + * @description:设备录像bean * @author: swwheihei - * @date: 2020年5月8日 下午2:06:54 + * @date: 2020年5月8日 下午2:06:54 */ +@Setter +@Getter @Schema(description = "设备录像详情") public class RecordItem implements Comparable{ @@ -46,87 +50,7 @@ public class RecordItem implements Comparable{ @Schema(description = "录像触发者ID(可选)") private String recorderId; - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - public String getStartTime() { - return startTime; - } - - public void setStartTime(String startTime) { - this.startTime = startTime; - } - - public String getEndTime() { - return endTime; - } - - public void setEndTime(String endTime) { - this.endTime = endTime; - } - - public int getSecrecy() { - return secrecy; - } - - public void setSecrecy(int secrecy) { - this.secrecy = secrecy; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getRecorderId() { - return recorderId; - } - - public void setRecorderId(String recorderId) { - this.recorderId = recorderId; - } - - public String getFileSize() { - return fileSize; - } - - public void setFileSize(String fileSize) { - this.fileSize = fileSize; - } - - @Override + @Override public int compareTo(@NotNull RecordItem recordItem) { TemporalAccessor startTimeNow = DateUtil.formatter.parse(startTime); TemporalAccessor startTimeParam = DateUtil.formatter.parse(recordItem.getStartTime()); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelController.java index 4997cbe49..d30a107f7 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelController.java @@ -2,11 +2,9 @@ package com.genersoft.iot.vmp.gb28181.controller; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.conf.security.JwtUtils; -import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; -import com.genersoft.iot.vmp.gb28181.bean.DeviceType; -import com.genersoft.iot.vmp.gb28181.bean.IndustryCodeType; -import com.genersoft.iot.vmp.gb28181.bean.NetworkIdentificationType; +import com.genersoft.iot.vmp.gb28181.bean.*; import com.genersoft.iot.vmp.gb28181.controller.bean.ChannelToGroupByGbDeviceParam; import com.genersoft.iot.vmp.gb28181.controller.bean.ChannelToGroupParam; import com.genersoft.iot.vmp.gb28181.controller.bean.ChannelToRegionByGbDeviceParam; @@ -17,6 +15,8 @@ import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.ErrorCallback; import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; +import com.genersoft.iot.vmp.utils.DateUtil; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; @@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest; import java.net.MalformedURLException; import java.net.URL; import java.util.List; +import java.util.concurrent.TimeUnit; @Tag(name = "全局通道管理") @@ -276,7 +277,7 @@ public class ChannelController { @Operation(summary = "播放通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) @GetMapping("/play") - public DeferredResult> deleteChannelToGroupByGbDevice(HttpServletRequest request, Integer channelId){ + public DeferredResult> play(HttpServletRequest request, Integer channelId){ Assert.notNull(channelId,"参数异常"); CommonGBChannel channel = channelService.getOne(channelId); Assert.notNull(channel, "通道不存在"); @@ -315,4 +316,152 @@ public class ChannelController { channelPlayService.play(channel, null, userSetting.getRecordSip(), callback); return result; } + + @Operation(summary = "停止播放通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @GetMapping("/play/stop") + public void stopPlay(Integer channelId){ + Assert.notNull(channelId,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.stopPlay(channel, channel.getStreamId()); + } + + @Operation(summary = "录像查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "startTime", description = "开始时间", required = true) + @Parameter(name = "endTime", description = "结束时间", required = true) + @GetMapping("/playback/query") + public DeferredResult>> queryRecord(Integer channelId, String startTime, String endTime){ + + DeferredResult>> result = new DeferredResult<>(Long.valueOf(userSetting.getRecordInfoTimeout()), TimeUnit.MILLISECONDS); + if (!DateUtil.verification(startTime, DateUtil.formatter)){ + throw new ControllerException(ErrorCode.ERROR100.getCode(), "startTime格式为" + DateUtil.PATTERN); + } + if (!DateUtil.verification(endTime, DateUtil.formatter)){ + throw new ControllerException(ErrorCode.ERROR100.getCode(), "endTime格式为" + DateUtil.PATTERN); + } + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + + channelPlayService.queryRecord(channel, startTime, endTime, (code, msg, data) -> { + WVPResult> wvpResult = new WVPResult<>(); + wvpResult.setCode(code); + wvpResult.setMsg(msg); + wvpResult.setData(data); + result.setResult(wvpResult); + }); + result.onTimeout(()->{ + WVPResult> wvpResult = new WVPResult<>(); + wvpResult.setCode(ErrorCode.ERROR100.getCode()); + wvpResult.setMsg("timeout"); + result.setResult(wvpResult); + }); + return result; + } + + @Operation(summary = "录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "startTime", description = "开始时间", required = true) + @Parameter(name = "endTime", description = "结束时间", required = true) + @GetMapping("/playback") + public DeferredResult> playback(HttpServletRequest request, Integer channelId, String startTime, String endTime){ + Assert.notNull(channelId,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + + DeferredResult> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue()); + + ErrorCallback callback = (code, msg, streamInfo) -> { + if (code == InviteErrorCode.SUCCESS.getCode()) { + WVPResult wvpResult = WVPResult.success(); + if (streamInfo != null) { + if (userSetting.getUseSourceIpAsStreamIp()) { + streamInfo=streamInfo.clone();//深拷贝 + String host; + try { + URL url=new URL(request.getRequestURL().toString()); + host=url.getHost(); + } catch (MalformedURLException e) { + host=request.getLocalAddr(); + } + streamInfo.changeStreamIp(host); + } + if (!ObjectUtils.isEmpty(streamInfo.getMediaServer().getTranscodeSuffix()) + && !"null".equalsIgnoreCase(streamInfo.getMediaServer().getTranscodeSuffix())) { + streamInfo.setStream(streamInfo.getStream() + "_" + streamInfo.getMediaServer().getTranscodeSuffix()); + } + wvpResult.setData(new StreamContent(streamInfo)); + }else { + wvpResult.setCode(code); + wvpResult.setMsg(msg); + } + + result.setResult(wvpResult); + }else { + result.setResult(WVPResult.fail(code, msg)); + } + }; + channelPlayService.playback(channel, DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(startTime), + DateUtil.yyyy_MM_dd_HH_mm_ssToTimestamp(endTime), callback); + return result; + } + + @Operation(summary = "停止录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @GetMapping("/playback/stop") + public void stopPlayback(Integer channelId, String stream){ + Assert.notNull(channelId,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.stopPlayback(channel, stream); + } + + @Operation(summary = "暂停录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @GetMapping("/playback/pause") + public void pausePlayback(Integer channelId, String stream){ + Assert.notNull(channelId,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.playbackPause(channel, stream); + } + + @Operation(summary = "恢复录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @GetMapping("/playback/resume") + public void resumePlayback(Integer channelId, String stream){ + Assert.notNull(channelId,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.playbackResume(channel, stream); + } + + @Operation(summary = "拖动录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @Parameter(name = "seekTime", description = "将要播放的时间", required = true) + @GetMapping("/playback/seek") + public void seekPlayback(Integer channelId, String stream, Long seekTime){ + Assert.notNull(channelId,"参数异常"); + Assert.notNull(seekTime,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.playbackSeek(channel, stream, seekTime); + } + + @Operation(summary = "拖动录像回放", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "channelId", description = "通道ID", required = true) + @Parameter(name = "stream", description = "流ID", required = true) + @Parameter(name = "speed", description = "倍速", required = true) + @GetMapping("/playback/speed") + public void seekPlayback(Integer channelId, String stream, Double speed){ + Assert.notNull(channelId,"参数异常"); + Assert.notNull(speed,"参数异常"); + CommonGBChannel channel = channelService.getOne(channelId); + Assert.notNull(channel, "通道不存在"); + channelPlayService.playbackSpeed(channel, stream, speed); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java index 1dc6e42e5..0ecc8261d 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java @@ -1,6 +1,5 @@ package com.genersoft.iot.vmp.gb28181.controller; -import com.genersoft.iot.vmp.common.InviteInfo; import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.UserSetting; @@ -26,6 +25,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -191,23 +191,14 @@ public class PlaybackController { } } - @Operation(summary = "回放拖动播放", security = @SecurityRequirement(name = JwtUtils.HEADER)) @Parameter(name = "streamId", description = "回放流ID", required = true) @Parameter(name = "seekTime", description = "拖动偏移量,单位s", required = true) @GetMapping("/seek/{streamId}/{seekTime}") - public void playSeek(@PathVariable String streamId, @PathVariable long seekTime) { + public void playbackSeek(@PathVariable String streamId, @PathVariable long seekTime) { log.info("playSeek: "+streamId+", "+seekTime); - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(InviteSessionType.PLAYBACK, streamId); - - if (null == inviteInfo || inviteInfo.getStreamInfo() == null) { - log.warn("streamId不存在!"); - throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); - } - Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId()); - DeviceChannel channel = channelService.getOneById(inviteInfo.getChannelId()); try { - cmder.playSeekCmd(device, channel, inviteInfo.getStreamInfo(), seekTime); + playService.playbackSeek(streamId, seekTime); } catch (InvalidArgumentException | ParseException | SipException e) { throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); } @@ -218,17 +209,10 @@ public class PlaybackController { @Parameter(name = "speed", description = "倍速0.25 0.5 1、2、4、8", required = true) @GetMapping("/speed/{streamId}/{speed}") public void playSpeed(@PathVariable String streamId, @PathVariable Double speed) { + Assert.notNull(speed, "倍速不存在"); log.info("playSpeed: "+streamId+", "+speed); - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(InviteSessionType.PLAYBACK, streamId); - - if (null == inviteInfo || inviteInfo.getStreamInfo() == null) { - log.warn("streamId不存在!"); - throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); - } - Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId()); - DeviceChannel channel = channelService.getOneById(inviteInfo.getChannelId()); try { - cmder.playSpeedCmd(device, channel, inviteInfo.getStreamInfo(), speed); + playService.playbackSpeed(streamId, speed); } catch (InvalidArgumentException | ParseException | SipException e) { throw new ControllerException(ErrorCode.ERROR100.getCode(), e.getMessage()); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java index f8e09f2a4..05873fa53 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java @@ -580,4 +580,7 @@ public interface CommonGBChannelMapper { @SelectProvider(type = ChannelProvider.class, method = "queryOnlineListsByGbDeviceId") List queryOnlineListsByGbDeviceId(@Param("deviceId") int deviceId); + + @Update("UPDATE wvp_device_channel SET stream_id = #{stream} where id = #{gbId}") + void updateStream(int gbId, String stream); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java index 6259ee978..4f0340eb9 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java @@ -16,6 +16,7 @@ public class ChannelProvider { " data_device_id,\n" + " create_time,\n" + " update_time,\n" + + " stream_id,\n" + " record_plan_id,\n" + " coalesce(gb_device_id, device_id) as gb_device_id,\n" + " coalesce(gb_name, name) as gb_name,\n" + @@ -60,6 +61,7 @@ public class ChannelProvider { " wdc.data_device_id,\n" + " wdc.create_time,\n" + " wdc.update_time,\n" + + " wdc.stream_id,\n" + " wdc.record_plan_id,\n" + " coalesce(wdc.gb_device_id, wdc.device_id) as gb_device_id,\n" + " coalesce(wdc.gb_name, wdc.name) as gb_name,\n" + diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelPlayService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelPlayService.java index 07214651a..754acd18d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelPlayService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelPlayService.java @@ -3,10 +3,13 @@ package com.genersoft.iot.vmp.gb28181.service; import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; +import com.genersoft.iot.vmp.gb28181.bean.CommonRecordInfo; import com.genersoft.iot.vmp.gb28181.bean.InviteMessageInfo; import com.genersoft.iot.vmp.gb28181.bean.Platform; import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import java.util.List; + public interface IGbChannelPlayService { void startInvite(CommonGBChannel channel, InviteMessageInfo inviteInfo, Platform platform, ErrorCallback callback); @@ -29,4 +32,10 @@ public interface IGbChannelPlayService { void playbackPause(CommonGBChannel channel, String streamId); void playbackResume(CommonGBChannel channel, String streamId); + + void playbackSeek(CommonGBChannel channel, String stream, long seekTime); + + void playbackSpeed(CommonGBChannel channel, String stream, Double speed); + + void queryRecord(CommonGBChannel channel, String startTime, String endTime, ErrorCallback> callback); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java index 0aa27dd71..4e7497bc3 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java @@ -1,7 +1,6 @@ package com.genersoft.iot.vmp.gb28181.service; import com.genersoft.iot.vmp.gb28181.bean.*; -import com.genersoft.iot.vmp.service.bean.ErrorCallback; import com.genersoft.iot.vmp.service.bean.GPSMsgInfo; import com.genersoft.iot.vmp.streamPush.bean.StreamPush; import com.github.pagehelper.PageInfo; @@ -87,8 +86,6 @@ public interface IGbChannelService { PageInfo queryList(int page, int count, String query, Boolean online, Boolean hasRecordPlan, Integer channelType); - void queryRecordInfo(CommonGBChannel channel, String startTime, String endTime, ErrorCallback callback); - PageInfo queryListByCivilCodeForUnusual(int page, int count, String query, Boolean online, Integer channelType); void clearChannelCivilCode(Boolean all, List channelIds); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlayService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlayService.java index 3c94c63f6..32c3af615 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlayService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlayService.java @@ -52,6 +52,10 @@ public interface IPlayService { void playbackResume(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException; + void playbackSeek(String streamId, long seekTime) throws InvalidArgumentException, ParseException, SipException; + + void playbackSpeed(String streamId, double speed) throws InvalidArgumentException, ParseException, SipException; + void startPushStream(SendRtpInfo sendRtpItem, DeviceChannel channel, SIPResponse sipResponse, Platform platform, CallIdHeader callIdHeader); void startSendRtpStreamFailHand(SendRtpInfo sendRtpItem, Platform platform, CallIdHeader callIdHeader); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlaybackService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlaybackService.java index c478501e1..b27114295 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlaybackService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlaybackService.java @@ -2,8 +2,11 @@ package com.genersoft.iot.vmp.gb28181.service; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; +import com.genersoft.iot.vmp.gb28181.bean.CommonRecordInfo; import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import java.util.List; + /** * 资源能力接入-录像回放 */ @@ -14,4 +17,12 @@ public interface ISourcePlaybackService { void stopPlayback(CommonGBChannel channel, String stream); void playbackPause(CommonGBChannel channel, String stream); + + void playbackResume(CommonGBChannel channel, String stream); + + void playbackSeek(CommonGBChannel channel, String stream, long seekTime); + + void playbackSpeed(CommonGBChannel channel, String stream, Double speed); + + void queryRecord(CommonGBChannel channel, String startTime, String endTime, ErrorCallback> callback); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelPlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelPlayServiceImpl.java index 9124ba1ec..6e43a2c8d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelPlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelPlayServiceImpl.java @@ -4,20 +4,20 @@ import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.enums.ChannelDataType; import com.genersoft.iot.vmp.conf.UserSetting; -import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; -import com.genersoft.iot.vmp.gb28181.bean.InviteMessageInfo; -import com.genersoft.iot.vmp.gb28181.bean.Platform; -import com.genersoft.iot.vmp.gb28181.bean.PlayException; +import com.genersoft.iot.vmp.gb28181.bean.*; +import com.genersoft.iot.vmp.gb28181.dao.CommonGBChannelMapper; import com.genersoft.iot.vmp.gb28181.service.*; import com.genersoft.iot.vmp.gb28181.service.IGbChannelPlayService; import com.genersoft.iot.vmp.gb28181.service.IPlayService; import com.genersoft.iot.vmp.jt1078.service.Ijt1078PlayService; import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.sip.message.Response; +import java.util.List; import java.util.Map; @Slf4j @@ -27,6 +27,9 @@ public class GbChannelPlayServiceImpl implements IGbChannelPlayService { @Autowired private UserSetting userSetting; + @Autowired + private CommonGBChannelMapper channelMapper; + @Autowired private Map sourcePlayServiceMap; @@ -94,7 +97,15 @@ public class GbChannelPlayServiceImpl implements IGbChannelPlayService { log.error("[点播通用通道] 类型编号: {} 不支持实时流预览", dataType); throw new PlayException(Response.BUSY_HERE, "channel not support"); } - sourceChannelPlayService.play(channel, platform, record, callback); + sourceChannelPlayService.play(channel, platform, record, (code, msg, data) -> { + if (code == InviteErrorCode.SUCCESS.getCode()) { + // 将流ID记录到数据库 + if (channel.getDataType() != ChannelDataType.GB28181) { + channelMapper.updateStream(channel.getGbId(), data.getStream()); + } + } + callback.run(code, msg, data); + }); } @Override public void playback(CommonGBChannel channel, Long startTime, Long stopTime, ErrorCallback callback) { @@ -184,6 +195,45 @@ public class GbChannelPlayServiceImpl implements IGbChannelPlayService { log.error("[点播通用通道] 类型编号: {} 不支持回放暂停恢复", dataType); throw new PlayException(Response.BUSY_HERE, "channel not support"); } - playbackService.playbackPause(channel, stream); + playbackService.playbackResume(channel, stream); + } + + @Override + public void playbackSeek(CommonGBChannel channel, String stream, long seekTime) { + log.info("[通用通道] 回放拖动播放, 类型: {}, 编号:{} stream:{}", channel.getDataType(), channel.getGbDeviceId(), stream); + Integer dataType = channel.getDataType(); + ISourcePlaybackService playbackService = sourcePlaybackServiceMap.get(ChannelDataType.PLAYBACK_SERVICE + dataType); + if (playbackService == null) { + // 通道数据异常 + log.error("[点播通用通道] 类型编号: {} 不支持回放暂停恢复", dataType); + throw new PlayException(Response.BUSY_HERE, "channel not support"); + } + playbackService.playbackSeek(channel, stream, seekTime); + } + + @Override + public void playbackSpeed(CommonGBChannel channel, String stream, Double speed) { + log.info("[通用通道] 回放倍速播放, 类型: {}, 编号:{} stream:{}", channel.getDataType(), channel.getGbDeviceId(), stream); + Integer dataType = channel.getDataType(); + ISourcePlaybackService playbackService = sourcePlaybackServiceMap.get(ChannelDataType.PLAYBACK_SERVICE + dataType); + if (playbackService == null) { + // 通道数据异常 + log.error("[点播通用通道] 类型编号: {} 不支持回放暂停恢复", dataType); + throw new PlayException(Response.BUSY_HERE, "channel not support"); + } + playbackService.playbackSpeed(channel, stream, speed); + } + + @Override + public void queryRecord(CommonGBChannel channel, String startTime, String endTime, ErrorCallback> callback) { + log.info("[通用通道] 录像查询, 类型: {}, 编号:{}", channel.getDataType(), channel.getGbDeviceId()); + Integer dataType = channel.getDataType(); + ISourcePlaybackService playbackService = sourcePlaybackServiceMap.get(ChannelDataType.PLAYBACK_SERVICE + dataType); + if (playbackService == null) { + // 通道数据异常 + log.error("[点播通用通道] 类型编号: {} 不支持回放暂停恢复", dataType); + throw new PlayException(Response.BUSY_HERE, "channel not support"); + } + playbackService.queryRecord(channel, startTime, endTime, callback); } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java index addb7a49e..ef3fbcf5f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java @@ -717,25 +717,6 @@ public class GbChannelServiceImpl implements IGbChannelService { return new PageInfo<>(all); } - @Override - public void queryRecordInfo(CommonGBChannel channel, String startTime, String endTime, ErrorCallback callback) { - if (channel.getDataType() == ChannelDataType.GB28181) { - deviceChannelService.queryRecordInfo(channel, startTime, endTime, callback); - } else if (channel.getDataType() == ChannelDataType.STREAM_PROXY) { - // 拉流代理 - log.warn("[下载通用通道录像] 不支持下载拉流代理的录像: {}({})", channel.getGbName(), channel.getGbDeviceId()); - throw new PlayException(Response.FORBIDDEN, "forbidden"); - } else if (channel.getDataType() == ChannelDataType.STREAM_PUSH) { - // 推流 - log.warn("[下载通用通道录像] 不支持下载推流的录像: {}({})", channel.getGbName(), channel.getGbDeviceId()); - throw new PlayException(Response.FORBIDDEN, "forbidden"); - } else { - // 通道数据异常 - log.error("[回放通用通道] 通道数据异常,无法识别通道来源: {}({})", channel.getGbName(), channel.getGbDeviceId()); - throw new PlayException(Response.SERVER_INTERNAL_ERROR, "server internal error"); - } - } - @Override public PageInfo queryListByCivilCodeForUnusual(int page, int count, String query, Boolean online, Integer channelType) { PageHelper.startPage(page, count); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java index 983eceb02..9039d27fd 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java @@ -1458,6 +1458,32 @@ public class PlayServiceImpl implements IPlayService { cmder.playResumeCmd(device, channel, inviteInfo.getStreamInfo()); } + @Override + public void playbackSeek(String streamId, long seekTime) throws InvalidArgumentException, ParseException, SipException { + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(InviteSessionType.PLAYBACK, streamId); + + if (null == inviteInfo || inviteInfo.getStreamInfo() == null) { + log.warn("streamId不存在!"); + throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); + } + Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId()); + DeviceChannel channel = deviceChannelService.getOneById(inviteInfo.getChannelId()); + cmder.playSeekCmd(device, channel, inviteInfo.getStreamInfo(), seekTime); + } + + @Override + public void playbackSpeed(String streamId, double speed) throws InvalidArgumentException, ParseException, SipException { + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(InviteSessionType.PLAYBACK, streamId); + + if (null == inviteInfo || inviteInfo.getStreamInfo() == null) { + log.warn("streamId不存在!"); + throw new ControllerException(ErrorCode.ERROR400.getCode(), "streamId不存在"); + } + Device device = deviceService.getDeviceByDeviceId(inviteInfo.getDeviceId()); + DeviceChannel channel = deviceChannelService.getOneById(inviteInfo.getChannelId()); + cmder.playSpeedCmd(device, channel, inviteInfo.getStreamInfo(), speed); + } + @Override public void startPushStream(SendRtpInfo sendRtpInfo, DeviceChannel channel, SIPResponse sipResponse, Platform platform, CallIdHeader callIdHeader) { // 开始发流 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlaybackServiceForGbImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlaybackServiceForGbImpl.java index a051df437..f72bcec8d 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlaybackServiceForGbImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlaybackServiceForGbImpl.java @@ -4,27 +4,36 @@ import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.enums.ChannelDataType; import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; +import com.genersoft.iot.vmp.gb28181.bean.CommonRecordInfo; import com.genersoft.iot.vmp.gb28181.bean.PlayException; +import com.genersoft.iot.vmp.gb28181.bean.RecordItem; +import com.genersoft.iot.vmp.gb28181.service.IDeviceChannelService; import com.genersoft.iot.vmp.gb28181.service.IPlayService; import com.genersoft.iot.vmp.gb28181.service.ISourcePlaybackService; import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.sip.message.Response; +import java.util.ArrayList; +import java.util.List; @Slf4j @Service(ChannelDataType.PLAYBACK_SERVICE + ChannelDataType.GB28181) public class SourcePlaybackServiceForGbImpl implements ISourcePlaybackService { @Autowired - private IPlayService deviceChannelPlayService; + private IPlayService playService; + + @Autowired + private IDeviceChannelService channelService; @Override public void playback(CommonGBChannel channel, Long startTime, Long stopTime, ErrorCallback callback) { try { - deviceChannelPlayService.playBack(channel, startTime, stopTime, callback); + playService.playBack(channel, startTime, stopTime, callback); } catch (PlayException e) { callback.run(e.getCode(), e.getMsg(), null); } catch (Exception e) { @@ -36,7 +45,7 @@ public class SourcePlaybackServiceForGbImpl implements ISourcePlaybackService { public void stopPlayback(CommonGBChannel channel, String stream) { // 国标通道 try { - deviceChannelPlayService.stop(InviteSessionType.PLAYBACK, channel, stream); + playService.stop(InviteSessionType.PLAYBACK, channel, stream); } catch (Exception e) { log.error("[停止点播失败] {}({})", channel.getGbName(), channel.getGbDeviceId(), e); } @@ -44,6 +53,60 @@ public class SourcePlaybackServiceForGbImpl implements ISourcePlaybackService { @Override public void playbackPause(CommonGBChannel channel, String stream) { + // 国标通道 + try { + playService.playbackPause(stream); + } catch (Exception e) { + log.error("[停止点播失败] {}({})", channel.getGbName(), channel.getGbDeviceId(), e); + } + } + @Override + public void playbackResume(CommonGBChannel channel, String stream) { + // 国标通道 + try { + playService.playbackPause(stream); + } catch (Exception e) { + log.error("[停止点播失败] {}({})", channel.getGbName(), channel.getGbDeviceId(), e); + } + } + + @Override + public void playbackSeek(CommonGBChannel channel, String stream, long seekTime) { + // 国标通道 + try { + playService.playbackPause(stream); + } catch (Exception e) { + log.error("[停止点播失败] {}({})", channel.getGbName(), channel.getGbDeviceId(), e); + } + } + + @Override + public void playbackSpeed(CommonGBChannel channel, String stream, Double speed) { + // 国标通道 + try { + playService.playbackSpeed(stream, speed); + } catch (Exception e) { + log.error("[停止点播失败] {}({})", channel.getGbName(), channel.getGbDeviceId(), e); + } + } + + @Override + public void queryRecord(CommonGBChannel channel, String startTime, String endTime, ErrorCallback> callback) { + channelService.queryRecordInfo(channel, startTime, endTime, (code, msg, data) -> { + if (code == ErrorCode.SUCCESS.getCode()) { + List recordList = data.getRecordList(); + List recordInfoList = new ArrayList<>(); + for (RecordItem recordItem : recordList) { + CommonRecordInfo recordInfo = new CommonRecordInfo(); + recordInfo.setStartTime(recordItem.getStartTime()); + recordInfo.setEndTime(recordItem.getEndTime()); + recordInfoList.add(recordInfo); + } + callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), recordInfoList); + }else { + callback.run(code, msg, null); + } + }); } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcChannelPlayController.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcChannelPlayController.java index c51f4fd55..acd8e8136 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcChannelPlayController.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/control/RedisRpcChannelPlayController.java @@ -117,7 +117,7 @@ public class RedisRpcChannelPlayController extends RpcController { } try { - channelService.queryRecordInfo(channel, startTime, endTime, (code, msg, data) ->{ + channelPlayService.queryRecord(channel, startTime, endTime, (code, msg, data) ->{ if (code == InviteErrorCode.SUCCESS.getCode()) { response.setStatusCode(code); response.setBody(data); diff --git a/web/src/api/commonChannel.js b/web/src/api/commonChannel.js index 6d8a8e436..0a9db6178 100644 --- a/web/src/api/commonChannel.js +++ b/web/src/api/commonChannel.js @@ -260,6 +260,15 @@ export function playChannel(channelId) { } }) } +export function stopPlayChannel(channelId) { + return request({ + method: 'get', + url: '/api/common/channel/play/stop', + params: { + channelId: channelId + } + }) +} // 前端控制 @@ -503,3 +512,77 @@ export function focus({ channelId, command, speed }) { } }) } +export function queryRecord({ channelId, startTime, endTime }) { + return request({ + method: 'get', + url: '/api/common/channel/playback/query', + params: { + channelId: channelId, + startTime: startTime, + endTime: endTime + } + }) +} +export function playback({ channelId, startTime, endTime }) { + return request({ + method: 'get', + url: '/api/common/channel/playback', + params: { + channelId: channelId, + startTime: startTime, + endTime: endTime + } + }) +} +export function stopPlayback({ channelId, stream }) { + return request({ + method: 'get', + url: '/api/common/channel/playback/stop', + params: { + channelId: channelId, + stream: stream + } + }) +} +export function pausePlayback({ channelId, stream}) { + return request({ + method: 'get', + url: '/api/common/channel/playback/pause', + params: { + channelId: channelId, + stream: stream + } + }) +} +export function resumePlayback({ channelId, stream}) { + return request({ + method: 'get', + url: '/api/common/channel/playback/resume', + params: { + channelId: channelId, + stream: stream + } + }) +} +export function seekPlayback({ channelId, stream, seekTime}) { + return request({ + method: 'get', + url: '/api/common/channel/playback/seek', + params: { + channelId: channelId, + stream: stream, + seekTime: seekTime + } + }) +} +export function speedPlayback({ channelId, stream, speed}) { + return request({ + method: 'get', + url: '/api/common/channel/playback/speed', + params: { + channelId: channelId, + stream: stream, + speed: speed + } + }) +} diff --git a/web/src/router/index.js b/web/src/router/index.js index e71ae8f2c..fd6f29702 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -70,12 +70,20 @@ export const constantRoutes = [ path: '/channel', component: Layout, redirect: '/channel', + onlyIndex: 0, children: [{ - path: '', + path: '/channel', name: 'Channel', component: () => import('@/views/channel/index'), - meta: {title: '通道列表', icon: 'channelManger'} - }] + meta: { title: '通道列表', icon: 'channelManger'} + }, + { + path: '/channel/record/:channelId', + name: 'CommonRecord', + component: () => import('@/views/channel/record'), + meta: { title: '设备录像' } + } + ] }, { path: '/device', diff --git a/web/src/store/modules/commonChanel.js b/web/src/store/modules/commonChanel.js index faa730328..32ad2357b 100644 --- a/web/src/store/modules/commonChanel.js +++ b/web/src/store/modules/commonChanel.js @@ -15,12 +15,22 @@ import { clearUnusualCivilCodeList, getIndustryList, getTypeList, - getNetworkIdentificationList, playChannel, addToRegion, deleteFromRegion, addToGroup, deleteFromGroup, getList, + getNetworkIdentificationList, + playChannel, + addToRegion, + deleteFromRegion, + addToGroup, + deleteFromGroup, + getList, addPointForCruise, - addPreset, auxiliary, + addPreset, + auxiliary, callPreset, deletePointForCruise, - deletePreset, focus, iris, ptz, + deletePreset, + focus, + iris, + ptz, queryPreset, setCruiseSpeed, setCruiseTime, @@ -30,7 +40,16 @@ import { startCruise, startScan, stopCruise, - stopScan, wiper, getAllForMap + stopScan, + wiper, + getAllForMap, + stopPlayChannel, + queryRecord, + playback, + stopPlayback, + pausePlayback, + resumePlayback, + seekPlayback, speedPlayback } from '@/api/commonChannel' const actions = { @@ -254,6 +273,16 @@ const actions = { }) }) }, + stopPlayChannel({ commit }, channelId) { + return new Promise((resolve, reject) => { + stopPlayChannel(channelId).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, getList({ commit }, param) { return new Promise((resolve, reject) => { getList(param).then(response => { @@ -473,6 +502,76 @@ const actions = { reject(error) }) }) + }, + queryRecord({ commit }, params) { + return new Promise((resolve, reject) => { + queryRecord(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + playback({ commit }, params) { + return new Promise((resolve, reject) => { + playback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + stopPlayback({ commit }, params) { + return new Promise((resolve, reject) => { + stopPlayback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + pausePlayback({ commit }, params) { + return new Promise((resolve, reject) => { + pausePlayback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + resumePlayback({ commit }, params) { + return new Promise((resolve, reject) => { + resumePlayback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + seekPlayback({ commit }, params) { + return new Promise((resolve, reject) => { + resumePlayback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + speedPlayback({ commit }, params) { + return new Promise((resolve, reject) => { + speedPlayback(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) } } diff --git a/web/src/views/channel/index.vue b/web/src/views/channel/index.vue index 32fed49d6..d77835e83 100755 --- a/web/src/views/channel/index.vue +++ b/web/src/views/channel/index.vue @@ -92,7 +92,6 @@ 编辑 + + + + 更多 + + + + 设备录像 + + 云端录像 + + + @@ -184,14 +196,14 @@ export default { updateLooper: 0, // 数据刷新轮训标志 searchStr: '', channelType: '', - online: '', + online: 'true', subStream: '', winHeight: window.innerHeight - 200, currentPage: this.defaultPage | 1, count: this.defaultCount | 15, total: 0, beforeUrl: '/device', - editId: null, + editId: null } }, mounted() { @@ -257,10 +269,8 @@ export default { }) }, queryRecords: function(itemData) { - const deviceId = this.deviceId - const channelId = itemData.deviceId - - this.$router.push(`/device/record/${deviceId}/${channelId}`) + const channelId = itemData.gbId + this.$router.push(`/channel/record/${channelId}`) }, queryCloudRecords: function(itemData) { const deviceId = this.deviceId @@ -268,42 +278,8 @@ export default { this.$router.push(`/cloudRecord/detail/rtp/${deviceId}_${channelId}`) }, - startRecord: function(itemData) { - this.$store.dispatch('device/deviceRecord', { - deviceId: this.deviceId, - channelId: itemData.deviceId, - recordCmdStr: 'Record' - }).then(data => { - this.$message.success({ - showClose: true, - message: '开始录像成功' - }) - }).catch((error) => { - this.$message.error({ - showClose: true, - message: error.message - }) - }) - }, - stopRecord: function(itemData) { - this.$store.dispatch('device/deviceRecord', { - deviceId: this.deviceId, - channelId: itemData.deviceId, - recordCmdStr: 'StopRecord' - }).then(data => { - this.$message.success({ - showClose: true, - message: '停止录像成功' - }) - }).catch((error) => { - this.$message.error({ - showClose: true, - message: error.message - }) - }) - }, stopDevicePush: function(itemData) { - this.$store.dispatch('play/stop', [itemData.deviceId]).then(data => { + this.$store.dispatch('commonChanel/stopPlayChannel', itemData.gbId).then(data => { this.initData() }).catch((error) => { if (error.response.status === 402) { // 已经停止过 @@ -334,93 +310,11 @@ export default { }, 1000) } }, - showDevice: function() { - // this.$router.push(this.beforeUrl).then(() => { - // this.initParam() - // this.initData() - // }) - this.$emit('show-device') - }, - changeSubchannel(itemData) { - this.beforeUrl = this.$router.currentRoute.path - - var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.deviceId}` - this.$router.push(url).then(() => { - this.searchStr = '' - this.channelType = '' - this.online = '' - this.initParam() - this.initData() - }) - }, - showSubChannels: function() { - this.$store.dispatch('device/querySubChannels', [ - { - page: this.currentPage, - count: this.count, - query: this.searchStr, - online: this.online, - channelType: this.channelType - }, - this.deviceId, - this.parentChannelId - ]) - .then(data => { - this.total = data.total - this.channelList = data.list - this.channelList.forEach(e => { - e.ptzType = e.ptzType + '' - }) - // 防止出现表格错位 - this.$nextTick(() => { - this.$refs.channelListTable.doLayout() - }) - }) - }, search: function() { this.currentPage = 1 this.total = 0 this.initData() }, - updateChannel: function(row) { - this.$store.dispatch('device/changeChannelAudio', { - channelId: row.gbId, - audio: row.hasAudio - }) - }, - subStreamChange: function() { - this.$confirm('确定重置所有通道的码流类型?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - this.$store.dispatch('device/updateChannelStreamIdentification', { - deviceDbId: this.device.id, - streamIdentification: this.subStream - }) - .then(data => { - this.initData() - }) - .finally(() => { - this.subStream = '' - }) - }).catch(() => { - this.subStream = '' - }) - }, - channelSubStreamChange: function(row) { - this.$store.dispatch('device/updateChannelStreamIdentification', { - deviceDbId: row.deviceDbId, - id: row.id, - streamIdentification: row.streamIdentification - }) - .then(data => { - this.initData() - }) - .finally(() => { - this.subStream = '' - }) - }, refresh: function() { this.initData() }, @@ -433,8 +327,14 @@ export default { closeEdit: function() { this.editId = null this.getChannelList() + }, + moreClick: function(command, itemData) { + if (command === 'records') { + this.queryRecords(itemData) + } else if (command === 'cloudRecords') { + this.queryCloudRecords(itemData) + } } - } } diff --git a/web/src/views/channel/record.vue b/web/src/views/channel/record.vue new file mode 100755 index 000000000..bd01a3235 --- /dev/null +++ b/web/src/views/channel/record.vue @@ -0,0 +1,622 @@ + + + + +