[1078] 适配新的数据库结构

This commit is contained in:
lin 2025-03-24 17:53:43 +08:00
parent fd5079a652
commit f0eb101130
17 changed files with 216 additions and 972 deletions

View File

@ -8,7 +8,9 @@ public enum ChannelDataType {
GB28181(1,"国标28181"), GB28181(1,"国标28181"),
STREAM_PUSH(2,"推流设备"), STREAM_PUSH(2,"推流设备"),
STREAM_PROXY(3,"拉流代理"); STREAM_PROXY(3,"拉流代理"),
JT_1078(200,"部标设备"),
;
public final int value; public final int value;

View File

@ -144,9 +144,6 @@ public class CommonGBChannel {
@Schema(description = "关联的设备ID") @Schema(description = "关联的设备ID")
private Integer dataDeviceId; private Integer dataDeviceId;
@Schema(description = "关联的部标标通道ID")
private Integer jtChannelId;
@Schema(description = "创建时间") @Schema(description = "创建时间")
private String createTime; private String createTime;

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.jt1078.bean; package com.genersoft.iot.vmp.jt1078.bean;
import com.genersoft.iot.vmp.common.enums.ChannelDataType;
import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ -38,6 +39,8 @@ public class JTChannel extends CommonGBChannel {
@Schema(description = "流信息") @Schema(description = "流信息")
private String stream; private String stream;
private Integer dataType = ChannelDataType.JT_1078.value;
@Override @Override
public String toString() { public String toString() {
return "JTChannel{" + return "JTChannel{" +
@ -58,7 +61,6 @@ public class JTChannel extends CommonGBChannel {
if (ObjectUtils.isEmpty(this.getGbName())) { if (ObjectUtils.isEmpty(this.getGbName())) {
this.setGbName(this.getName()); this.setGbName(this.getName());
} }
this.setJtChannelId(this.getId());
return this; return this;
} }

View File

@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.jt1078.controller; package com.genersoft.iot.vmp.jt1078.controller;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting; import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting;
import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.conf.exception.ControllerException;
@ -96,11 +97,12 @@ public class JT1078Controller {
jt1078PlayService.stopPlay(phoneNumber, channelId); jt1078PlayService.stopPlay(phoneNumber, channelId);
}); });
jt1078PlayService.play(phoneNumber, channelId, type, (code, msg, streamInfo) -> { jt1078PlayService.play(phoneNumber, channelId, type, wvpResult -> {
WVPResult<StreamContent> wvpResult = new WVPResult<>(); WVPResult<StreamContent> wvpResultForFinish = new WVPResult<>();
if (code == InviteErrorCode.SUCCESS.getCode()) { wvpResultForFinish.setCode(wvpResult.getCode());
wvpResult.setCode(ErrorCode.SUCCESS.getCode()); wvpResultForFinish.setMsg(wvpResult.getMsg());
wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); if (wvpResult.getCode() == InviteErrorCode.SUCCESS.getCode()) {
StreamInfo streamInfo = wvpResult.getData();
if (streamInfo != null) { if (streamInfo != null) {
if (userSetting.getUseSourceIpAsStreamIp()) { if (userSetting.getUseSourceIpAsStreamIp()) {
@ -114,16 +116,10 @@ public class JT1078Controller {
} }
streamInfo.changeStreamIp(host); streamInfo.changeStreamIp(host);
} }
wvpResult.setData(new StreamContent(streamInfo)); wvpResultForFinish.setData(new StreamContent(streamInfo));
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
result.setResult(wvpResult); result.setResult(wvpResultForFinish);
}); });
return result; return result;
@ -165,15 +161,16 @@ public class JT1078Controller {
jt1078PlayService.stopPlay(phoneNumber, channelId); jt1078PlayService.stopPlay(phoneNumber, channelId);
}); });
jt1078PlayService.startTalk(phoneNumber, channelId, app, stream, mediaServerId, onlySend, (code, msg, streamInfo) -> { jt1078PlayService.startTalk(phoneNumber, channelId, app, stream, mediaServerId, onlySend, wvpResult -> {
WVPResult<StreamContent> wvpResult = new WVPResult<>(); WVPResult<StreamContent> wvpResultForFinish = new WVPResult<>();
if (code == InviteErrorCode.SUCCESS.getCode()) { wvpResultForFinish.setCode(wvpResult.getCode());
wvpResult.setCode(ErrorCode.SUCCESS.getCode()); wvpResultForFinish.setMsg(wvpResult.getMsg());
wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); if (wvpResult.getCode() == InviteErrorCode.SUCCESS.getCode()) {
if (streamInfo != null) { if (wvpResult.getData() != null) {
StreamInfo streamInfo = wvpResult.getData();
if (userSetting.getUseSourceIpAsStreamIp()) { if (userSetting.getUseSourceIpAsStreamIp()) {
streamInfo=streamInfo.clone();//深拷贝 streamInfo = wvpResult.getData().clone();//深拷贝
String host; String host;
try { try {
URL url=new URL(request.getRequestURL().toString()); URL url=new URL(request.getRequestURL().toString());
@ -183,16 +180,10 @@ public class JT1078Controller {
} }
streamInfo.changeStreamIp(host); streamInfo.changeStreamIp(host);
} }
wvpResult.setData(new StreamContent(streamInfo)); wvpResultForFinish.setData(new StreamContent(streamInfo));
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
result.setResult(wvpResult); result.setResult(wvpResultForFinish);
}); });
return result; return result;
@ -293,15 +284,14 @@ public class JT1078Controller {
jt1078PlayService.stopPlay(phoneNumber, channelId); jt1078PlayService.stopPlay(phoneNumber, channelId);
}); });
jt1078PlayService.playback(phoneNumber, channelId, startTime, endTime,type, rate, playbackType, playbackSpeed, (code, msg, streamInfo) -> { jt1078PlayService.playback(phoneNumber, channelId, startTime, endTime,type, rate, playbackType, playbackSpeed, wvpResult -> {
WVPResult<StreamContent> wvpResult = new WVPResult<>(); WVPResult<StreamContent> wvpResultForFinish = new WVPResult<>();
if (code == InviteErrorCode.SUCCESS.getCode()) { wvpResultForFinish.setCode(wvpResult.getCode());
wvpResult.setCode(ErrorCode.SUCCESS.getCode()); wvpResultForFinish.setMsg(wvpResult.getMsg());
wvpResult.setMsg(ErrorCode.SUCCESS.getMsg()); if (wvpResult.getCode() == InviteErrorCode.SUCCESS.getCode()) {
StreamInfo streamInfo = wvpResult.getData();
if (streamInfo != null) { if (streamInfo != null) {
if (userSetting.getUseSourceIpAsStreamIp()) { if (userSetting.getUseSourceIpAsStreamIp()) {
streamInfo=streamInfo.clone();//深拷贝
String host; String host;
try { try {
URL url=new URL(request.getRequestURL().toString()); URL url=new URL(request.getRequestURL().toString());
@ -311,16 +301,10 @@ public class JT1078Controller {
} }
streamInfo.changeStreamIp(host); streamInfo.changeStreamIp(host);
} }
wvpResult.setData(new StreamContent(streamInfo)); wvpResultForFinish.setData(new StreamContent(streamInfo));
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
}else {
wvpResult.setCode(code);
wvpResult.setMsg(msg);
} }
result.setResult(wvpResult); result.setResult(wvpResultForFinish);
}); });
return result; return result;
@ -385,8 +369,8 @@ public class JT1078Controller {
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".mp4", "UTF-8")); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(phoneNumber + "_" + channelId + ".mp4", "UTF-8"));
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
service.recordDownload(phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType, (code, msg, data) -> { service.recordDownload(phoneNumber, channelId, startTime, endTime, alarmSign, mediaType, streamType, storageType, wvpResult -> {
String filePath = "ftp" + data; String filePath = "ftp" + wvpResult.getData();
File file = new File(filePath); File file = new File(filePath);
if (!file.exists()) { if (!file.exists()) {
log.warn("[下载录像] 收到通知时未找到录像文件: {}", filePath); log.warn("[下载录像] 收到通知时未找到录像文件: {}", filePath);

View File

@ -5,10 +5,10 @@ import java.util.Map;
public class JTChannelProvider { public class JTChannelProvider {
public final static String BASE_SQL = public final static String BASE_SQL =
"SELECT jc.*, jc.id as jt_channel_id, wdc.*, wdc.id as gb_id " + "SELECT jc.*, jc.id as data_device_id, wdc.*, wdc.id as gb_id " +
" from wvp_jt_channel jc " + " from wvp_jt_channel jc " +
" LEFT join wvp_device_channel wdc " + " LEFT join wvp_device_channel wdc " +
" on jc.id = wdc.jt_channel_id "; " on jc.id = wdc.data_device_id and wdc.data_type = 200 ";
public String selectChannelByChannelId(Map<String, Object> params ){ public String selectChannelByChannelId(Map<String, Object> params ){
StringBuilder sqlBuild = new StringBuilder(); StringBuilder sqlBuild = new StringBuilder();

View File

@ -1,69 +0,0 @@
package com.genersoft.iot.vmp.jt1078.event;
import com.genersoft.iot.vmp.common.GeneralCallback;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 管理callback回调支持设置超时时间未设置则按照五分钟超时自动移除
*/
@Component
public class CallbackManager {
private final long expire = 5 * 60 * 1000;
static class ManagerCallBack {
public String key;
public GeneralCallback<?> callback;
public long createTime;
public long expire;
}
private final Map<String, ManagerCallBack> allCallbacks = new ConcurrentHashMap<>();
public void addCallback(String key, GeneralCallback<?> callback) {
ManagerCallBack managerCallBack = new ManagerCallBack();
managerCallBack.callback = callback;
managerCallBack.key = key;
managerCallBack.createTime = System.currentTimeMillis();
managerCallBack.expire = expire;
allCallbacks.put(key, managerCallBack);
}
public void addCallback(String key, GeneralCallback<Object> callback, long timeout) {
ManagerCallBack managerCallBack = new ManagerCallBack();
managerCallBack.callback = callback;
managerCallBack.key = key;
managerCallBack.createTime = System.currentTimeMillis();
managerCallBack.expire = timeout;
allCallbacks.put(key, managerCallBack);
}
public GeneralCallback<?> getCallback(String key){
ManagerCallBack managerCallBack = allCallbacks.get(key);
if (managerCallBack != null) {
return managerCallBack.callback;
}else {
return null;
}
}
public void removeCallback(String key){
allCallbacks.remove(key);
}
/**
* 对订阅数据进行过期清理
*/
@Scheduled(fixedRate=expire) //每5分钟执行一次
public void execute(){
for (ManagerCallBack callBack : allCallbacks.values()) {
if ((System.currentTimeMillis() - callBack.createTime - callBack.expire) > 0) {
allCallbacks.remove(callBack.key);
}
}
}
}

View File

@ -1,20 +1,20 @@
package com.genersoft.iot.vmp.jt1078.service; package com.genersoft.iot.vmp.jt1078.service;
import com.genersoft.iot.vmp.common.GeneralCallback; import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.bean.*;
import com.genersoft.iot.vmp.jt1078.proc.request.J1205; import com.genersoft.iot.vmp.jt1078.proc.request.J1205;
import com.github.pagehelper.PageInfo; import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import java.util.List; import java.util.List;
public interface Ijt1078PlayService { public interface Ijt1078PlayService {
JTMediaStreamType checkStreamFromJt(String stream); JTMediaStreamType checkStreamFromJt(String stream);
void play(String phoneNumber, Integer channelId, int type, GeneralCallback<StreamInfo> callback); void play(String phoneNumber, Integer channelId, int type, CommonCallback<WVPResult<StreamInfo>> callback);
void playback(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type, void playback(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type,
Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback<StreamInfo> callback); Integer rate, Integer playbackType, Integer playbackSpeed, CommonCallback<WVPResult<StreamInfo>> callback);
void stopPlay(String phoneNumber, Integer channelId); void stopPlay(String phoneNumber, Integer channelId);
@ -26,7 +26,7 @@ public interface Ijt1078PlayService {
void stopPlayback(String phoneNumber, Integer channelId); void stopPlayback(String phoneNumber, Integer channelId);
void startTalk(String phoneNumber, Integer channelId, String app, String stream, String mediaServerId, Boolean onlySend, GeneralCallback<StreamInfo> callback); void startTalk(String phoneNumber, Integer channelId, String app, String stream, String mediaServerId, Boolean onlySend, CommonCallback<WVPResult<StreamInfo>> callback);
void stopTalk(String phoneNumber, Integer channelId); void stopTalk(String phoneNumber, Integer channelId);

View File

@ -1,9 +1,10 @@
package com.genersoft.iot.vmp.jt1078.service; package com.genersoft.iot.vmp.jt1078.service;
import com.genersoft.iot.vmp.common.GeneralCallback; import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.bean.*;
import com.genersoft.iot.vmp.jt1078.proc.request.J1205; import com.genersoft.iot.vmp.jt1078.proc.request.J1205;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import java.util.List; import java.util.List;
@ -32,7 +33,7 @@ public interface Ijt1078Service {
void wiper(String phoneNumber, Integer channelId, String command); void wiper(String phoneNumber, Integer channelId, String command);
JTDeviceConfig queryConfig(String phoneNumber, String[] params, GeneralCallback<StreamInfo> callback); JTDeviceConfig queryConfig(String phoneNumber, String[] params, CommonCallback<WVPResult<StreamInfo>> callback);
void setConfig(String phoneNumber, JTDeviceConfig config); void setConfig(String phoneNumber, JTDeviceConfig config);
@ -100,7 +101,7 @@ public interface Ijt1078Service {
void changeStreamType(String phoneNumber, Integer channelId, Integer streamType); void changeStreamType(String phoneNumber, Integer channelId, Integer streamType);
void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, GeneralCallback<String> fileCallback); void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, CommonCallback<WVPResult<String>> fileCallback);
PageInfo<JTChannel> getChannelList(int page, int count, int deviceId, String query); PageInfo<JTChannel> getChannelList(int page, int count, int deviceId, String query);

View File

@ -1,6 +1,6 @@
package com.genersoft.iot.vmp.jt1078.service.impl; package com.genersoft.iot.vmp.jt1078.service.impl;
import com.genersoft.iot.vmp.common.GeneralCallback; import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.DynamicTask;
@ -10,8 +10,6 @@ import com.genersoft.iot.vmp.conf.ftpServer.FtpSetting;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo;
import com.genersoft.iot.vmp.jt1078.bean.*; import com.genersoft.iot.vmp.jt1078.bean.*;
import com.genersoft.iot.vmp.jt1078.cmd.JT1078Template; import com.genersoft.iot.vmp.jt1078.cmd.JT1078Template;
import com.genersoft.iot.vmp.jt1078.dao.JTChannelMapper;
import com.genersoft.iot.vmp.jt1078.dao.JTTerminalMapper;
import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent; import com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent;
import com.genersoft.iot.vmp.jt1078.proc.request.J1205; import com.genersoft.iot.vmp.jt1078.proc.request.J1205;
import com.genersoft.iot.vmp.jt1078.proc.response.*; import com.genersoft.iot.vmp.jt1078.proc.response.*;
@ -35,6 +33,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.MediaServerUtils; import com.genersoft.iot.vmp.utils.MediaServerUtils;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -160,10 +159,10 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
} }
} }
private final Map<String, List<GeneralCallback<StreamInfo>>> inviteErrorCallbackMap = new ConcurrentHashMap<>(); private final Map<String, List<CommonCallback<WVPResult<StreamInfo>>>> inviteErrorCallbackMap = new ConcurrentHashMap<>();
@Override @Override
public void play(String phoneNumber, Integer channelId, int type, GeneralCallback<StreamInfo> callback) { public void play(String phoneNumber, Integer channelId, int type, CommonCallback<WVPResult<StreamInfo>> callback) {
JTDevice device = jt1078Service.getDevice(phoneNumber); JTDevice device = jt1078Service.getDevice(phoneNumber);
if (device == null) { if (device == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备不存在"); throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备不存在");
@ -175,7 +174,7 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
} }
// 检查流是否已经存在存在则返回 // 检查流是否已经存在存在则返回
String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAY + phoneNumber + ":" + channelId; String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAY + phoneNumber + ":" + channelId;
List<GeneralCallback<StreamInfo>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>()); List<CommonCallback<WVPResult<StreamInfo>>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>());
errorCallbacks.add(callback); errorCallbacks.add(callback);
StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey);
if (streamInfo != null) { if (streamInfo != null) {
@ -185,8 +184,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServer, "rtp", streamInfo.getStream()); MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServer, "rtp", streamInfo.getStream());
if (mediaInfo != null) { if (mediaInfo != null) {
log.info("[1078-点播] 点播已经存在,直接返回, phoneNumber {} channelId {}", phoneNumber, channelId); log.info("[1078-点播] 点播已经存在,直接返回, phoneNumber {} channelId {}", phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo));
} }
return; return;
} }
@ -197,8 +196,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
String stream = "jt_" + phoneNumber + "_" + channelId; String stream = "jt_" + phoneNumber + "_" + channelId;
MediaServer mediaServer = mediaServerService.getMediaServerForMinimumLoad(null); MediaServer mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
if (mediaServer == null) { if (mediaServer == null) {
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo); errorCallback.run(new WVPResult<>(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo));
} }
return; return;
} }
@ -210,11 +209,11 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
// TODO 发送9105 实时音视频传输状态通知 通知丢包率 // TODO 发送9105 实时音视频传输状态通知 通知丢包率
StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId); StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
if (errorCallback == null) { if (errorCallback == null) {
continue; continue;
} }
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info));
} }
subscribe.removeSubscribe(hook); subscribe.removeSubscribe(hook);
redisTemplate.opsForValue().set(playKey, info); redisTemplate.opsForValue().set(playKey, info);
@ -240,9 +239,9 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
// 设置超时监听 // 设置超时监听
dynamicTask.startDelay(playKey, () -> { dynamicTask.startDelay(playKey, () -> {
log.info("[1078-点播] 超时, phoneNumber {} channelId {}", phoneNumber, channelId); log.info("[1078-点播] 超时, phoneNumber {} channelId {}", phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(), errorCallback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(),
InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null); InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null));
} }
mediaServerService.closeRTPServer(mediaServer, stream); mediaServerService.closeRTPServer(mediaServer, stream);
subscribe.removeSubscribe(hook); subscribe.removeSubscribe(hook);
@ -271,10 +270,10 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAY + phoneNumber + ":" + channelId; String playKey = VideoManagerConstants.INVITE_INFO_1078_PLAY + phoneNumber + ":" + channelId;
dynamicTask.stop(playKey); dynamicTask.stop(playKey);
// 清理回调 // 清理回调
List<GeneralCallback<StreamInfo>> generalCallbacks = inviteErrorCallbackMap.get(playKey); List<CommonCallback<WVPResult<StreamInfo>>> generalCallbacks = inviteErrorCallbackMap.get(playKey);
if (generalCallbacks != null && !generalCallbacks.isEmpty()) { if (generalCallbacks != null && !generalCallbacks.isEmpty()) {
for (GeneralCallback<StreamInfo> callback : generalCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> callback : generalCallbacks) {
callback.run(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null); callback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null));
} }
} }
jt1078Template.checkTerminalStatus(phoneNumber); jt1078Template.checkTerminalStatus(phoneNumber);
@ -355,12 +354,12 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
@Override @Override
public void playback(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type, public void playback(String phoneNumber, Integer channelId, String startTime, String endTime, Integer type,
Integer rate, Integer playbackType, Integer playbackSpeed, GeneralCallback<StreamInfo> callback) { Integer rate, Integer playbackType, Integer playbackSpeed, CommonCallback<WVPResult<StreamInfo>> callback) {
log.info("[1078-回放] 回放,设备:{} 通道: {} 开始时间: {} 结束时间: {} 音视频类型: {} 码流类型: {} " + log.info("[1078-回放] 回放,设备:{} 通道: {} 开始时间: {} 结束时间: {} 音视频类型: {} 码流类型: {} " +
"回放方式: {} 快进或快退倍数: {}", phoneNumber, channelId, startTime, endTime, type, rate, playbackType, playbackSpeed); "回放方式: {} 快进或快退倍数: {}", phoneNumber, channelId, startTime, endTime, type, rate, playbackType, playbackSpeed);
// 检查流是否已经存在存在则返回 // 检查流是否已经存在存在则返回
String playbackKey = VideoManagerConstants.INVITE_INFO_1078_PLAYBACK + phoneNumber + ":" + channelId; String playbackKey = VideoManagerConstants.INVITE_INFO_1078_PLAYBACK + phoneNumber + ":" + channelId;
List<GeneralCallback<StreamInfo>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playbackKey, k -> new ArrayList<>()); List<CommonCallback<WVPResult<StreamInfo>>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playbackKey, k -> new ArrayList<>());
errorCallbacks.add(callback); errorCallbacks.add(callback);
String logInfo = String.format("phoneNumber:%s, channelId:%s, startTime:%s, endTime:%s", phoneNumber, channelId, startTime, endTime); String logInfo = String.format("phoneNumber:%s, channelId:%s, startTime:%s, endTime:%s", phoneNumber, channelId, startTime, endTime);
StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playbackKey); StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playbackKey);
@ -371,8 +370,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServer, "rtp", streamInfo.getStream()); MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServer, "rtp", streamInfo.getStream());
if (mediaInfo != null) { if (mediaInfo != null) {
log.info("[1078-回放] 回放已经存在,直接返回, logInfo {}", logInfo); log.info("[1078-回放] 回放已经存在,直接返回, logInfo {}", logInfo);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo));
} }
return; return;
} }
@ -385,8 +384,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
String stream = "jt_" + phoneNumber + "_" + channelId + "_" + startTimeParam + "_" + endTimeParam; String stream = "jt_" + phoneNumber + "_" + channelId + "_" + startTimeParam + "_" + endTimeParam;
MediaServer mediaServer = mediaServerService.getMediaServerForMinimumLoad(null); MediaServer mediaServer = mediaServerService.getMediaServerForMinimumLoad(null);
if (mediaServer == null) { if (mediaServer == null) {
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo); errorCallback.run(new WVPResult<>(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo));
} }
return; return;
} }
@ -397,11 +396,11 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
log.info("[1078-回放] 回放成功, logInfo {}", logInfo); log.info("[1078-回放] 回放成功, logInfo {}", logInfo);
StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId); StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
if (errorCallback == null) { if (errorCallback == null) {
continue; continue;
} }
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info));
} }
subscribe.removeSubscribe(hookSubscribe); subscribe.removeSubscribe(hookSubscribe);
redisTemplate.opsForValue().set(playbackKey, info); redisTemplate.opsForValue().set(playbackKey, info);
@ -409,9 +408,9 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
// 设置超时监听 // 设置超时监听
dynamicTask.startDelay(playbackKey, () -> { dynamicTask.startDelay(playbackKey, () -> {
log.info("[1078-回放] 回放超时, logInfo {}", logInfo); log.info("[1078-回放] 回放超时, logInfo {}", logInfo);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(), errorCallback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(),
InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null); InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null));
} }
}, userSetting.getPlayTimeout()); }, userSetting.getPlayTimeout());
@ -456,13 +455,13 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
mediaServerService.closeRTPServer(streamInfo.getMediaServer(), streamInfo.getStream()); mediaServerService.closeRTPServer(streamInfo.getMediaServer(), streamInfo.getStream());
} }
// 清理回调 // 清理回调
List<GeneralCallback<StreamInfo>> generalCallbacks = inviteErrorCallbackMap.get(playKey); List<CommonCallback<WVPResult<StreamInfo>>> generalCallbacks = inviteErrorCallbackMap.get(playKey);
if (generalCallbacks != null && !generalCallbacks.isEmpty()) { if (generalCallbacks != null && !generalCallbacks.isEmpty()) {
for (GeneralCallback<StreamInfo> callback : generalCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> callback : generalCallbacks) {
if (callback == null) { if (callback == null) {
continue; continue;
} }
callback.run(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null); callback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null));
} }
} }
} }
@ -484,7 +483,7 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
playbackControl(phoneNumber, channelId, 2, null, null); playbackControl(phoneNumber, channelId, 2, null, null);
} }
private Map<String, GeneralCallback<String>> fileUploadMap = new ConcurrentHashMap<>(); private Map<String, CommonCallback<WVPResult<String>>> fileUploadMap = new ConcurrentHashMap<>();
@EventListener @EventListener
public void onApplicationEvent(FtpUploadEvent event) { public void onApplicationEvent(FtpUploadEvent event) {
@ -495,9 +494,9 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
if (!event.getFileName().contains(key)) { if (!event.getFileName().contains(key)) {
return; return;
} }
GeneralCallback<String> callback = fileUploadMap.get(key); CommonCallback<WVPResult<String>> callback = fileUploadMap.get(key);
if (callback != null) { if (callback != null) {
callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), event.getFileName()); callback.run(new WVPResult<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), event.getFileName()));
fileUploadMap.remove(key); fileUploadMap.remove(key);
} }
}); });
@ -528,10 +527,10 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
@Override @Override
public void startTalk(String phoneNumber, Integer channelId, String app, String stream, String mediaServerId, Boolean onlySend, public void startTalk(String phoneNumber, Integer channelId, String app, String stream, String mediaServerId, Boolean onlySend,
GeneralCallback<StreamInfo> callback) { CommonCallback<WVPResult<StreamInfo>> callback) {
// 检查流是否已经存在存在则返回 // 检查流是否已经存在存在则返回
String playKey = VideoManagerConstants.INVITE_INFO_1078_TALK + phoneNumber + ":" + channelId; String playKey = VideoManagerConstants.INVITE_INFO_1078_TALK + phoneNumber + ":" + channelId;
List<GeneralCallback<StreamInfo>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>()); List<CommonCallback<WVPResult<StreamInfo>>> errorCallbacks = inviteErrorCallbackMap.computeIfAbsent(playKey, k -> new ArrayList<>());
errorCallbacks.add(callback); errorCallbacks.add(callback);
StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey); StreamInfo streamInfo = (StreamInfo) redisTemplate.opsForValue().get(playKey);
if (streamInfo != null) { if (streamInfo != null) {
@ -541,8 +540,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
String receiveStream = "jt_" + phoneNumber + "_" + channelId + "_talk"; String receiveStream = "jt_" + phoneNumber + "_" + channelId + "_talk";
MediaServer mediaServer = mediaServerService.getOne(mediaServerId); MediaServer mediaServer = mediaServerService.getOne(mediaServerId);
if (mediaServer == null) { if (mediaServer == null) {
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo); errorCallback.run(new WVPResult<>(InviteErrorCode.FAIL.getCode(), "未找到可用的媒体节点", streamInfo));
} }
return; return;
} }
@ -568,8 +567,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
log.info("[1078-对讲] 对讲成功, phoneNumber {} channelId {}", phoneNumber, channelId); log.info("[1078-对讲] 对讲成功, phoneNumber {} channelId {}", phoneNumber, channelId);
StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId); StreamInfo info = onPublishHandler(mediaServer, hookData, phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), info));
} }
subscribe.removeSubscribe(hook); subscribe.removeSubscribe(hook);
redisTemplate.opsForValue().set(playKey, info); redisTemplate.opsForValue().set(playKey, info);
@ -584,9 +583,9 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
// 设置超时监听 // 设置超时监听
dynamicTask.startDelay(playKey, () -> { dynamicTask.startDelay(playKey, () -> {
log.info("[1078-对讲] 超时, phoneNumber {} channelId {}", phoneNumber, channelId); log.info("[1078-对讲] 超时, phoneNumber {} channelId {}", phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(), errorCallback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode(),
InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null); InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getMsg(), null));
} }
}, userSetting.getPlayTimeout()); }, userSetting.getPlayTimeout());
@ -604,8 +603,8 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
jt1078Template.startLive(phoneNumber, j9101, 6); jt1078Template.startLive(phoneNumber, j9101, 6);
if (onlySend != null && onlySend) { if (onlySend != null && onlySend) {
log.info("[1078-对讲] 对讲成功, phoneNumber {} channelId {}", phoneNumber, channelId); log.info("[1078-对讲] 对讲成功, phoneNumber {} channelId {}", phoneNumber, channelId);
for (GeneralCallback<StreamInfo> errorCallback : errorCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> errorCallback : errorCallbacks) {
errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), null); errorCallback.run(new WVPResult<>(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), null));
} }
// 存储发流信息 // 存储发流信息
sendRtpServerService.update(sendRtpInfo); sendRtpServerService.update(sendRtpInfo);
@ -632,10 +631,10 @@ public class jt1078PlayServiceImpl implements Ijt1078PlayService {
mediaServerService.closeRTPServer(streamInfo.getMediaServer(), streamInfo.getStream()); mediaServerService.closeRTPServer(streamInfo.getMediaServer(), streamInfo.getStream());
} }
// 清理回调 // 清理回调
List<GeneralCallback<StreamInfo>> generalCallbacks = inviteErrorCallbackMap.get(playKey); List<CommonCallback<WVPResult<StreamInfo>>> generalCallbacks = inviteErrorCallbackMap.get(playKey);
if (generalCallbacks != null && !generalCallbacks.isEmpty()) { if (generalCallbacks != null && !generalCallbacks.isEmpty()) {
for (GeneralCallback<StreamInfo> callback : generalCallbacks) { for (CommonCallback<WVPResult<StreamInfo>> callback : generalCallbacks) {
callback.run(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null); callback.run(new WVPResult<>(InviteErrorCode.ERROR_FOR_FINISH.getCode(), InviteErrorCode.ERROR_FOR_FINISH.getMsg(), null));
} }
} }
} }

