From 7d84a1cbcb2e869eb0494893b08a4d0c9afe87aa Mon Sep 17 00:00:00 2001
From: elkers <elkers@163.com>
Date: 星期六, 12 四月 2025 18:28:21 +0800
Subject: [PATCH] 添加监控

---
 src/main/java/com/nanjing/water/entity/search/SearchMonitorVideoStreaming.java                           |   14 
 src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java                                       |   29 +
 src/main/java/com/nanjing/water/host/controller/MonitorVideoStreamingController.java                     |  150 +++++++
 src/main/java/com/nanjing/water/repository/vo/MonitorVideoStreamingVO.java                               |   54 ++
 src/main/java/com/nanjing/water/service/convert/MonitorVideoStreamingConvert.java                        |   48 ++
 src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqCreateMonitorVideoStreaming.java |   69 +++
 src/main/java/com/nanjing/water/repository/impl/MonitorVideoStreamingMapperImpl.java                     |  161 ++++++++
 src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqModifyMonitorVideoStreaming.java |   77 +++
 src/main/java/com/nanjing/water/service/MonitorVideoStreamingService.java                                |  425 +++++++++++++++++++++
 src/main/java/com/nanjing/water/repository/po/MonitorVideoStreamingPO.java                               |  109 +++++
 src/test/java/com/nanjing/water/GenCodeGauss.java                                                        |    2 
 src/main/java/com/nanjing/water/repository/mapper/MonitorVideoStreamingMapper.java                       |   10 
 12 files changed, 1,147 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqCreateMonitorVideoStreaming.java b/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqCreateMonitorVideoStreaming.java
