Compare commits

..

9 Commits

Author SHA1 Message Date
好青年_GEILIVABLE
0574b8ba07
Pre Merge pull request !38 from 好青年_GEILIVABLE/N/A 2025-04-14 03:30:58 +00:00
lin
c3b66fc475 合并PR修改中的数据库脚本 2025-04-14 11:30:45 +08:00
lin
2c494bcc7d 修复缓存清理失败的BUG 2025-04-14 11:22:11 +08:00
648540858
6ccccb1bbd
Merge pull request #1815 from xiaoQQya/fix/pg
fix: 修复使用 postgres 数据库时设备列表和通道列表可能乱序的问题
2025-04-12 21:37:15 +08:00
648540858
d17f521b86
Merge pull request #1819 from xiaoQQya/fix/sql
fix: 修复 postgres 数据库脚本 sql 错误
2025-04-12 21:36:20 +08:00
xiaoQQya
a5c455ca10 fix: 修复 postgres 数据库脚本 sql 错误 2025-04-11 14:37:28 +08:00
xiaoQQya
63100f3b90 fix: 修复使用 postgres 数据库时通道列表查询乱序的问题 2025-04-10 14:12:53 +08:00
xiaoQQya
40a95c70e8 fix: 修复使用 postgres 数据库时设备列表查询可能乱序的问题 2025-04-10 14:11:04 +08:00
lin
481609ef72 修复录制计划开启录像失败的BUG 2025-04-09 16:48:50 +08:00
12 changed files with 60 additions and 36 deletions

View File

@ -18,7 +18,6 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.sip.message.Response;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.HashMap;

View File

@ -2,10 +2,12 @@ package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 业务分组 * 业务分组
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@Schema(description = "业务分组树") @Schema(description = "业务分组树")
public class GroupTree extends Group{ public class GroupTree extends Group{

View File

@ -2,10 +2,12 @@ package com.genersoft.iot.vmp.gb28181.bean;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
/** /**
* 区域 * 区域
*/ */
@EqualsAndHashCode(callSuper = true)
@Data @Data
@Schema(description = "区域树") @Schema(description = "区域树")
public class RegionTree extends Region { public class RegionTree extends Region {

View File

@ -381,7 +381,7 @@ public interface DeviceMapper {
" OR device_id LIKE concat('%',#{query},'%') escape '/' " + " OR device_id LIKE concat('%',#{query},'%') escape '/' " +
" OR ip LIKE concat('%',#{query},'%') escape '/')" + " OR ip LIKE concat('%',#{query},'%') escape '/')" +
"</if> " + "</if> " +
" order by create_time desc "+ " order by create_time desc, device_id " +
" </script>") " </script>")
List<Device> getDeviceList(@Param("dataType") Integer dataType, @Param("query") String query, @Param("status") Boolean status); List<Device> getDeviceList(@Param("dataType") Integer dataType, @Param("query") String query, @Param("status") Boolean status);

View File

@ -101,6 +101,7 @@ public class DeviceChannelProvider {
} }
sqlBuild.append(" )"); sqlBuild.append(" )");
} }
sqlBuild.append("ORDER BY device_id");
return sqlBuild.toString(); return sqlBuild.toString();
} }

View File

@ -1723,7 +1723,14 @@ public class PlayServiceImpl implements IPlayService {
throw new PlayException(Response.SERVER_INTERNAL_ERROR, "server internal error"); throw new PlayException(Response.SERVER_INTERNAL_ERROR, "server internal error");
} }
DeviceChannel deviceChannel = deviceChannelService.getOneForSourceById(channel.getGbId()); DeviceChannel deviceChannel = deviceChannelService.getOneForSourceById(channel.getGbId());
play(device, deviceChannel, callback);
MediaServer mediaServerItem = getNewMediaServerItem(device);
if (mediaServerItem == null) {
log.warn("[点播] 未找到可用的zlm deviceId: {},channelId:{}", device.getDeviceId(), deviceChannel.getDeviceId());
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的zlm");
}
play(mediaServerItem, device, deviceChannel, null, record, callback);
} }
@Override @Override

View File