View File

@ -1,6 +1,6 @@
package com.genersoft.iot.vmp.jt1078.service.impl; package com.genersoft.iot.vmp.jt1078.service.impl;
import com.genersoft.iot.vmp.common.GeneralCallback; import com.genersoft.iot.vmp.common.CommonCallback;
import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.DynamicTask; import com.genersoft.iot.vmp.conf.DynamicTask;
@ -18,19 +18,13 @@ import com.genersoft.iot.vmp.jt1078.proc.response.*;
import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service; import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service;
import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent; import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent;
import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent; import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent;
import com.genersoft.iot.vmp.media.event.media.MediaNotFoundEvent;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
import com.genersoft.iot.vmp.service.ISendRtpServerService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.MediaServerUtils;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@ -154,7 +148,7 @@ public class jt1078ServiceImpl implements Ijt1078Service {
jtDeviceMapper.updateDeviceStatus(connected, phoneNumber); jtDeviceMapper.updateDeviceStatus(connected, phoneNumber);
} }
private Map<String, GeneralCallback<String>> fileUploadMap = new ConcurrentHashMap<>(); private Map<String, CommonCallback<WVPResult<String>>> fileUploadMap = new ConcurrentHashMap<>();
@EventListener @EventListener
public void onApplicationEvent(FtpUploadEvent event) { public void onApplicationEvent(FtpUploadEvent event) {
@ -165,16 +159,16 @@ public class jt1078ServiceImpl implements Ijt1078Service {
if (!event.getFileName().contains(key)) { if (!event.getFileName().contains(key)) {
return; return;
} }
GeneralCallback<String> callback = fileUploadMap.get(key); CommonCallback<WVPResult<String>> callback = fileUploadMap.get(key);
if (callback != null) { if (callback != null) {
callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), event.getFileName()); callback.run(new WVPResult<>(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), event.getFileName()));
fileUploadMap.remove(key); fileUploadMap.remove(key);
} }
}); });
} }
@Override @Override
public void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, GeneralCallback<String> fileCallback) { public void recordDownload(String phoneNumber, Integer channelId, String startTime, String endTime, Integer alarmSign, Integer mediaType, Integer streamType, Integer storageType, CommonCallback<WVPResult<String>> fileCallback) {
String filePath = UUID.randomUUID().toString(); String filePath = UUID.randomUUID().toString();
fileUploadMap.put(filePath, fileCallback); fileUploadMap.put(filePath, fileCallback);
dynamicTask.startDelay(filePath, ()->{ dynamicTask.startDelay(filePath, ()->{
@ -307,7 +301,7 @@ public class jt1078ServiceImpl implements Ijt1078Service {
} }
@Override @Override
public JTDeviceConfig queryConfig(String phoneNumber, String[] params, GeneralCallback<StreamInfo> callback) { public JTDeviceConfig queryConfig(String phoneNumber, String[] params, CommonCallback<WVPResult<StreamInfo>> callback) {
if (phoneNumber == null) { if (phoneNumber == null) {
return null; return null;
} }

View File

@ -80,6 +80,7 @@ Vue.prototype.$channelTypeList = {
1: {id: 1, name: "国标设备", style: {color: "#409eff", borderColor: "#b3d8ff"}}, 1: {id: 1, name: "国标设备", style: {color: "#409eff", borderColor: "#b3d8ff"}},
2: {id: 2, name: "推流设备", style: {color: "#67c23a", borderColor: "#c2e7b0"}}, 2: {id: 2, name: "推流设备", style: {color: "#67c23a", borderColor: "#c2e7b0"}},
3: {id: 3, name: "拉流代理", style: {color: "#e6a23c", borderColor: "#f5dab1"}}, 3: {id: 3, name: "拉流代理", style: {color: "#e6a23c", borderColor: "#f5dab1"}},
200: {id: 200, name: "部标设备", style: {color: "#179fa5", borderColor: "#a2dfe0"}},
}; };

View File

@ -462,36 +462,3 @@ create table IF NOT EXISTS wvp_record_plan_item
update_time character varying(50) update_time character varying(50)
); );
create table wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
authentication_code character varying(255),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
create table wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (terminal_db_id, channel_id)
);

View File

@ -462,36 +462,3 @@ create table IF NOT EXISTS wvp_record_plan_item
update_time character varying(50) update_time character varying(50)
); );
create table wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
authentication_code character varying(255),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
create table wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (terminal_db_id, channel_id)
);

