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
¶Ô±ÈÐÂÎļþ @@ -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
¶Ô±ÈÐÂÎļþ @@ -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
¶Ô±ÈÐÂÎļþ @@ -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
¶Ô±ÈÐÂÎļþ @@ -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
¶Ô±ÈÐÂÎļþ @@ -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.