@ -51,6 +51,7 @@ public class StreamPushServiceImpl implements IStreamPushService {
private UserSetting userSetting; private UserSetting userSetting;
@Autowired @Autowired
private IMediaServerService mediaServerService; private IMediaServerService mediaServerService;
@Autowired @Autowired
@ -123,16 +124,13 @@ public class StreamPushServiceImpl implements IStreamPushService {
public void onApplicationEvent(MediaDepartureEvent event) { public void onApplicationEvent(MediaDepartureEvent event) {
// 兼容流注销时类型从redis记录获取 // 兼容流注销时类型从redis记录获取
MediaInfo mediaInfo = redisCatchStorage.getStreamInfo( MediaInfo mediaInfo = redisCatchStorage.getPushListItem(event.getApp(), event.getStream());
event.getApp(), event.getStream(), event.getMediaServer().getId());
if (mediaInfo != null) { if (mediaInfo != null) {
log.info("[推流信息] 查询到redis存在推流缓存 开始清理,{}/{}", event.getApp(), event.getStream());
String type = OriginType.values()[mediaInfo.getOriginType()].getType(); String type = OriginType.values()[mediaInfo.getOriginType()].getType();
redisCatchStorage.removeStream(event.getMediaServer().getId(), type, event.getApp(), event.getStream());
if ("PUSH".equalsIgnoreCase(type)) {
// 冗余数据自己系统中自用 // 冗余数据自己系统中自用
redisCatchStorage.removePushListItem(event.getApp(), event.getStream(), event.getMediaServer().getId()); redisCatchStorage.removePushListItem(event.getApp(), event.getStream(), event.getMediaServer().getId());
}
if (type != null) {
// 发送流变化redis消息 // 发送流变化redis消息
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("serverId", userSetting.getServerId()); jsonObject.put("serverId", userSetting.getServerId());
@ -142,7 +140,6 @@ public class StreamPushServiceImpl implements IStreamPushService {
jsonObject.put("mediaServerId", event.getMediaServer().getId()); jsonObject.put("mediaServerId", event.getMediaServer().getId());
redisCatchStorage.sendStreamChangeMsg(type, jsonObject); redisCatchStorage.sendStreamChangeMsg(type, jsonObject);
} }
}
StreamPush streamPush = getPush(event.getApp(), event.getStream()); StreamPush streamPush = getPush(event.getApp(), event.getStream());
if (streamPush == null) { if (streamPush == null) {
return; return;
@ -576,13 +573,13 @@ public class StreamPushServiceImpl implements IStreamPushService {
if (streamPushList.isEmpty()) { if (streamPushList.isEmpty()) {
return; return;
} }
List<CommonGBChannel> commonGBChannelList = new ArrayList<>(); Set<Integer> channelIds = new HashSet<>();
streamPushList.stream().forEach(streamPush -> { streamPushList.stream().forEach(streamPush -> {
if (streamPush.getGbDeviceId() != null) { if (streamPush.getGbDeviceId() != null) {
commonGBChannelList.add(streamPush.buildCommonGBChannel()); channelIds.add(streamPush.getGbId());
} }
}); });
streamPushMapper.batchDel(streamPushList); streamPushMapper.batchDel(streamPushList);
gbChannelService.delete(ids); gbChannelService.delete(channelIds);
} }
} }

View File

@ -55,7 +55,12 @@ public class CloudRecordController {
@Parameter(name = "year", description = "年,置空则查询当年", required = false) @Parameter(name = "year", description = "年,置空则查询当年", required = false)
@Parameter(name = "month", description = "月,置空则查询当月", required = false) @Parameter(name = "month", description = "月,置空则查询当月", required = false)
@Parameter(name = "mediaServerId", description = "流媒体ID置空则查询全部", required = false) @Parameter(name = "mediaServerId", description = "流媒体ID置空则查询全部", required = false)
public List<String> openRtpServer(@RequestParam(required = true) String app, @RequestParam(required = true) String stream, @RequestParam(required = false) Integer year, @RequestParam(required = false) Integer month, @RequestParam(required = false) String mediaServerId public List<String> openRtpServer(
@RequestParam(required = true) String app,
@RequestParam(required = true) String stream,
@RequestParam(required = false) Integer year,
@RequestParam(required = false) Integer month,
@RequestParam(required = false) String mediaServerId
) { ) {
log.info("[云端录像] 查询存在云端录像的日期 app->{}, stream->{}, mediaServerId->{}, year->{}, month->{}", app, stream, mediaServerId, year, month); log.info("[云端录像] 查询存在云端录像的日期 app->{}, stream->{}, mediaServerId->{}, year->{}, month->{}", app, stream, mediaServerId, year, month);
@ -96,7 +101,15 @@ public class CloudRecordController {
@Parameter(name = "endTime", description = "结束时间(yyyy-MM-dd HH:mm:ss)", required = false) @Parameter(name = "endTime", description = "结束时间(yyyy-MM-dd HH:mm:ss)", required = false)
@Parameter(name = "mediaServerId", description = "流媒体ID置空则查询全部流媒体", required = false) @Parameter(name = "mediaServerId", description = "流媒体ID置空则查询全部流媒体", required = false)
@Parameter(name = "callId", description = "每次录像的唯一标识,置空则查询全部流媒体", required = false) @Parameter(name = "callId", description = "每次录像的唯一标识,置空则查询全部流媒体", required = false)
public PageInfo<CloudRecordItem> openRtpServer(@RequestParam(required = false) String query, @RequestParam(required = false) String app, @RequestParam(required = false) String stream, @RequestParam int page, @RequestParam int count, @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String mediaServerId, @RequestParam(required = false) String callId public PageInfo<CloudRecordItem> openRtpServer(@RequestParam(required = false) String query,
@RequestParam(required = false) String app,
@RequestParam(required = false) String stream,
@RequestParam int page,
@RequestParam int count,
@RequestParam(required = false) String startTime,
@RequestParam(required = false) String endTime,
@RequestParam(required = false) String mediaServerId,
@RequestParam(required = false) String callId
) { ) {
log.info("[云端录像] 查询 app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId); log.info("[云端录像] 查询 app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId);

View File

@ -37,10 +37,9 @@ public class ApiControlController {
* @param channel 通道序号 * @param channel 通道序号
* @param code 通道编号 * @param code 通道编号
* @param speed 速度(0~255) 默认值: 129 * @param speed 速度(0~255) 默认值: 129
* @return
*/ */
@GetMapping(value = "/ptz") @GetMapping(value = "/ptz")
private void list(String serial,String command, private void ptz(String serial,String command,
@RequestParam(required = false)Integer channel, @RequestParam(required = false)Integer channel,
@RequestParam(required = false)String code, @RequestParam(required = false)String code,
@RequestParam(required = false)Integer speed){ @RequestParam(required = false)Integer speed){
@ -55,7 +54,7 @@ public class ApiControlController {
if (device == null) { if (device == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]未找到"); throw new ControllerException(ErrorCode.ERROR100.getCode(), "device[ " + serial + " ]未找到");
} }
int cmdCode = 0; int cmdCode = -1;
switch (command){ switch (command){
case "left": case "left":
cmdCode = 2; cmdCode = 2;
@ -93,6 +92,9 @@ public class ApiControlController {
default: default:
break; break;
} }
if (cmdCode == -1) {
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未识别的指令:" + command);
}
// 默认值 50 // 默认值 50
try { try {
cmder.frontEndCmd(device, code, cmdCode, speed, speed, speed); cmder.frontEndCmd(device, code, cmdCode, speed, speed, speed);
@ -110,7 +112,6 @@ public class ApiControlController {
* @param command 控制指令 允许值: set, goto, remove * @param command 控制指令 允许值: set, goto, remove
* @param preset 预置位编号(1~255) * @param preset 预置位编号(1~255)
* @param name 预置位名称, command=set 时有效 * @param name 预置位名称, command=set 时有效
* @return
*/ */
@GetMapping(value = "/preset") @GetMapping(value = "/preset")
private void list(String serial,String command, private void list(String serial,String command,

View File

@ -6560,7 +6560,7 @@ var ZLMRTCClient = (function (exports) {
resolve(response); resolve(response);
} else { } else {
reject(new AxiosError_1( reject(new AxiosError_1(
'Request failed with status code ' + response.status, '请求失败, 状态码:' + response.status,
[AxiosError_1.ERR_BAD_REQUEST, AxiosError_1.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], [AxiosError_1.ERR_BAD_REQUEST, AxiosError_1.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
response.config, response.config,
response.request, response.request,

View File

@ -159,11 +159,12 @@ create table IF NOT EXISTS wvp_device_channel
gps_speed double precision, gps_speed double precision,
gps_altitude double precision, gps_altitude double precision,
gps_direction double precision, gps_direction double precision,
index (data_type),
index (data_device_id),
constraint uk_wvp_unique_channel unique (gb_device_id) constraint uk_wvp_unique_channel unique (gb_device_id)
); );
CREATE INDEX idx_data_type ON wvp_device_channel (data_type);
CREATE INDEX idx_data_device_id ON wvp_device_channel (data_device_id);
drop table IF EXISTS wvp_media_server; drop table IF EXISTS wvp_media_server;
create table IF NOT EXISTS wvp_media_server create table IF NOT EXISTS wvp_media_server
( (

View File

@ -137,11 +137,12 @@ create table IF NOT EXISTS wvp_device_channel
gps_speed double precision, gps_speed double precision,
gps_altitude double precision, gps_altitude double precision,
gps_direction double precision, gps_direction double precision,
index (data_type),
index (data_device_id),
constraint uk_wvp_unique_channel unique (gb_device_id) constraint uk_wvp_unique_channel unique (gb_device_id)
); );
create index if not exists data_type on wvp_device_channel (data_type);
create index if not exists data_device_id on wvp_device_channel (data_device_id);
create table IF NOT EXISTS wvp_device_mobile_position create table IF NOT EXISTS wvp_device_mobile_position
( (
id serial primary key, id serial primary key,