View File

@ -1,342 +0,0 @@
/*建表*/
create table wvp_device (
id serial primary key ,
device_id character varying(50) not null ,
name character varying(255),
manufacturer character varying(255),
model character varying(255),
firmware character varying(255),
transport character varying(50),
stream_mode character varying(50),
on_line bool default false,
register_time character varying(50),
keepalive_time character varying(50),
ip character varying(50),
create_time character varying(50),
update_time character varying(50),
port integer,
expires integer,
subscribe_cycle_for_catalog integer DEFAULT 0,
subscribe_cycle_for_mobile_position integer DEFAULT 0,
mobile_position_submission_interval integer DEFAULT 5,
subscribe_cycle_for_alarm integer DEFAULT 0,
host_address character varying(50),
charset character varying(50),
ssrc_check bool default false,
geo_coord_sys character varying(50),
media_server_id character varying(50),
custom_name character varying(255),
sdp_ip character varying(50),
local_ip character varying(50),
password character varying(255),
as_message_channel bool default false,
keepalive_interval_time integer,
broadcast_push_after_ack bool default false,
constraint uk_device_device unique (device_id)
);
create table wvp_device_alarm (
id serial primary key ,
device_id character varying(50) not null,
channel_id character varying(50) not null,
alarm_priority character varying(50),
alarm_method character varying(50),
alarm_time character varying(50),
alarm_description character varying(255),
longitude double precision,
latitude double precision,
alarm_type character varying(50),
create_time character varying(50) not null
);
create table wvp_device_channel (
id serial primary key ,
channel_id character varying(50) not null,
name character varying(255),
custom_name character varying(255),
manufacture character varying(50),
model character varying(50),
owner character varying(50),
civil_code character varying(50),
block character varying(50),
address character varying(50),
parent_id character varying(50),
safety_way integer,
register_way integer,
cert_num character varying(50),
certifiable integer,
err_code integer,
end_time character varying(50),
secrecy character varying(50),
ip_address character varying(50),
port integer,
password character varying(255),
ptz_type integer,
custom_ptz_type integer,
status bool default false,
longitude double precision,
custom_longitude double precision,
latitude double precision,
custom_latitude double precision,
stream_id character varying(255),
device_id character varying(50) not null,
parental character varying(50),
has_audio bool default false,
create_time character varying(50) not null,
update_time character varying(50) not null,
sub_count integer,
longitude_gcj02 double precision,
latitude_gcj02 double precision,
longitude_wgs84 double precision,
latitude_wgs84 double precision,
business_group_id character varying(50),
gps_time character varying(50),
stream_identification character varying(50),
constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id)
);
create table wvp_device_mobile_position (
id serial primary key,
device_id character varying(50) not null,
channel_id character varying(50) not null,
device_name character varying(255),
time character varying(50),
longitude double precision,
latitude double precision,
altitude double precision,
speed double precision,
direction double precision,
report_source character varying(50),
longitude_gcj02 double precision,
latitude_gcj02 double precision,
longitude_wgs84 double precision,
latitude_wgs84 double precision,
create_time character varying(50)
);
create table wvp_gb_stream (
gb_stream_id serial primary key,
app character varying(255) not null,
stream character varying(255) not null,
gb_id character varying(50) not null,
name character varying(255),
longitude double precision,
latitude double precision,
stream_type character varying(50),
media_server_id character varying(50),
create_time character varying(50),
constraint uk_gb_stream_unique_gb_id unique (gb_id),
constraint uk_gb_stream_unique_app_stream unique (app, stream)
);
create table wvp_log (
id serial primary key ,
name character varying(50),
type character varying(50),
uri character varying(200),
address character varying(50),
result character varying(50),
timing bigint,
username character varying(50),
create_time character varying(50)
);
create table wvp_media_server (
id character varying(255) primary key ,
ip character varying(50),
hook_ip character varying(50),
sdp_ip character varying(50),
stream_ip character varying(50),
http_port integer,
http_ssl_port integer,
rtmp_port integer,
rtmp_ssl_port integer,
rtp_proxy_port integer,
rtsp_port integer,
rtsp_ssl_port integer,
flv_port integer,
flv_ssl_port integer,
ws_flv_port integer,
ws_flv_ssl_port integer,
auto_config bool default false,
secret character varying(50),
type character varying(50) default 'zlm',
rtp_enable bool default false,
rtp_port_range character varying(50),
send_rtp_port_range character varying(50),
record_assist_port integer,
default_server bool default false,
create_time character varying(50),
update_time character varying(50),
hook_alive_interval integer,
record_path character varying(255),
record_day integer default 7,
transcode_suffix character varying(255),
constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
);
create table wvp_platform (
id serial primary key ,
enable bool default false,
name character varying(255),
server_gb_id character varying(50),
server_gb_domain character varying(50),
server_ip character varying(50),
server_port integer,
device_gb_id character varying(50),
device_ip character varying(50),
device_port character varying(50),
username character varying(255),
password character varying(50),
expires character varying(50),
keep_timeout character varying(50),
transport character varying(50),
character_set character varying(50),
catalog_id character varying(50),
ptz bool default false,
rtcp bool default false,
status bool default false,
start_offline_push bool default false,
administrative_division character varying(50),
catalog_group integer,
create_time character varying(50),
update_time character varying(50),
as_message_channel bool default false,
auto_push_channel bool default false,
send_stream_ip character varying(50),
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
);
create table wvp_platform_catalog (
id character varying(50),
platform_id character varying(50),
name character varying(255),
parent_id character varying(50),
civil_code character varying(50),
business_group_id character varying(50),
constraint uk_platform_catalog_id_platform_id unique (id, platform_id)
);
create table wvp_platform_gb_channel (
id serial primary key ,
platform_id character varying(50),
catalog_id character varying(50),
device_channel_id integer,
constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id)
);
create table wvp_platform_gb_stream (
id serial primary key,
platform_id character varying(50),
catalog_id character varying(50),
gb_stream_id integer,
constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id)
);
create table wvp_stream_proxy (
id serial primary key,
type character varying(50),
app character varying(255),
stream character varying(255),
url character varying(255),
src_url character varying(255),
dst_url character varying(255),
timeout_ms integer,
ffmpeg_cmd_key character varying(255),
rtp_type character varying(50),
media_server_id character varying(50),
enable_audio bool default false,
enable_mp4 bool default false,
enable bool default false,
status boolean,
enable_remove_none_reader bool default false,
create_time character varying(50),
name character varying(255),
update_time character varying(50),
stream_key character varying(255),
enable_disable_none_reader bool default false,
constraint uk_stream_proxy_app_stream unique (app, stream)
);
create table wvp_stream_push (
id serial primary key,
app character varying(255),
stream character varying(255),
total_reader_count character varying(50),
origin_type integer,
origin_type_str character varying(50),
create_time character varying(50),
alive_second integer,
media_server_id character varying(50),
server_id character varying(50),
push_time character varying(50),
status bool default false,
update_time character varying(50),
push_ing bool default false,
self bool default false,
constraint uk_stream_push_app_stream unique (app, stream)
);
create table wvp_cloud_record (
id serial primary key,
app character varying(255),
stream character varying(255),
call_id character varying(255),
start_time bigint,
end_time bigint,
media_server_id character varying(50),
file_name character varying(255),
folder character varying(255),
file_path character varying(255),
collect bool default false,
file_size bigint,
time_len bigint,
constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
);
create table wvp_user (
id serial primary key,
username character varying(255),
password character varying(255),
role_id integer,
create_time character varying(50),
update_time character varying(50),
push_key character varying(50),
constraint uk_user_username unique (username)
);
create table wvp_user_role (
id serial primary key,
name character varying(50),
authority character varying(50),
create_time character varying(50),
update_time character varying(50)
);
create table wvp_resources_tree (
id serial primary key ,
is_catalog bool default true,
device_channel_id integer ,
gb_stream_id integer,
name character varying(255),
parentId integer,
path character varying(255)
);
create table wvp_user_api_key (
id serial primary key ,
user_id bigint,
app character varying(255) ,
api_key text,
expired_at bigint,
remark character varying(255),
enable bool default true,
create_time character varying(50),
update_time character varying(50)
);
/*初始数据*/
INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3');
INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');

