aijinhui
2023-08-31 a152548db005be9227730a3166dc233d94a52c5f
Merge remote-tracking branch 'origin/master'
已添加5个文件
已修改9个文件
313 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/domain/ArdWall.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/domain/ArdWallUser.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/mapper/ArdWallMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/alarmpoints/elecwall/service/impl/ArdWallServiceImpl.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/app/position/controller/ArdAppPositionController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/dispatch/service/impl/ArdDispatchPoliceServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/media/service/impl/MediaService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/test/Geo/Geofence.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/test/Geo/GeofenceCallback.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/test/Geo/GeofenceManager.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/test/Geo/main.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/gis/GisUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/alarmpoints/ArdWallMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lib/mediamtx/mediamtx.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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.