new file mode 100644
index 0000000..a953792
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqCreateMonitorVideoStreaming.java
@@ -0,0 +1,69 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.entity.request.monitorvideostreaming;
+
+import lombok.Data;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Data
+public class ReqCreateMonitorVideoStreaming {
+	/**
+	 * 设备编号
+	 */
+	private String deviceId;
+	/**
+	 * 通道编号
+	 */
+	private String channelId;
+	/**
+	 * 流地址
+	 */
+	private String url;
+	/**
+	 * 直播开始时间
+	 */
+	private Long beginTime;
+	/**
+	 * 直播结束时间
+	 */
+	private Long endTime;
+	/**
+	 * 备注
+	 */
+	private String remark;
+	/**
+	 * 监控点id
+	 */
+	private Long pointId;
+	/**
+	 * 监控点code
+	 */
+	private String pointCode;
+	/**
+	 * 监控点名称
+	 */
+	private String pointName;
+}
diff --git a/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqModifyMonitorVideoStreaming.java b/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqModifyMonitorVideoStreaming.java
new file mode 100644
index 0000000..20cd6b7
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/request/monitorvideostreaming/ReqModifyMonitorVideoStreaming.java
@@ -0,0 +1,77 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.entity.request.monitorvideostreaming;
+
+import lombok.Data;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Data
+public class ReqModifyMonitorVideoStreaming {
+	/**
+	 * 主键id
+	 */
+	private Long id;
+	/**
+	 * 设备编号
+	 */
+	private String deviceId;
+	/**
+	 * 通道编号
+	 */
+	private String channelId;
+	/**
+	 * 流地址
+	 */
+	private String url;
+	/**
+	 * 直播状态
+	 */
+	private Integer state;
+	/**
+	 * 直播开始时间
+	 */
+	private Long beginTime;
+	/**
+	 * 直播结束时间
+	 */
+	private Long endTime;
+	/**
+	 * 备注
+	 */
+	private String remark;
+	/**
+	 * 监控点id
+	 */
+	private Long pointId;
+	/**
+	 * 监控点code
+	 */
+	private String pointCode;
+	/**
+	 * 监控点名称
+	 */
+	private String pointName;
+}
diff --git a/src/main/java/com/nanjing/water/entity/search/SearchMonitorVideoStreaming.java b/src/main/java/com/nanjing/water/entity/search/SearchMonitorVideoStreaming.java
new file mode 100644
index 0000000..6413f7f
--- /dev/null
+++ b/src/main/java/com/nanjing/water/entity/search/SearchMonitorVideoStreaming.java
@@ -0,0 +1,14 @@
+package com.nanjing.water.entity.search;
+
+import lombok.Data;
+
+import com.nanjing.water.entity.dto.SearchBasicDTO;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Data
+public class SearchMonitorVideoStreaming extends SearchBasicDTO {
+
+}
diff --git a/src/main/java/com/nanjing/water/host/controller/MonitorVideoStreamingController.java b/src/main/java/com/nanjing/water/host/controller/MonitorVideoStreamingController.java
new file mode 100644
index 0000000..b1ffe4d
--- /dev/null
+++ b/src/main/java/com/nanjing/water/host/controller/MonitorVideoStreamingController.java
@@ -0,0 +1,150 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.host.controller;
+
+import com.nanjing.water.common.ExecutedResult;
+import com.nanjing.water.common.PagerResult;
+import com.nanjing.water.common.util.ParameterUtil;
+import com.nanjing.water.common.validator.ParameterValidateResult;
+import com.nanjing.water.common.validator.ParameterValidator;
+import com.nanjing.water.entity.request.ReqListId;
+import com.nanjing.water.host.BasicController;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+import com.nanjing.water.service.MonitorVideoStreamingService;
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqCreateMonitorVideoStreaming;
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqModifyMonitorVideoStreaming;
+import com.nanjing.water.entity.search.SearchMonitorVideoStreaming;
+import com.nanjing.water.repository.vo.MonitorVideoStreamingVO;
+
+/**
+ * 9000.监控视频播放流
+ * @author lin.liu
+ * @order 9000
+ */
+@RestController
+@RequestMapping(value = "monitorVideoStreaming")
+public class MonitorVideoStreamingController extends BasicController {
+    @Autowired
+    private MonitorVideoStreamingService service;
+
+    /**
+     * 创建[监控视频播放流]
+     * @author lin.liu
+     */
+    @PostMapping(value = "create")
+    public ExecutedResult<Long> create(@RequestBody ReqCreateMonitorVideoStreaming request) {
+        //#region 参数验证
+        ParameterValidator validator = new ParameterValidator()
+                // 非空
+                //.addNotNullOrEmpty(ParameterUtil.named("名称"), request.getName())
+                // 限制最大长度
+                //.addLengthMax(ParameterUtil.named("名称"), request.getName(), ConstantFactory.LENGTH_MAX50)
+                ;
+        ParameterValidateResult result = validator.validate();
+        if (result.getIsFiled()) {
+            return failed(result.getErrorMsg());
+        }
+        //#endregion
+        return service.create(request);
+    }
+
+    /**
+     * 编辑[监控视频播放流]
+     * @author lin.liu
+     */
+    @PostMapping(value = "modify")
+    public ExecutedResult<String> modify(@RequestBody ReqModifyMonitorVideoStreaming request) {
+        //#region 参数验证
+        ParameterValidator validator = new ParameterValidator()
+                // 必须大于0
+                .addGreater(ParameterUtil.named("[监控视频播放流]id"), request.getId(), 0L)
+                // 非空
+                //.addNotNullOrEmpty(ParameterUtil.named("名称"), request.getName())
+                // 限制最大长度
+                //.addLengthMax(ParameterUtil.named("名称"), request.getName(), ConstantFactory.LENGTH_MAX50)
+                ;
+        ParameterValidateResult result = validator.validate();
+        if (result.getIsFiled()) {
+            return failed(result.getErrorMsg());
+        }
+        //#endregion
+        return service.modify(request);
+    }
+
+    /**
+     * 获取[监控视频播放流]
+     * @author lin.liu
+     */
+    @GetMapping(value = "get/{id}")
+    public ExecutedResult<MonitorVideoStreamingVO> get(@PathVariable Long id) {
+        return service.get(id);
+    }
+    /**
+     * 根据监控点id获取[监控视频播放流]
+     * @author lin.liu
+     */
+    @GetMapping(value = "getAllByPoint")
+    public ExecutedResult<List<MonitorVideoStreamingPO>> getAllByPoint(@RequestParam Long pointId) {
+        return service.getAllByPoint(pointId);
+    }
+
+    /**
+     * 查询[监控视频播放流]
+     * @author lin.liu
+     */
+    @PostMapping(value = "search")
+    public ExecutedResult<PagerResult<MonitorVideoStreamingVO>> search(@RequestBody SearchMonitorVideoStreaming request) {
+        return service.search(request);
+    }
+    /**
+     * 开启视频点播[监控视频播放流]
+     * @author lin.liu
+     */
+    @GetMapping(value = "play/{deviceId}/{channelId}")
+    public ExecutedResult<MonitorVideoStreamingPO> play(@PathVariable String deviceId, @PathVariable String channelId) throws IOException {
+        return service.play(deviceId,channelId);
+    }
+    /**
+     * 停止视频点播[监控视频播放流]
+     * @author lin.liu
+     */
+    @GetMapping(value = "stop/{deviceId}/{channelId}")
+    public ExecutedResult<MonitorVideoStreamingPO> stop(@PathVariable String deviceId,@PathVariable String channelId) throws IOException {
+
+        return service.stop(deviceId,channelId,"手动停止点播");
+    }
+    /**
+     * 点播续时[监控视频播放流]
+     * @author lin.liu
+     */
+    @GetMapping(value = "updateEndTime/{deviceId}/{channelId}")
+    public ExecutedResult<MonitorVideoStreamingPO> updateEndTime(@PathVariable String deviceId, @PathVariable String channelId) throws IOException {
+
+        return service.updateEndTime(deviceId,channelId);
+    }
+}
diff --git a/src/main/java/com/nanjing/water/repository/impl/MonitorVideoStreamingMapperImpl.java b/src/main/java/com/nanjing/water/repository/impl/MonitorVideoStreamingMapperImpl.java
new file mode 100644
index 0000000..3b5e80e
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/impl/MonitorVideoStreamingMapperImpl.java
@@ -0,0 +1,161 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.nanjing.water.common.ConstantFactory;
+import com.nanjing.water.common.PagerResult;
+import com.nanjing.water.common.enums.EYesOrNo;
+import com.nanjing.water.common.util.*;
+import com.nanjing.water.entity.dto.*;
+import com.nanjing.water.entity.enums.*;
+import com.nanjing.water.repository.BasicMapperImpl;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import com.nanjing.water.entity.search.SearchMonitorVideoStreaming;
+import com.nanjing.water.repository.mapper.MonitorVideoStreamingMapper;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Repository
+public class MonitorVideoStreamingMapperImpl extends BasicMapperImpl<MonitorVideoStreamingPO, MonitorVideoStreamingMapper> {
+	MonitorVideoStreamingMapperImpl(MonitorVideoStreamingMapper mapper) {
+		super(mapper);
+	}
+
+	@Override
+	public PagerResult<MonitorVideoStreamingPO> search(SearchBasicDTO request) {
+		// 还原查询条件真实类型
+		SearchMonitorVideoStreaming search = (SearchMonitorVideoStreaming)request;
+		// 查询条件
+		LambdaQueryWrapper<MonitorVideoStreamingPO> queryWrapper = this.query();
+		// 非逻辑删除
+		queryWrapper.eq(MonitorVideoStreamingPO::getIsDelete, EYesOrNo.NO.getValue());
+		// 状态
+		//queryWrapper.eq(NumericUtil.tryParseInt(search.getStatus()).compareTo(0) > 0, MonitorVideoStreamingPO::getStatus, search.getStatus());
+		// 状态列表
+		//queryWrapper.in(ListUtil.isNotNullOrEmpty(search.getListStatus()), MonitorVideoStreamingPO::getStatus, search.getListStatus());
+
+		// 数据创建时间-起始
+		queryWrapper.ge(NumericUtil.tryParseLong(search.getCreateTimeStart()).compareTo(0L) > 0, MonitorVideoStreamingPO::getCreateTime, search.getCreateTimeStart());
+		// 数据创建时间-截止
+		queryWrapper.le(NumericUtil.tryParseLong(search.getCreateTimeEnd()).compareTo(0L) > 0, MonitorVideoStreamingPO::getCreateTime, search.getCreateTimeEnd());
+		// 关键字
+		//if (StringUtil.isNotNullOrEmpty(search.getKeywords())) {
+		//	queryWrapper.and(q ->
+		//		q.like(MonitorVideoStreamingPO::getName, search.getKeywords())
+		//		.or().like(MonitorVideoStreamingPO::getPhone, search.getKeywords())
+		//	);
+		//}
+
+		// 排序处理
+		if (ListUtil.isNotNullOrEmpty(search.getOrderBy())) {
+			for (OrderByDTO item : search.getOrderBy()) {
+				EOrderBy orderBy = EOrderBy.getByValue(item.getOrderBy());
+				// 顺序排序
+				if (item.getIsAsc()) {
+					switch (orderBy) {
+						// 主键
+						case ID:
+							queryWrapper.orderByAsc(MonitorVideoStreamingPO::getId);
+							break;
+						// 数据创建时间
+						case CREATE_TIME:
+							queryWrapper.orderByAsc(MonitorVideoStreamingPO::getCreateTime);
+							break;
+						// 最后更新时间
+						case UPDATE_TIME:
+							queryWrapper.orderByAsc(MonitorVideoStreamingPO::getUpdateTime);
+							break;
+					}
+				} else {
+					// 倒叙排序
+					switch (orderBy) {
+						// 主键
+						case ID:
+							queryWrapper.orderByDesc(MonitorVideoStreamingPO::getId);
+							break;
+						// 数据创建时间
+						case CREATE_TIME:
+							queryWrapper.orderByDesc(MonitorVideoStreamingPO::getCreateTime);
+							break;
+						// 最后更新时间
+						case UPDATE_TIME:
+							queryWrapper.orderByDesc(MonitorVideoStreamingPO::getUpdateTime);
+							break;
+					}
+				}
+			}
+		} else {
+			queryWrapper.orderByDesc(MonitorVideoStreamingPO::getId);
+		}
+		Page<MonitorVideoStreamingPO> pageResult = super.selectPage(new Page<>(search.getPage(), search.getLimit()), queryWrapper);
+		return new PagerResult<>(pageResult.getSize(), pageResult.getCurrent(), pageResult.getTotal(), pageResult.getRecords());
+	}
+
+	public Boolean add(MonitorVideoStreamingPO item) {
+		int rowCount = super.insert(item);
+		return rowCount == 1;
+	}
+
+	public Boolean addNotIncrement(MonitorVideoStreamingPO item) {
+		int rowCount = super.insert(item);
+		return rowCount == 1;
+	}
+	public MonitorVideoStreamingPO getByDeviceId(String  deviceId,String channelId) {
+		LambdaQueryWrapper<MonitorVideoStreamingPO> queryWrapper = this.query();
+		queryWrapper.eq(MonitorVideoStreamingPO::getDeviceId,deviceId);
+		queryWrapper.eq(MonitorVideoStreamingPO::getChannelId,channelId);
+
+		return super.selectOne(queryWrapper);
+	}
+	public MonitorVideoStreamingPO getById(Long id) {
+		return super.get(id);
+	}
+
+	public List<MonitorVideoStreamingPO> getListById(List<Long> listId) {
+		return super.getList(listId);
+	}
+	public int updateEndTime(Long id) {
+		MonitorVideoStreamingPO upd = new MonitorVideoStreamingPO();
+		upd.setId(id);
+		upd.setEndTime(LocalDateTimeUtil.nowTimeStamp() + ConstantFactory.TIME_LEN_1MIN * 3L);
+		return super.updateById(upd);
+	}
+	public List<MonitorVideoStreamingPO> getAllByPoint(Long pointId) {
+		LambdaQueryWrapper<MonitorVideoStreamingPO> queryWrapper = this.query();
+		queryWrapper.eq(MonitorVideoStreamingPO::getPointId,pointId);
+		return super.selectList(queryWrapper);
+	}
+	public List<MonitorVideoStreamingPO> list4WaitingStop() {
+		LambdaQueryWrapper<MonitorVideoStreamingPO> queryWrapper = this.query();
+		queryWrapper.eq(MonitorVideoStreamingPO::getState,EYesOrNo.YES.getValue());
+		queryWrapper.le(MonitorVideoStreamingPO::getEndTime,LocalDateTimeUtil.nowTimeStamp());
+		return super.selectList(queryWrapper);
+	}
+}
diff --git a/src/main/java/com/nanjing/water/repository/mapper/MonitorVideoStreamingMapper.java b/src/main/java/com/nanjing/water/repository/mapper/MonitorVideoStreamingMapper.java
new file mode 100644
index 0000000..3769425
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/mapper/MonitorVideoStreamingMapper.java
@@ -0,0 +1,10 @@
+package com.nanjing.water.repository.mapper;
+
+import com.nanjing.water.repository.BasicMapper;import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+
+/**
+ * 监控视频播放流 mapper
+ * @author lin.liu
+ */
+public interface MonitorVideoStreamingMapper extends BasicMapper<MonitorVideoStreamingPO> {
+}
diff --git a/src/main/java/com/nanjing/water/repository/po/MonitorVideoStreamingPO.java b/src/main/java/com/nanjing/water/repository/po/MonitorVideoStreamingPO.java
new file mode 100644
index 0000000..013a069
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/po/MonitorVideoStreamingPO.java
@@ -0,0 +1,109 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.po;
+
+import lombok.Data;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.sql.Timestamp;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Data
+@TableName("monitor_video_streaming")
+public class MonitorVideoStreamingPO implements Serializable {
+	/**
+	 * 主键id
+	 */
+	private Long id;
+	/**
+	 * 设备编号
+	 */
+	@TableField(value = "device_id")
+	private String deviceId;
+	/**
+	 * 通道编号
+	 */
+	@TableField(value = "channel_id")
+	private String channelId;
+	/**
+	 * 流地址
+	 */
+	@TableField(value = "url")
+	private String url;
+	/**
+	 * 直播状态
+	 */
+	@TableField(value = "state")
+	private Integer state;
+	/**
+	 * 直播开始时间
+	 */
+	@TableField(value = "begin_time")
+	private Long beginTime;
+	/**
+	 * 直播结束时间
+	 */
+	@TableField(value = "end_time")
+	private Long endTime;
+	/**
+	 * 备注
+	 */
+	@TableField(value = "remark")
+	private String remark;
+	/**
+	 * 创建日期
+	 */
+	@TableField(value = "create_time")
+	private Long createTime;
+	/**
+	 * 修改日期
+	 */
+	@TableField(value = "update_time")
+	private Timestamp updateTime;
+	/**
+	 * 是否删除
+	 */
+	@TableLogic
+	@TableField(value = "is_delete")
+	private Integer isDelete;
+	/**
+	 * 监控点id
+	 */
+	@TableField(value = "point_id")
+	private Long pointId;
+	/**
+	 * 监控点code
+	 */
+	@TableField(value = "point_code")
+	private String pointCode;
+	/**
+	 * 监控点名称
+	 */
+	@TableField(value = "point_name")
+	private String pointName;
+}
diff --git a/src/main/java/com/nanjing/water/repository/vo/MonitorVideoStreamingVO.java b/src/main/java/com/nanjing/water/repository/vo/MonitorVideoStreamingVO.java
new file mode 100644
index 0000000..baae4bb
--- /dev/null
+++ b/src/main/java/com/nanjing/water/repository/vo/MonitorVideoStreamingVO.java
@@ -0,0 +1,54 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.repository.vo;
+
+import lombok.Data;
+
+import com.nanjing.water.common.util.LocalDateTimeUtil;
+import com.nanjing.water.common.util.NumericUtil;
+import java.util.Objects;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Data
+public class MonitorVideoStreamingVO extends MonitorVideoStreamingPO implements BasicVO {
+
+    @Override
+    public String getCreateTimeView() {
+        if (NumericUtil.tryParseLong(this.getCreateTime()).compareTo(0L) > 0) {
+            return LocalDateTimeUtil.toFormatString(this.getCreateTime());
+        }
+        return "";
+    }
+
+    @Override
+    public String getUpdateTimeView() {
+        if (Objects.isNull(this.getUpdateTime())) {
+            return "";
+        }
+        return LocalDateTimeUtil.toFormatFullString(this.getUpdateTime());
+    }
+}
diff --git a/src/main/java/com/nanjing/water/service/MonitorVideoStreamingService.java b/src/main/java/com/nanjing/water/service/MonitorVideoStreamingService.java
new file mode 100644
index 0000000..c6fc06a
--- /dev/null
+++ b/src/main/java/com/nanjing/water/service/MonitorVideoStreamingService.java
@@ -0,0 +1,425 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.service;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.nanjing.water.common.*;
+import com.nanjing.water.common.enums.*;
+import com.nanjing.water.common.model.Tuple;
+import com.nanjing.water.common.util.*;
+import com.nanjing.water.repository.vo.SysDictDataVO;
+import org.apache.commons.lang3.BooleanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import com.nanjing.water.repository.impl.MonitorVideoStreamingMapperImpl;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqCreateMonitorVideoStreaming;
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqModifyMonitorVideoStreaming;
+import com.nanjing.water.entity.search.SearchMonitorVideoStreaming;
+import com.nanjing.water.repository.vo.MonitorVideoStreamingVO;
+import com.nanjing.water.service.convert.MonitorVideoStreamingConvert;
+
+/**
+ * 监控视频播放流
+ * @author lin.liu
+ */
+@Service
+public class MonitorVideoStreamingService extends BaseService {
+    @Autowired
+    private MonitorVideoStreamingMapperImpl mapper;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+    @Autowired
+    private SysDictDataService sysDictDataService;
+
+    public ExecutedResult<Long> create(ReqCreateMonitorVideoStreaming request) {
+        // 转换po
+        MonitorVideoStreamingPO item = MonitorVideoStreamingConvert.INSTANCE.toCreate(request);
+        // 设置状态
+        //item.setStatus(EState.NORMAL.getValue());
+        // 设置记录创建时间
+        item.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
+        // 是否删除(逻辑删除)初始值
+        item.setIsDelete(EYesOrNo.NO.getValue());
+
+        int rowCount = mapper.insert(item);
+        if (rowCount != 1) {
+            return ExecutedResult.failed("创建[监控视频播放流]失败。");
+        }
+        return ExecutedResult.success(item.getId());
+    }
+
+    public ExecutedResult<String> modify(ReqModifyMonitorVideoStreaming request) {
+        // 验证记录是否存在
+        ExecutedResult<MonitorVideoStreamingPO> checkExists = this.check4Id(request.getId());
+        if (checkExists.isFailed()) {
+            return ExecutedResult.failed(checkExists.getMsg());
+        }
+        // 转换po
+        MonitorVideoStreamingPO item = MonitorVideoStreamingConvert.INSTANCE.toModify(request);
+
+        int rowCount = mapper.updateById(item);
+        if (rowCount != 1) {
+            return ExecutedResult.failed("编辑[监控视频播放流]失败。");
+        }
+        return ExecutedResult.success();
+    }
+    public ExecutedResult<List<MonitorVideoStreamingPO>> getAllByPoint( Long pointId){
+        List<MonitorVideoStreamingPO> result=mapper.getAllByPoint(pointId);
+        return ExecutedResult.success(result);
+    }
+    public ExecutedResult<MonitorVideoStreamingVO> get(Long id) {
+        MonitorVideoStreamingVO result = new MonitorVideoStreamingVO();
+
+        MonitorVideoStreamingPO find = mapper.get(id);
+        if (null != find) {
+            // 转换vo
+            result = MonitorVideoStreamingConvert.INSTANCE.toVo(find);
+        }
+        return ExecutedResult.success(result);
+    }
+
+//    public ExecutedResult<String> stop(Long id) {
+//        // 验证记录是否存在
+//        ExecutedResult<MonitorVideoStreamingPO> checkExists = this.check4Id(id);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        MonitorVideoStreamingPO item = new MonitorVideoStreamingPO();
+//        item.setId(id);
+//        item.setStatus(EState.DISABLED.getValue());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//           return ExecutedResult.failed("停用[监控视频播放流]失败。");
+//       }
+//       return ExecutedResult.success();
+//   }
+//
+//    public ExecutedResult<String> enable(Long id) {
+//        // 验证记录是否存在
+//        ExecutedResult<MonitorVideoStreamingPO> checkExists = this.check4Id(id);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        MonitorVideoStreamingPO item = new MonitorVideoStreamingPO();
+//        item.setId(id);
+//        item.setStatus(EState.NORMAL.getValue());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//            return ExecutedResult.failed("启用[监控视频播放流]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> setSort(ReqSetSort request) {
+//        // 验证记录是否存在
+//        ExecutedResult<MonitorVideoStreamingPO> checkExists = this.check4Id(request.getId());
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//        MonitorVideoStreamingPO item = new MonitorVideoStreamingPO();
+//        item.setId(request.getId());
+//        item.setSort(request.getSort());
+//
+//        int rowCount = mapper.updateById(item);
+//        if (rowCount != 1) {
+//            return ExecutedResult.failed("设置[监控视频播放流]排序值失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> listSetSort(ReqListSetSort request) {
+//        // id列表
+//        List<Long> listId = request.getList().stream().map(ReqSetSort::getId).collect(Collectors.toList());
+//        // 验证记录是否存在
+//        ExecutedResult<List<MonitorVideoStreamingPO>> checkExists = this.check4Id(listId);
+//        if (checkExists.isFailed()) {
+//            return ExecutedResult.failed(checkExists.getMsg());
+//        }
+//
+//        List<MonitorVideoStreamingPO> listUpdate = request.getList().stream()
+//                .map(c -> {
+//                    MonitorVideoStreamingPO item = new MonitorVideoStreamingPO();
+//                    item.setId(c.getId());
+//                    item.setSort(c.getSort());
+//                    return item;
+//                })
+//                .collect(Collectors.toList());
+//        Boolean result = mapper.modifyList(listUpdate);
+//        if (result) {
+//            return ExecutedResult.success();
+//        }
+//        return ExecutedResult.failed("[监控视频播放流]设置排序值失败");
+//    }
+//
+//    public ExecutedResult<String> remove(Long id) {
+//        Boolean result = mapper.deleteLogic(id);
+//        if (BooleanUtils.isFalse(result)) {
+//            return ExecutedResult.failed("删除[监控视频播放流]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+//
+//    public ExecutedResult<String> removeList(List<Long> ids) {
+//        Boolean result = mapper.deleteLogic(ids);
+//        if (BooleanUtils.isFalse(result)) {
+//            return ExecutedResult.failed("删除[监控视频播放流]失败。");
+//        }
+//        return ExecutedResult.success();
+//    }
+public ExecutedResult<MonitorVideoStreamingPO> play(String deviceId,String channelId) throws IOException {
+    MonitorVideoStreamingPO result=new MonitorVideoStreamingPO();
+    ExecutedResult<String> token = getToken();
+    if(token.isSuccess()&&StringUtil.isNotNullOrEmpty(token.getData())){
+        ExecutedResult<String> executedResult = playStart(deviceId, channelId, token.getData());
+        if(executedResult.isSuccess()&&StringUtil.isNotNullOrEmpty(executedResult.getData())){
+            //查询数据是否存在
+            result= mapper.getByDeviceId(deviceId, channelId);
+            if(Objects.nonNull(result)){
+                result.setState(EYesOrNo.YES.getValue());
+                result.setUrl(executedResult.getData());
+                result.setBeginTime(LocalDateTimeUtil.nowTimeStamp());
+                result.setEndTime(result.getBeginTime()+ ConstantFactory.TIME_LEN_1MIN * 3L);
+                result.setRemark("正在点播");
+                mapper.updateById(result);
+            }else {
+                result=new MonitorVideoStreamingPO();
+                result.setDeviceId(deviceId);
+                result.setChannelId(channelId);
+                result.setUrl(executedResult.getData());
+                result.setState(EYesOrNo.YES.getValue());
+                result.setRemark("正在点播");
+                result.setBeginTime(LocalDateTimeUtil.nowTimeStamp());
+                result.setEndTime(result.getBeginTime()+ ConstantFactory.TIME_LEN_1MIN * 3L);
+                result.setCreateTime(LocalDateTimeUtil.nowTimeStamp());
+                mapper.insert(result);
+            }
+
+        }
+    }
+    return ExecutedResult.success(result);
+}
+    public ExecutedResult<MonitorVideoStreamingPO> stop(String deviceId,String channelId,String remark) throws IOException{
+        ExecutedResult<String> token = getToken();
+        if(token.isSuccess()&&StringUtil.isNotNullOrEmpty(token.getData())){
+            String httpsURL = "http://120.71.144.117:18097/api/play/stop/"+deviceId+'/'+channelId;
+            URL myURL = new URL(httpsURL);
+            // 打开连接
+            HttpURLConnection conn = (HttpURLConnection) myURL.openConnection();
+            // 设置请求方法为GET
+            conn.setRequestMethod("GET");
+            // 设置通用的请求属性
+            conn.setRequestProperty("Content-Type", "application/json");
+            conn.setRequestProperty("access-token",token.getData());
+            // 建立连接
+            conn.connect();
+            // 读取响应
+            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
+            String inputLine;
+            StringBuilder content = new StringBuilder();
+            while ((inputLine = in.readLine()) != null) {
+                content.append(inputLine);
+            }
+            in.close();
+            conn.disconnect();
+            String data = content.toString();
+            Gson gson = new Gson();
+            JsonObject jsonObject = gson.fromJson(data, JsonObject.class);
+            String code= jsonObject.get("code").getAsString();
+            if(code.equals("0")){
+                MonitorVideoStreamingPO streamingPO = mapper.getByDeviceId(deviceId, channelId);
+                if(Objects.nonNull(streamingPO)){
+                    streamingPO.setState(EYesOrNo.NO.getValue());
+                    streamingPO.setEndTime(LocalDateTimeUtil.nowTimeStamp());
+                    streamingPO.setRemark("手动关闭点播");
+                    mapper.updateById(streamingPO);
+                }
+                return ExecutedResult.success(streamingPO);
+            }else {
+                return ExecutedResult.failed("调用第三方接口失败");
+            }
+        }
+        return ExecutedResult.failed("获取token失败");
+    }
+    public ExecutedResult<String> playStart(String deviceId,String channelId,String token) throws IOException {
+        String httpsURL = "http://120.71.144.117:18097/api/play/start/"+deviceId+'/'+channelId;
+        URL myURL = new URL(httpsURL);
+        // 打开连接
+        HttpURLConnection conn = (HttpURLConnection) myURL.openConnection();
+        // 设置请求方法为GET
+        conn.setRequestMethod("GET");
+        // 设置通用的请求属性
+        conn.setRequestProperty("Content-Type", "application/json");
+        conn.setRequestProperty("access-token",token);
+        // 建立连接
+        conn.connect();
+        // 读取响应
+        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
+        String inputLine;
+        StringBuilder content = new StringBuilder();
+        while ((inputLine = in.readLine()) != null) {
+            content.append(inputLine);
+        }
+        in.close();
+        conn.disconnect();
+        String data = content.toString();
+        Gson gson = new Gson();
+        JsonObject jsonObject = gson.fromJson(data, JsonObject.class);
+        String code= jsonObject.get("code").getAsString();
+        if(code.equals("0")){
+            JsonObject asJsonArray = jsonObject.get("data").getAsJsonObject();
+            String httpsFlv = asJsonArray.get("https_flv").getAsString();
+            return ExecutedResult.success(httpsFlv);
+        }
+        return ExecutedResult.failed("请求第三方接口返回失败");
+    }
+    public ExecutedResult<String> getToken() throws IOException {
+        //获取缓存中token
+        String token = redisTemplate.opsForValue().get("accessToken");
+        if(StringUtil.isNotNullOrEmpty(token)){
+            return ExecutedResult.success(token);
+        }else {
+            String userName="";
+            String password="";
+            ExecutedResult<List<SysDictDataVO>> wvpLogin = sysDictDataService.getListByType("wvp_login");
+            if(wvpLogin.isSuccess()){
+                List<SysDictDataVO> data = wvpLogin.getData();
+                userName=data.stream().filter(x->x.getDictValue().equals("username")).findFirst().orElse(null).getDictLabel();
+                password=data.stream().filter(x->x.getDictValue().equals("password")).findFirst().orElse(null).getDictLabel();
+            }
+            String httpsURL = "http://120.71.144.117:18097/api/user/login?username="+userName+"&password="+password; // 第三方接口URL
+            URL myURL = new URL(httpsURL);
+            // 打开连接
+            HttpURLConnection conn = (HttpURLConnection) myURL.openConnection();
+            // 设置请求方法为GET
+            conn.setRequestMethod("GET");
+            // 设置通用的请求属性
+            conn.setRequestProperty("Content-Type", "application/json");
+            // 建立连接
+            conn.connect();
+            // 读取响应
+            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
+            String inputLine;
+            StringBuilder content = new StringBuilder();
+            while ((inputLine = in.readLine()) != null) {
+                content.append(inputLine);
+            }
+            in.close();
+            conn.disconnect();
+            String data = content.toString();
+            Gson gson = new Gson();
+            JsonObject jsonObject = gson.fromJson(data, JsonObject.class);
+            JsonObject asJsonArray = jsonObject.get("data").getAsJsonObject();
+            String accessToken = asJsonArray.get("accessToken").getAsString();
+            if(StringUtil.isNotNullOrEmpty(accessToken)){
+                redisTemplate.opsForValue().set("accessToken",accessToken);
+                redisTemplate.expire("accessToken",24, TimeUnit.HOURS);
+                return ExecutedResult.success(accessToken);
+            }
+        }
+        return ExecutedResult.failed("token不存在");
+    }
+    public ExecutedResult<List<MonitorVideoStreamingVO>> getList(List<Long> listId) {
+        List<MonitorVideoStreamingVO> result = new ArrayList<>();
+
+        List<MonitorVideoStreamingPO> list = mapper.getList(listId);
+        if (ListUtil.isNotNullOrEmpty(list)) {
+            // 转换vo
+            result = MonitorVideoStreamingConvert.INSTANCE.toVo(list);
+        }
+        return ExecutedResult.success(result);
+    }
+    public ExecutedResult<MonitorVideoStreamingPO> updateEndTime(String deviceId, String channelId) {
+        MonitorVideoStreamingPO find = mapper.getByDeviceId(deviceId, channelId);
+        if (Objects.isNull(find)) {
+            return ExecutedResult.failed("视频信息不存在");
+        }
+
+        int rowCount = mapper.updateEndTime(find.getId());
+        if (rowCount == 1) {
+            return ExecutedResult.success();
+        }
+        return ExecutedResult.failed("点播续时失败");
+    }
+    public ExecutedResult<PagerResult<MonitorVideoStreamingVO>> search(SearchMonitorVideoStreaming search) {
+        // 处理创建时间范围-查询参数
+        Tuple<String, String> createTimeRange = ParameterUtil.getTimeRange(search.getCreateTimeRange());
+        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem1())) {
+            search.setCreateTimeStart(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem1()).getTime());
+        }
+        if (StringUtil.isNotNullOrEmpty(createTimeRange.getItem2())) {
+            search.setCreateTimeEnd(LocalDateTimeUtil.getTimeStamp(createTimeRange.getItem2()).getTime());
+        }
+
+        PagerResult<MonitorVideoStreamingPO> pageList = mapper.search(search);
+        List<MonitorVideoStreamingVO> listVo = new ArrayList<>();
+        List<MonitorVideoStreamingPO> list = pageList.getList();
+        if (ListUtil.isNotNullOrEmpty(list)) {
+            pageList.setLastId(list.get(list.size() - 1).getId());
+            // 转换vo
+            listVo = MonitorVideoStreamingConvert.INSTANCE.toVo(list);
+        }
+        PagerResult<MonitorVideoStreamingVO> result = new PagerResult<>(pageList.getLimit(), pageList.getPage(), pageList.getTotal(), listVo);
+        result.setLastId(pageList.getLastId());
+        return ExecutedResult.success(result);
+    }
+
+    protected ExecutedResult<MonitorVideoStreamingPO> check4Id(Long id) {
+        MonitorVideoStreamingPO exists = mapper.get(id);
+        if (Objects.isNull(exists)) {
+            return ExecutedResult.failed("[监控视频播放流]不存在:" + id);
+        }
+        return ExecutedResult.success(exists);
+    }
+    protected ExecutedResult<List<MonitorVideoStreamingPO>> check4Id(List<Long> listId) {
+        // 从数据库查找监控视频播放流
+        List<MonitorVideoStreamingPO> list = mapper.getList(listId);
+        if (ListUtil.isNullOrEmpty(list)) {
+            return ExecutedResult.failed("[监控视频播放流]不存在." + listId);
+        }
+        // 数据库找到的id列表
+        List<Long> listIdFind = list.stream().map(MonitorVideoStreamingPO::getId).collect(Collectors.toList());
+        // 数量不一致
+        if (listId.size() != listIdFind.size()) {
+            // 筛选数据库不存在的监控视频播放流
+            List<Long> listIdNotFound = listId.stream().filter(c -> !listIdFind.contains(c)).collect(Collectors.toList());
+            if (ListUtil.isNullOrEmpty(list)) {
+                return ExecutedResult.failed("[监控视频播放流]不存在." + listIdNotFound);
+            }
+        }
+        return ExecutedResult.success(list);
+    }}
diff --git a/src/main/java/com/nanjing/water/service/convert/MonitorVideoStreamingConvert.java b/src/main/java/com/nanjing/water/service/convert/MonitorVideoStreamingConvert.java
new file mode 100644
index 0000000..5da5f36
--- /dev/null
+++ b/src/main/java/com/nanjing/water/service/convert/MonitorVideoStreamingConvert.java
@@ -0,0 +1,48 @@
+/**
+#                                                    __----~~~~~~~~~~~------___
+#                                   .  .   ~~//====......          __--~ ~~
+#                   -.            \_|//     |||\\  ~~~~~~::::... /~
+#                ___-==_       _-~o~  \/    |||  \\            _/~~-
+#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
+#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
+#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
+# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
+# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
+#          '         ~-|      /|    |-~\~~       __--~~
+#                      |-~~-_/ |    |   ~\_   _-~            /\
+#                           /  \     \__   \/~                \__
+#                       _--~ _/ | .-~~____--~-/                  ~~==.
+#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
+#                                 -_     ~\      ~~---l__i__i__i--~~_/
+#                                 _-~-__   ~)  \--______________--~~
+#                               //.-~~~-~_--~- |-------~~~~~~~~
+#                                      //.-~~~--\
+#                  神兽保佑
+#                  永无BUG!
+*/
+package com.nanjing.water.service.convert;
+
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqCreateMonitorVideoStreaming;
+import com.nanjing.water.entity.request.monitorvideostreaming.ReqModifyMonitorVideoStreaming;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+import com.nanjing.water.repository.vo.MonitorVideoStreamingVO;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 监控视频播放流
+ * @author {#=author}
+ */
+@Mapper
+public interface MonitorVideoStreamingConvert {
+    MonitorVideoStreamingConvert INSTANCE = Mappers.getMapper(MonitorVideoStreamingConvert.class);
+
+    MonitorVideoStreamingPO toCreate(ReqCreateMonitorVideoStreaming request);
+    MonitorVideoStreamingPO toModify(ReqModifyMonitorVideoStreaming request);
+
+    MonitorVideoStreamingVO toVo(MonitorVideoStreamingPO item);
+    List<MonitorVideoStreamingVO> toVo(List<MonitorVideoStreamingPO> list);
+}
diff --git a/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java b/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
index e73f819..528851b 100644
--- a/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
+++ b/src/main/java/com/nanjing/water/service/quartz/QuartzExecutor.java
@@ -5,11 +5,15 @@
 import com.google.gson.JsonParser;
 import com.nanjing.water.common.ConstantFactory;
 import com.nanjing.water.common.ExecutedResult;
+import com.nanjing.water.common.util.ListUtil;
 import com.nanjing.water.common.util.LocalDateTimeUtil;
 import com.nanjing.water.common.util.NumericUtil;
 import com.nanjing.water.common.util.StringUtil;
+import com.nanjing.water.repository.impl.MonitorVideoStreamingMapperImpl;
 import com.nanjing.water.repository.impl.QuartzTaskErrorMapperImpl;
 import com.nanjing.water.repository.impl.QuartzTaskRecordMapperImpl;
+import com.nanjing.water.repository.po.MonitorVideoStreamingPO;
+import com.nanjing.water.service.MonitorVideoStreamingService;
 import com.nanjing.water.service.WaterFacilityParameterService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,6 +22,7 @@
 
 import java.lang.reflect.Method;
 import java.time.LocalDateTime;
+import java.util.List;
 import java.util.Objects;
 
 @Service
@@ -30,6 +35,10 @@
     private QuartzTaskErrorMapperImpl taskErrorsDao;
     @Autowired
     private WaterFacilityParameterService waterFacilityParameterService;
+    @Autowired
+    private MonitorVideoStreamingService streamingService;
+    @Autowired
+    private MonitorVideoStreamingMapperImpl streamingMapper;
 
     /**
      * 执行job
@@ -58,6 +67,26 @@
         }
     }
     /***
+     * job执行器-定时关闭直播流
+     */
+    public ExecutedResult<String> stopVideo(String jobParameter) {
+        try {
+            //查询正在直播的列表
+            List<MonitorVideoStreamingPO> list = streamingMapper.list4WaitingStop();
+            if (ListUtil.isNotNullOrEmpty(list)) {
+                for (MonitorVideoStreamingPO po : list) {
+                    ExecutedResult<MonitorVideoStreamingPO> stop = streamingService.stop(po.getDeviceId(), po.getChannelId(), "无人观看,主动断开");
+                    if (stop.isFailed() || Objects.isNull(stop.getData())) {
+                        ExecutedResult.failed("停止点播定时任务调用接口失败!");
+                    }
+                }
+            }
+            return ExecutedResult.success();
+        } catch (Exception e) {
+            return ExecutedResult.failed(e.toString());
+        }
+    }
+    /***
      * job执行器-清理任务调度日志
      * @param jobParameter 执行参数
      */
diff --git a/src/test/java/com/nanjing/water/GenCodeGauss.java b/src/test/java/com/nanjing/water/GenCodeGauss.java
index 0785f5f..98971e5 100644
--- a/src/test/java/com/nanjing/water/GenCodeGauss.java
+++ b/src/test/java/com/nanjing/water/GenCodeGauss.java
@@ -244,7 +244,7 @@
      * 只生成以下配置的表
      */
     private static final List<String> ONLY_TABLES = Arrays.asList(
-     "heartbeat_data"
+     "monitor_video_streaming"
     );
 
     public static void main(String[] args) {

--
Gitblit v1.9.3