View File

@ -1,373 +0,0 @@
/*建表*/
create table wvp_device (
id serial primary key ,
device_id character varying(50) not null ,
name character varying(255),
manufacturer character varying(255),
model character varying(255),
firmware character varying(255),
transport character varying(50),
stream_mode character varying(50),
on_line bool default false,
register_time character varying(50),
keepalive_time character varying(50),
ip character varying(50),
create_time character varying(50),
update_time character varying(50),
port integer,
expires integer,
subscribe_cycle_for_catalog integer DEFAULT 0,
subscribe_cycle_for_mobile_position integer DEFAULT 0,
mobile_position_submission_interval integer DEFAULT 5,
subscribe_cycle_for_alarm integer DEFAULT 0,
host_address character varying(50),
charset character varying(50),
ssrc_check bool default false,
geo_coord_sys character varying(50),
media_server_id character varying(50),
custom_name character varying(255),
sdp_ip character varying(50),
local_ip character varying(50),
password character varying(255),
as_message_channel bool default false,
keepalive_interval_time integer,
broadcast_push_after_ack bool default false,
constraint uk_device_device unique (device_id)
);
create table wvp_device_alarm (
id serial primary key ,
device_id character varying(50) not null,
channel_id character varying(50) not null,
alarm_priority character varying(50),
alarm_method character varying(50),
alarm_time character varying(50),
alarm_description character varying(255),
longitude double precision,
latitude double precision,
alarm_type character varying(50),
create_time character varying(50) not null
);
create table wvp_device_channel (
id serial primary key ,
channel_id character varying(50) not null,
name character varying(255),
custom_name character varying(255),
manufacture character varying(50),
model character varying(50),
owner character varying(50),
civil_code character varying(50),
block character varying(50),
address character varying(50),
parent_id character varying(50),
safety_way integer,
register_way integer,
cert_num character varying(50),
certifiable integer,
err_code integer,
end_time character varying(50),
secrecy character varying(50),
ip_address character varying(50),
port integer,
password character varying(255),
ptz_type integer,
custom_ptz_type integer,
status bool default false,
longitude double precision,
custom_longitude double precision,
latitude double precision,
custom_latitude double precision,
stream_id character varying(255),
device_id character varying(50) not null,
parental character varying(50),
has_audio bool default false,
create_time character varying(50) not null,
update_time character varying(50) not null,
sub_count integer,
longitude_gcj02 double precision,
latitude_gcj02 double precision,
longitude_wgs84 double precision,
latitude_wgs84 double precision,
business_group_id character varying(50),
gps_time character varying(50),
stream_identification character varying(50),
constraint uk_wvp_device_channel_unique_device_channel unique (device_id, channel_id)
);
create table wvp_device_mobile_position (
id serial primary key,
device_id character varying(50) not null,
channel_id character varying(50) not null,
device_name character varying(255),
time character varying(50),
longitude double precision,
latitude double precision,
altitude double precision,
speed double precision,
direction double precision,
report_source character varying(50),
longitude_gcj02 double precision,
latitude_gcj02 double precision,
longitude_wgs84 double precision,
latitude_wgs84 double precision,
create_time character varying(50)
);
create table wvp_gb_stream (
gb_stream_id serial primary key,
app character varying(255) not null,
stream character varying(255) not null,
gb_id character varying(50) not null,
name character varying(255),
longitude double precision,
latitude double precision,
stream_type character varying(50),
media_server_id character varying(50),
create_time character varying(50),
constraint uk_gb_stream_unique_gb_id unique (gb_id),
constraint uk_gb_stream_unique_app_stream unique (app, stream)
);
create table wvp_log (
id serial primary key ,
name character varying(50),
type character varying(50),
uri character varying(200),
address character varying(50),
result character varying(50),
timing bigint,
username character varying(50),
create_time character varying(50)
);
create table wvp_media_server (
id character varying(255) primary key ,
ip character varying(50),
hook_ip character varying(50),
sdp_ip character varying(50),
stream_ip character varying(50),
http_port integer,
http_ssl_port integer,
rtmp_port integer,
rtmp_ssl_port integer,
rtp_proxy_port integer,
rtsp_port integer,
rtsp_ssl_port integer,
flv_port integer,
flv_ssl_port integer,
ws_flv_port integer,
ws_flv_ssl_port integer,
auto_config bool default false,
secret character varying(50),
type character varying(50) default 'zlm',
rtp_enable bool default false,
rtp_port_range character varying(50),
send_rtp_port_range character varying(50),
record_assist_port integer,
default_server bool default false,
create_time character varying(50),
update_time character varying(50),
hook_alive_interval integer,
record_path character varying(255),
record_day integer default 7,
transcode_suffix character varying(255),
constraint uk_media_server_unique_ip_http_port unique (ip, http_port)
);
create table wvp_platform (
id serial primary key ,
enable bool default false,
name character varying(255),
server_gb_id character varying(50),
server_gb_domain character varying(50),
server_ip character varying(50),
server_port integer,
device_gb_id character varying(50),
device_ip character varying(50),
device_port character varying(50),
username character varying(255),
password character varying(50),
expires character varying(50),
keep_timeout character varying(50),
transport character varying(50),
character_set character varying(50),
catalog_id character varying(50),
ptz bool default false,
rtcp bool default false,
status bool default false,
start_offline_push bool default false,
administrative_division character varying(50),
catalog_group integer,
create_time character varying(50),
update_time character varying(50),
as_message_channel bool default false,
auto_push_channel bool default false,
send_stream_ip character varying(50),
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
);
create table wvp_platform_catalog (
id character varying(50),
platform_id character varying(50),
name character varying(255),
parent_id character varying(50),
civil_code character varying(50),
business_group_id character varying(50),
constraint uk_platform_catalog_id_platform_id unique (id, platform_id)
);
create table wvp_platform_gb_channel (
id serial primary key ,
platform_id character varying(50),
catalog_id character varying(50),
device_channel_id integer,
constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, catalog_id, device_channel_id)
);
create table wvp_platform_gb_stream (
id serial primary key,
platform_id character varying(50),
catalog_id character varying(50),
gb_stream_id integer,
constraint uk_platform_gb_stream_platform_id_catalog_id_gb_stream_id unique (platform_id, catalog_id, gb_stream_id)
);
create table wvp_stream_proxy (
id serial primary key,
type character varying(50),
app character varying(255),
stream character varying(255),
url character varying(255),
src_url character varying(255),
dst_url character varying(255),
timeout_ms integer,
ffmpeg_cmd_key character varying(255),
rtp_type character varying(50),
media_server_id character varying(50),
enable_audio bool default false,
enable_mp4 bool default false,
enable bool default false,
status boolean,
enable_remove_none_reader bool default false,
create_time character varying(50),
name character varying(255),
update_time character varying(50),
stream_key character varying(255),
enable_disable_none_reader bool default false,
constraint uk_stream_proxy_app_stream unique (app, stream)
);
create table wvp_stream_push (
id serial primary key,
app character varying(255),
stream character varying(255),
total_reader_count character varying(50),
origin_type integer,
origin_type_str character varying(50),
create_time character varying(50),
alive_second integer,
media_server_id character varying(50),
server_id character varying(50),
push_time character varying(50),
status bool default false,
update_time character varying(50),
push_ing bool default false,
self bool default false,
constraint uk_stream_push_app_stream unique (app, stream)
);
create table wvp_cloud_record (
id serial primary key,
app character varying(255),
stream character varying(255),
call_id character varying(255),
start_time int8,
end_time int8,
media_server_id character varying(50),
file_name character varying(255),
folder character varying(255),
file_path character varying(255),
collect bool default false,
file_size int8,
time_len int8,
constraint uk_stream_push_app_stream_path unique (app, stream, file_path)
);
create table wvp_user (
id serial primary key,
username character varying(255),
password character varying(255),
role_id integer,
create_time character varying(50),
update_time character varying(50),
push_key character varying(50),
constraint uk_user_username unique (username)
);
create table wvp_user_role (
id serial primary key,
name character varying(50),
authority character varying(50),
create_time character varying(50),
update_time character varying(50)
);
create table wvp_resources_tree (
id serial primary key ,
is_catalog bool default true,
device_channel_id integer ,
gb_stream_id integer,
name character varying(255),
parentId integer,
path character varying(255)
);
create table wvp_user_api_key (
id serial primary key ,
user_id bigint,
app character varying(255) ,
api_key text,
expired_at bigint,
remark character varying(255),
enable bool default true,
create_time character varying(50),
update_time character varying(50)
);
create table wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
authentication_code character varying(255),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
create table wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (terminal_db_id, channel_id)
);
/*初始数据*/
INSERT INTO wvp_user VALUES (1, 'admin','21232f297a57a5a743894a0e4a801fc3',1,'2021-04-13 14:14:57','2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3');
INSERT INTO wvp_user_role VALUES (1, 'admin','0','2021-04-13 14:14:57','2021-04-13 14:14:57');

