ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/domain/ArdWall.java
@@ -1,9 +1,12 @@ package com.ruoyi.alarmpoints.elecwall.domain; import com.ruoyi.common.core.domain.entity.SysUser; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; import java.util.List; /** * 电子围栏管理对象 ard_wall @@ -41,8 +44,19 @@ /** 所属用户 */ @Excel(name = "所属用户") private String userId; /** 关联用户列表 */ @Excel(name = "关联用户列表") List<SysUser> sysUserList; public void setId(String id) public List<SysUser> getSysUserList() { return sysUserList; } public void setSysUserList(List<SysUser> sysUserList) { this.sysUserList = sysUserList; } public void setId(String id) { this.id = id; } ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/domain/ArdWallUser.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.alarmpoints.elecwall.domain; import com.ruoyi.common.annotation.Excel; import lombok.Data; /** * 派警关联用户对象 ard_dispatch_police_user * * @author ard * @date 2023-08-21 */ @Data public class ArdWallUser { private static final long serialVersionUID = 1L; /** 围栏ID */ @Excel(name = "围栏ID") private String wallId; /** 关联用户ID */ @Excel(name = "关联用户ID") private String userId; } ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/mapper/ArdWallMapper.java
@@ -2,6 +2,8 @@ import java.util.List; import com.ruoyi.alarmpoints.elecwall.domain.ArdWall; import com.ruoyi.alarmpoints.elecwall.domain.ArdWallUser; import com.ruoyi.dispatch.domain.ArdDispatchPoliceUser; /** * 电子围栏管理Mapper接口 @@ -58,4 +60,29 @@ * @return 结果 */ public int deleteArdWallByIds(String[] ids); /** * 批量新增围栏关联用户 * * @param ardWallUserList 围栏关联用户列表 * @return 结果 */ public int batchArdWallUser(List<ArdWallUser> ardWallUserList); /** * 通过围栏管理主键删除派警关联用户信息 * * @param id 围栏管理ID * @return 结果 */ public int deleteArdWallUserByWallId(String id); /** * 批量删除围栏关联用户 * * @param ids 需要删除的数据主键集合 * @return 结果 */ public int deleteArdWallUserByWallIds(String[] ids); } ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/service/impl/ArdWallServiceImpl.java
@@ -1,9 +1,16 @@ package com.ruoyi.alarmpoints.elecwall.service.impl; import java.util.ArrayList; import java.util.List; import com.ruoyi.alarmpoints.elecwall.domain.ArdWallUser; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.dispatch.domain.ArdDispatchPolice; import com.ruoyi.dispatch.domain.ArdDispatchPoliceUser; import org.springframework.stereotype.Service; import com.ruoyi.alarmpoints.elecwall.mapper.ArdWallMapper; import com.ruoyi.alarmpoints.elecwall.domain.ArdWall; @@ -53,9 +60,11 @@ @Override public int insertArdWall(ArdWall ardWall) { ardWall.setId(IdUtils.simpleUUID()); ardWall.setCreateBy(SecurityUtils.getUsername()); ardWall.setCreateTime(DateUtils.getNowDate()); return ardWallMapper.insertArdWall(ardWall); ardWall.setCreateBy(SecurityUtils.getUsername()); ardWall.setCreateTime(DateUtils.getNowDate()); int i = ardWallMapper.insertArdWall(ardWall); insertArdWallUser(ardWall); return i; } /** @@ -66,8 +75,10 @@ */ @Override public int updateArdWall(ArdWall ardWall) { ardWall.setUpdateBy(SecurityUtils.getUsername()); ardWall.setUpdateTime(DateUtils.getNowDate()); ardWall.setUpdateBy(SecurityUtils.getUsername()); ardWall.setUpdateTime(DateUtils.getNowDate()); ardWallMapper.deleteArdWallUserByWallId(ardWall.getId()); insertArdWallUser(ardWall); return ardWallMapper.updateArdWall(ardWall); } @@ -79,6 +90,7 @@ */ @Override public int deleteArdWallByIds(String[] ids) { ardWallMapper.deleteArdWallUserByWallIds(ids); return ardWallMapper.deleteArdWallByIds(ids); } @@ -90,6 +102,29 @@ */ @Override public int deleteArdWallById(String id) { ardWallMapper.deleteArdWallUserByWallId(id); return ardWallMapper.deleteArdWallById(id); } /** * 新增电子围栏关联用户信息 * * @param ardWall 电子围栏管理对象 */ public void insertArdWallUser(ArdWall ardWall) { List<SysUser> sysUserList = ardWall.getSysUserList(); String id = ardWall.getId(); if (StringUtils.isNotNull(sysUserList)) { List<ArdWallUser> list = new ArrayList<ArdWallUser>(); for (SysUser user : sysUserList) { ArdWallUser ardWallUser = new ArdWallUser(); ardWallUser.setWallId(id); ardWallUser.setUserId(user.getUserId()); list.add(ardWallUser); } if (list.size() > 0) { ardWallMapper.batchArdWallUser(list); } } } } ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java
@@ -130,7 +130,17 @@ return AjaxResult.success(list); } /** * 获取所有app用户 */ @ApiOperation("获取所有app用户") @GetMapping("/getAppUserList") public AjaxResult getAppUserList(Long deptId) { SysUser user = new SysUser(); user.setDeptId(deptId); List<SysUser> list = sysUserService.selectAllAppUserList(user); return AjaxResult.success(list); } /** * 获取所有app用户 */ @@ -186,6 +196,7 @@ lists.add(offlineMap); return AjaxResult.success(lists); } /** * 获取用户详情 */ ard-work/src/main/java/com/ruoyi/dispatch/service/impl/ArdDispatchPoliceServiceImpl.java
@@ -83,8 +83,7 @@ public int updateArdDispatchPolice(ArdDispatchPolice ardDispatchPolice) { ardDispatchPolice.setUpdateBy(SecurityUtils.getUsername()); ardDispatchPolice.setUpdateTime(DateUtils.getNowDate()); ardDispatchPoliceMapper.deleteArdDispatchPoliceUserByDispatchId(ardDispatchPolice.getId()) ; ardDispatchPoliceMapper.deleteArdDispatchPoliceUserByDispatchId(ardDispatchPolice.getId()); insertArdDispatchPoliceUser(ardDispatchPolice); return ardDispatchPoliceMapper.updateArdDispatchPolice(ardDispatchPolice); } @@ -115,11 +114,6 @@ return ardDispatchPoliceMapper.deleteArdDispatchPoliceById(id); } /** * 新增派警关联用户信息 * * @param ardDispatchPolice 派警管理对象 */ /** * 新增派警关联用户信息 * ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java
@@ -109,9 +109,9 @@ //GPU硬解码编码 -hwaccel cuvid -c:v h264_cuvid 使用cuda解码 -c:v h264_nvenc 使用cuda编码 //String cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport udp -i " + rtspPath + " -c:v h264_nvenc -r 25 -threads 4 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; if (isCode.equals("1")) { String cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -threads 4 -b:v 2048k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; String cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -rtsp_transport tcp -i " + rtspPath + " -vcodec libx264 -preset:v ultrafast -r 25 -threads 6 -b:v 1024k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; if (!softwareDecoding) { cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport udp -i " + rtspPath + " -c:v h264_nvenc -r 25 -threads 4 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; cmd = rootPath + "/lib/mediamtx/" + "ffmpeg -hwaccel cuvid -c:v h264_cuvid -rtsp_transport tcp -i " + rtspPath + " -c:v h264_nvenc -r 25 -threads 6 -b:v 2048k -bf 0 -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH"; } if (mode.equals("1")) { mediaInfo.setRunondemand(cmd); @@ -123,7 +123,7 @@ } else { mediaInfo.setSource(rtspPath); } mediaInfo.setSourceprotocol("udp"); mediaInfo.setSourceprotocol("tcp"); mediaClient.addPath(name, mediaInfo); return rtspUrl; } @@ -141,7 +141,7 @@ info.setMode("1"); } else { runoninit = item.getConf().getRunoninit(); info.setMode("2"); info.setMode("0"); } //RTSP源地址 String regex = "rtsp://[^\\s\"]+"; ard-work/src/main/java/com/ruoyi/test/Geo/Geofence.java
New file @@ -0,0 +1,42 @@ package com.ruoyi.test.Geo; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.utils.gis.Point; import lombok.Data; import java.util.List; /** * @Description: 电子栅栏 * @ClassName: Geofence * @Author: 刘苏义 * @Date: 2023年08月30日9:53:53 **/ @Data public class Geofence { private String id; private List<Point> vertices;//顶点坐标集合 private GeofenceCallback callback;//围栏回调 public Geofence(String id,List<Point> vertices, GeofenceCallback callback) { this.id=id; this.vertices = vertices; this.callback = callback; } public boolean isInside(Point point) { // 实现坐标是否在围栏内的检测逻辑 // 返回 true 如果在围栏内,否则返回 false boolean inPolygon = GisUtil.isInPolygon(point, vertices); return inPolygon ? true : false; } public void checkAndTrigger(String id,Point point, SysUser user) { if (isInside(point)) { callback.onEnter(id,user); } else { callback.onExit(id,user); } } } ard-work/src/main/java/com/ruoyi/test/Geo/GeofenceCallback.java
New file @@ -0,0 +1,14 @@ package com.ruoyi.test.Geo; import com.ruoyi.common.core.domain.entity.SysUser; /** * @Description: 电子围栏回调 * @ClassName: GeofenceCallback * @Author: 刘苏义 * @Date: 2023年08月30日9:53:14 **/ public interface GeofenceCallback { void onEnter(String id,SysUser user); void onExit(String id,SysUser user); } ard-work/src/main/java/com/ruoyi/test/Geo/GeofenceManager.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.test.Geo; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.utils.gis.Point; import java.util.ArrayList; import java.util.List; /** * @Description: 电子围栏管理器 * @ClassName: GeofenceManager * @Author: 刘苏义 * @Date: 2023年08月30日9:54:34 **/ class GeofenceManager { private List<Geofence> geofences; public GeofenceManager() { geofences = new ArrayList<>(); } public void addGeofence(Geofence geofence) { geofences.add(geofence); } public void checkCoordinates(Point coordinates, SysUser user) { for (Geofence geofence : geofences) { geofence.checkAndTrigger(geofence.getId(),coordinates,user); } } } ard-work/src/main/java/com/ruoyi/test/Geo/main.java
New file @@ -0,0 +1,52 @@ package com.ruoyi.test.Geo; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.utils.gis.Point; import java.util.ArrayList; import java.util.List; /** * @Description: * @ClassName: main * @Author: 刘苏义 * @Date: 2023年08月30日9:55:12 **/ class Main { public static void main(String[] args) { GeofenceManager geofenceManager = new GeofenceManager(); GeofenceCallback geofenceCallback= new GeofenceCallback() { @Override public void onEnter(String id,SysUser user) { System.out.println("用户" + user.getUserId() + "进入电子围栏" + id + "区域,触发报警!"); } @Override public void onExit(String id,SysUser user) { System.out.println("用户" + user.getUserId() + "未在电子围栏" + id + "区域。"); } }; List<Point> polygonVertices = new ArrayList<>(); polygonVertices.add(new Point(126.6491, 45.739108)); polygonVertices.add(new Point(126.643458, 45.731584)); polygonVertices.add(new Point(126.654921, 45.726979)); polygonVertices.add(new Point(126.660742, 45.734956)); Geofence geofence = new Geofence("1",polygonVertices, geofenceCallback); geofenceManager.addGeofence(geofence); List<Point> polygonVertices1 = new ArrayList<>(); polygonVertices1.add(new Point(126.655244,45.726576)); polygonVertices1.add(new Point(126.67242,45.720586)); polygonVertices1.add(new Point(126.679606,45.729143)); polygonVertices1.add(new Point(126.660993,45.734881)); Geofence geofence1 = new Geofence("2",polygonVertices1,geofenceCallback); geofenceManager.addGeofence(geofence1); Point userCoordinates = new Point(126.666455,45.727986); SysUser user = new SysUser(); user.setUserId("55555"); geofenceManager.checkCoordinates(userCoordinates, user); } } ard-work/src/main/java/com/ruoyi/utils/gis/GisUtil.java
@@ -108,6 +108,7 @@ } return IsPtInPoly(point,pointList); } /** * 判断点是否在多边形内,如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true * @param point 检测点 ard-work/src/main/resources/mapper/alarmpoints/ArdWallMapper.xml
@@ -16,6 +16,19 @@ <result property="createTime" column="create_time" /> <result property="updateBy" column="update_by" /> <result property="updateTime" column="update_time" /> <!-- 子查询,关联 ard_dispatch_police_user 表 --> <collection property="sysUserList" ofType="java.util.List" select="getSysUserListByMainTableId" column="id"/> </resultMap> <select id="getSysUserListByMainTableId" resultType="SysUser"> SELECT u.* FROM ard_wall_user b left join sys_user u on b.user_id = u.user_id WHERE wall_id = #{id} </select> <resultMap type="SysUser" id="SysUserListResult"> <result property="userId" column="sub_user_id"/> <result property="nickName" column="sub_nick_name"/> <result property="deptId" column="sub_dept_id"/> </resultMap> <sql id="selectArdWallVo"> @@ -96,4 +109,21 @@ #{id} </foreach> </delete> <insert id="batchArdWallUser"> insert into ard_wall_user( wall_id, user_id) values <foreach item="item" index="index" collection="list" separator=","> ( #{item.wallId}, #{item.userId}) </foreach> </insert> <delete id="deleteArdWallUserByWallId" parameterType="String"> delete from ard_wall_user where wall_id = #{wallId} </delete> <delete id="deleteArdWallUserByWallIds" parameterType="String"> delete from ard_wall_user where wall_id in <foreach item="wallId" collection="array" open="(" separator="," close=")"> #{wallId} </foreach> </delete> </mapper> lib/mediamtx/mediamtx.yml
@@ -206,7 +206,7 @@ # STUN servers are used to obtain the public IP of server and clients. They are # needed when server and clients are on different LANs. # TURN/TURNS servers are needed when a direct connection between server and # clients is not possible. All traffic is routed through them. # clients is not possible. All traffic is routed through them. stun:stun.l.google.com:19302 - url: stun:stun.l.google.com:19302 # if user is "AUTH_SECRET", then authentication is secret based. # the secret must be inserted into the password field.