View File

@ -0,0 +1,81 @@
drop table IF EXISTS wvp_jt_terminal;
create table IF NOT EXISTS wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
authentication_code character varying(255),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
drop table IF EXISTS wvp_jt_channel;
create table IF NOT EXISTS wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
gb_device_id character varying(255),
gb_name character varying(255),
gb_manufacturer character varying(255),
gb_model character varying(255),
gb_civil_code character varying(8),
gb_block character varying(255),
gb_address character varying(255),
gb_parental bool default false,
gb_parent_id character varying(255),
gb_register_way integer default 1,
gb_security_level_code character varying(255),
gb_secrecy integer default 0,
gb_ip_address character varying(255),
gb_port integer,
gb_password character varying(255),
gb_status bool default false,
gb_longitude double precision,
gb_latitude double precision,
gb_business_group_id character varying(255),
gb_ptz_type integer,
gb_photoelectric_imaging_type integer,
gb_capture_position_type integer,
gb_room_type integer,
gb_supply_light_type integer default 1,
gb_direction_type integer,
gb_resolution character varying(255),
gb_stream_number_list character varying(255),
gb_download_speed character varying(255),
gb_svc_space_support_mode integer,
gb_svc_time_support_mode integer,
gb_ssvc_ratio_support_list character varying(255),
gb_mobile_device_type integer,
gb_horizontal_field_angle double precision,
gb_vertical_field_angle double precision,
gb_max_view_distance double precision,
gb_grassroots_code character varying(255),
gb_point_type integer,
gb_point_common_name character varying(255),
gb_mac character varying(255),
gb_function_type character varying(255),
gb_encode_type character varying(255),
gb_install_time character varying(255),
gb_management_unit character varying(255),
gb_contact_info character varying(255),
gb_record_save_days character varying(255),
gb_industrial_classification character varying(255),
constraint uk_jt_device_id_device_id unique (terminal_db_id, channel_id)
);

View File

@ -0,0 +1,33 @@
drop table IF EXISTS wvp_jt_terminal;
create table IF NOT EXISTS wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
authentication_code character varying(255),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
drop table IF EXISTS wvp_jt_channel;
create table IF NOT EXISTS wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_device_id_device_id unique (terminal_db_id, channel_id)
);