f6abc8c724eed706487b7616bc6c816e5db5c939..0f2fc0872069f0a5099cc535e6ff885b13937153
3 天以前 czt
网关配置页面
0f2fc0 对比 | 目录
3 天以前 czt
修改实体类字段
2e2011 对比 | 目录
3 天以前 sgj
抓拍配置修改
f0a322 对比 | 目录
3 天以前 sgj
注释完善
aa0049 对比 | 目录
3 天以前 sgj
电子巡更,巡更详情,巡更轨迹图添加
1e0b15 对比 | 目录
已重命名1个文件
已删除2个文件
已修改19个文件
已添加17个文件
2732 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/GatewaySer.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Patrol.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolConf.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolKey.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GatewaySerMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GatewaySerService.java 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PatrolRecordService.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PatrolService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapConfService.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapRecordService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/GatewaySer.view.xml 283 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/GatewaySerPR.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConf.view.xml 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-view/src/main/java/models/core.model.xml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/EventInfoController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/PatrolRecordController.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SnapConfController.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SnapRecordController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolConfManager.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolManager.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolRecordManager.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SnapConfManager.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/patrol/patrolRecord-style.css 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/patrol/patrolRecord.js 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/snap/snapRecord.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/eventInfo/eventInfo.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrol.html 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolConf/patrolConf.html 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolRecord/patrolRecord.html 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolRecord/trajectoryMap.html 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/add.html 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/edit.html 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/snapConf.html 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/snap/snapRecord/snapRecord.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/constant/RedisConst.java
@@ -85,6 +85,11 @@
    public static final String KEY_DEVICE_SER_LIST = "SER_LIST";
    /**
     * ç½‘å…³KEY
     */
    public static final String KEY_GATEWAY_SER_LIST = "GATEWAY_LIST";
    /**
     * è®¾å¤‡åˆ—表
     */
    public static final String KEY_DEVICE_LIST = "DEVICE_LIST";
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/GatewaySer.java
ÎļþÃû´Ó fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/SnapSer.java ÐÞ¸Ä
@@ -12,16 +12,16 @@
import java.io.Serializable;
/**
 * @Description æŠ“拍服务
 * @Description ç½‘关配置
 * @Author CZT
 * @Date 2025/11/25 19:43
 * @Date 2025/12/10 15:25
 */
@Data
@Entity
@Table(name = "d_snap_ser")
@TableName("d_snap_ser")
@Table(name = "d_gateway_ser")
@TableName("d_gateway_ser")
@EqualsAndHashCode(callSuper = false)
public class SnapSer extends BizBaseEntity implements Serializable {
public class GatewaySer extends BizBaseEntity implements Serializable {
    /**
     *
@@ -29,7 +29,7 @@
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id", columnDefinition = "varchar(40) COMMENT '主键'")
    @Column(name = "id", columnDefinition = "varchar(40) COMMENT '网关ID'")
    @TableField("id")
    private String id;
@@ -37,30 +37,38 @@
    @TableField("dept_id")
    private String deptId;
    @Column(name = "sort", columnDefinition = "varchar(2) COMMENT '配套序号'")
    @TableField("sort")
    private String sort = "1";
    @Column(name = "sn", columnDefinition = "varchar(40) COMMENT '序列号'")
    @TableField("sn")
    private String sn;
    @Column(name = "name", columnDefinition = "varchar(40) COMMENT '设备名称'")
    @Column(name = "name", columnDefinition = "varchar(40) COMMENT '网关名称'")
    @TableField("name")
    private String name;
    @Column(name = "ip", columnDefinition = "varchar(20) COMMENT '设备IP'")
    @TableField("ip")
    private String ip;
    @Column(name = "port", columnDefinition = "int(5) COMMENT '端口'")
    @TableField("port")
    private Integer port;
    @Column(name = "status", columnDefinition = "varchar(2) COMMENT '是否在线'")
    @TableField("status")
    private String status = Constant.YN_N;
    @Column(name = "ip", columnDefinition = "varchar(20) COMMENT '网关IP'")
    @TableField("ip")
    private String ip;
    @Column(name = "port", columnDefinition = "int(5) COMMENT '网关端口'")
    @TableField("port")
    private Integer port;
    @Column(name = "snap_url", columnDefinition = "varchar(20) COMMENT '抓拍路径'")
    @TableField("snap_url")
    private String snapUrl;
    @Column(name = "ptz_url", columnDefinition = "varchar(20) COMMENT '云台路径'")
    @TableField("ptz_url")
    private String ptzUrl;
    @Column(name = "order_num", columnDefinition = "int(5) COMMENT '顺序号'")
    @TableField("order_num")
    private Integer orderNum = 1;
    @Column(name = "remark", columnDefinition = "varchar(100) COMMENT '备注说明'")
    @TableField("remark")
    private String remark;
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/Patrol.java
@@ -5,10 +5,7 @@
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
import java.io.Serializable;
@Data
@@ -16,6 +13,7 @@
@Table(name = "d_patrol")
@TableName("d_patrol")
@EqualsAndHashCode(callSuper = false)
@IdClass(PatrolKey.class)
public class Patrol extends BizBaseEntity implements Serializable {
    /**
@@ -28,15 +26,22 @@
    @TableField("id")
    private String id;
    @Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '所属库区'")
    @TableField("dept_id")
    private String deptId;
    @Id
    @Column(name = "user_id", columnDefinition = "varchar(40) COMMENT '巡逻人账号'")
    @TableField("user_id")
    private String userId;
    @Id
    @Column(name = "batch_id", columnDefinition = "varchar(40) COMMENT '班次编号'")
    @TableField("batch_id")
    private String batchId;
    @Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '所属库区'")
    @TableField("dept_id")
    private String deptId;
    @Column(name = "user_name", columnDefinition = "varchar(40) COMMENT '巡逻人'")
    @TableField("user_name")
    private String userName;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolConf.java
@@ -12,6 +12,7 @@
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
@Data
@Entity
@@ -31,6 +32,10 @@
    @TableField("batch_id")
    private String batchId;
    @Column(name = "dept_id", columnDefinition = "varchar(40) COMMENT '所属库区'")
    @TableField("dept_id")
    private String deptId;
    @Column(name = "batch_name", columnDefinition = "varchar(40) COMMENT '班次名称'")
    @TableField("batch_name")
    private String batchName;
@@ -39,4 +44,12 @@
    @TableField("user_name")
    private String userName;
    @Column(name = "start", columnDefinition = "datetime COMMENT '起始时间'")
    @TableField("start")
    private Date start;
    @Column(name = "end", columnDefinition = "datetime COMMENT '截止时间'")
    @TableField("end")
    private Date end;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolKey.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.fzzy.igds.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.io.Serializable;
/**
 * @Description ä¸»é”®ID
 * @Author CZT
 * @Date 2025/11/26 10:18
 */
@Data
@AllArgsConstructor
public class PatrolKey implements Serializable {
        private String id;
        private String userId;
        private String batchId;
    public PatrolKey(){
            super();
        }
    }
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/PatrolRecord.java
@@ -42,11 +42,6 @@
    @TableField("point_name")
    private String pointName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(name = "create_time", columnDefinition = "datetime COMMENT '巡逻时间'")
    @TableField("create_time")
    private Date createTime;
    @Column(name = "longitude", columnDefinition = "decimal(20,6) COMMENT '经度'")
    @TableField("longitude")
    private String longitude;
@@ -68,6 +63,7 @@
    //巡更照片全路径
    @Transient
    @TableField(exist = false)
    private String imgPath;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/GatewaySerMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.fzzy.igds.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fzzy.igds.domain.GatewaySer;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Description
 * @Author CZT
 * @Date 2025/12/10 16:48
 */
@Mapper
public interface GatewaySerMapper extends BaseMapper<GatewaySer> {
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GatewaySerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,248 @@
package com.fzzy.igds.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.constant.RedisConst;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.mapper.GatewaySerMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
 * @Description
 * @Author CZT
 * @Date 2025/12/10 16:48
 */
@Slf4j
@Service
public class GatewaySerService {
    @Resource
    private GatewaySerMapper gatewaySerMapper;
    @Resource
    private ISysDeptService iSysDeptService;
    @Resource
    private RedisCache redisCache;
    /**
     * æ ¹æ®æ¡ä»¶æŸ¥è¯¢åˆ†æœºä¿¡æ¯
     *
     * @param companyId
     * @param deptId
     * @param parentId
     * @return
     */
    public List<GatewaySer> listDeviceSer(String companyId, String deptId, String parentId) {
        QueryWrapper<GatewaySer> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotBlank(companyId)) {
            queryWrapper.eq("company_id", companyId);
        }
        if (StringUtils.isNotBlank(deptId)) {
            queryWrapper.eq("dept_id", deptId);
        }
        if (StringUtils.isNotBlank(parentId)) {
            queryWrapper.likeRight("dept_id", parentId);
        }
        return gatewaySerMapper.selectList(queryWrapper);
    }
    /**
     * æŸ¥è¯¢åˆ†æœºåˆ—表
     *
     * @return
     */
    public List<GatewaySer> getAllSer() {
        SysUser user = ContextUtil.getLoginUser();
        SysDept userDept = iSysDeptService.selectDeptById(user.getDeptId());
        if (Constant.DEPT_TYPE_20.equals(userDept.getType())) {
            return this.listDeviceSer(null, user.getDeptId() + "", null);
        } else {
            return this.listDeviceSer(null, null, user.getDeptId() + "");
        }
    }
    /**
     * æ ¹æ®æ¡ä»¶æŸ¥è¯¢åˆ†æœºä¿¡æ¯
     *
     * @param id
     * @return
     */
    public GatewaySer getById(String id) {
        if(StringUtils.isBlank( id)){
            return null;
        }
        return gatewaySerMapper.selectById(id);
    }
    /**
     * æ›´æ–°ä¿å­˜åˆ†æœº
     *
     * @param ser
     */
    public void saveSer(GatewaySer ser) {
        if (null == ser.getSn()) {
            ser.setSn(ser.getId());
        }
        if(null == ser.getOrderNum()){
            ser.setOrderNum(1);
        }
        if (StringUtils.isEmpty(ser.getCompanyId())) {
            ser.setCompanyId(ContextUtil.getCompanyId());
        }
        if (StringUtils.isEmpty(ser.getDeptId())) {
            ser.setDeptId(ContextUtil.subDeptId(null));
        }
        if (StringUtils.isBlank(ser.getUpdateBy())) {
            ser.setCreateBy(ContextUtil.getLoginUserName());
            ser.setCreateTime(new Date());
            ser.setUpdateBy(ContextUtil.getLoginUserName());
            ser.setUpdateTime(new Date());
            gatewaySerMapper.insert(ser);
        } else {
            ser.setUpdateBy(ContextUtil.getLoginUserName());
            ser.setUpdateTime(new Date());
            gatewaySerMapper.updateById(ser);
        }
        refreshCache(ser.getCompanyId());
    }
    /**
     * æ›´æ–°ä¿å­˜åˆ†æœº
     *
     * @param ser
     */
    public void delSer(GatewaySer ser) {
        gatewaySerMapper.deleteById(ser);
        //删除缓存
        delCache(ser);
    }
    /**
     * æ ¹æ®åˆ†æœºID获取分机信息
     *
     * @param companyId
     * @param deptId
     * @return
     */
    public List<GatewaySer> getCacheSerByDeptId(String companyId, String deptId) {
        if (StringUtils.isEmpty(deptId)) {
            return null;
        }
        if (StringUtils.isEmpty(companyId)) {
            companyId = ContextUtil.getCompanyId();
        }
        String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE_SER_LIST, deptId) + "*";
        Collection<String> keys = redisCache.keys(patten);
        if (null == keys) {
            return null;
        }
        List<GatewaySer> list = new ArrayList<>();
        for (String key : keys) {
            list.add((GatewaySer) redisCache.getCacheObject(key));
        }
        return list;
    }
    /**
     * æ ¹æ®åˆ†æœºID获取分机信息
     *
     * @param companyId
     * @param id
     * @return
     */
    public GatewaySer getCacheSerById(String companyId, String id) {
        if (StringUtils.isEmpty(id)) {
            return null;
        }
        if (StringUtils.isEmpty(companyId)) {
            companyId = ContextUtil.getCompanyId();
        }
        String patten = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE_SER_LIST) + "*";
        Collection<String> keys = redisCache.keys(patten);
        if (null == keys) {
            return null;
        }
        List<GatewaySer> list = new ArrayList<>();
        GatewaySer ser = null;
        for (String key : keys) {
            ser = (GatewaySer) redisCache.getCacheObject(key);
            if(id.equals(ser.getId())){
                break;
            }
        }
        if(null == ser){
            ser = getById(id);
            this.setCacheSer(ser);
        }
        return ser;
    }
    /**
     * åˆ·æ–°ç¼“å­˜
     *
     * @param companyId
     */
    public void refreshCache(String companyId) {
        if (StringUtils.isEmpty(companyId)) {
            companyId = ContextUtil.getCompanyId();
        }
        List<GatewaySer> list = this.listDeviceSer(companyId, null, null);
        this.setCacheSer(list);
    }
    /**
     * è®¾ç½®ç¼“å­˜
     * @param data
     */
    public void setCacheSer(GatewaySer data) {
        if (null == data) {
            return;
        }
        String key = RedisConst.buildKey(data.getCompanyId(), RedisConst.KEY_GATEWAY_SER_LIST, data.getDeptId(), data.getId());
        redisCache.setCacheObject(key, data);
    }
    /**
     * è®¾ç½®ç¼“å­˜
     * @param data
     */
    public void setCacheSer(List<GatewaySer> data) {
        if (null == data) {
            return;
        }
        for (GatewaySer ser : data) {
            this.setCacheSer( ser);
        }
    }
    /**
     * åˆ é™¤ç¼“存信息
     * @param ser
     */
    public void delCache(GatewaySer ser) {
        if (null == ser) {
            return;
        }
        String key = RedisConst.buildKey(ser.getCompanyId(), RedisConst.KEY_GATEWAY_SER_LIST, ser.getDeptId(), ser.getId());
        redisCache.deleteObject(key);
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PatrolRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.fzzy.igds.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fzzy.igds.data.BaseResp;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.domain.PatrolRecord;
import com.fzzy.igds.mapper.PatrolRecordMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class PatrolRecordService {
    @Resource
    private PatrolRecordMapper patrolRecordMapper;
    /**
     * åˆ†é¡µæŸ¥è¯¢æ•°æ®
     *
     * @param page
     * @param param
     */
    public void listPage(Page<PatrolRecord> page, IgdsBaseParam param) {
        QueryWrapper<PatrolRecord> queryWrapper = getQueryWrapper(param);
        patrolRecordMapper.selectPage(page, queryWrapper);
    }
    public List<PatrolRecord> listAll(IgdsBaseParam param) {
        QueryWrapper<PatrolRecord> queryWrapper = getQueryWrapper(param);
        return patrolRecordMapper.selectList(queryWrapper);
    }
    /**
     * å°è£…查询条件
     *
     * @param param
     */
    public QueryWrapper<PatrolRecord> getQueryWrapper(IgdsBaseParam param) {
        QueryWrapper<PatrolRecord> queryWrapper = new QueryWrapper<>();
        param.setCompanyId(ContextUtil.getCompanyId());
        queryWrapper.eq("company_id", param.getCompanyId());
        if (StringUtils.isNotBlank(param.getName())) {
            queryWrapper.eq("point_name", param.getName());
        }
        if (StringUtils.isNotBlank(param.getKey())) {
            queryWrapper.eq("patrol_id", param.getKey());
        }
        queryWrapper.orderByDesc("id");
        return queryWrapper;
    }
    /**
     * æ·»åŠ æ•°æ®
     *
     * @param patrolRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp addData(PatrolRecord patrolRecord) {
        patrolRecord.setId(ContextUtil.generateId());
        patrolRecord.setCompanyId(ContextUtil.getCompanyId());
        patrolRecord.setUpdateBy(ContextUtil.getLoginUserName());
        patrolRecord.setUpdateTime(new Date());
        patrolRecord.setCreateBy(ContextUtil.getLoginUserName());
        patrolRecord.setCreateTime(new Date());
        return patrolRecordMapper.insert(patrolRecord) > 0 ? BaseResp.success() : BaseResp.error("添加失败");
    }
    /**
     * æ›´æ–°æ•°æ®
     *
     * @param patrolRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp updateData(PatrolRecord patrolRecord) {
        patrolRecord.setUpdateBy(ContextUtil.getLoginUserName());
        patrolRecord.setUpdateTime(new Date());
        return patrolRecordMapper.updateById(patrolRecord) > 0 ? BaseResp.success() : BaseResp.error("更新失败");
    }
    /**
     * åˆ é™¤æ•°æ®
     *
     * @param patrolRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp deleteData(PatrolRecord patrolRecord) {
        return patrolRecordMapper.deleteById(patrolRecord) > 0 ? BaseResp.success() : BaseResp.error("删除失败");
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/PatrolService.java
@@ -43,10 +43,24 @@
        return queryWrapper;
    }
    /**
     * é€šè¿‡id查询单条数据
     *
     * @param id
     * @author sgj
     * @date 2025/12/10
     */
    public Patrol selectById(String id) {
        return patrolMapper.selectById(id);
    }
    /**
     * æ–°å¢žæ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public int insertData(Patrol param) {
        if (StringUtils.isEmpty(param.getId())) {
            param.setId(ContextUtil.generateId());
@@ -54,11 +68,25 @@
        return patrolMapper.insert(param);
    }
    /**
     * æ›´æ–°æ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public int updateData(Patrol param) {
        return patrolMapper.updateById(param);
    }
    public void deleteDataById( String ids) {
    /**
     * é€šè¿‡id删除一条数据
     *
     * @param ids
     * @author sgj
     * @date 2025/12/10
     */
    public void deleteDataById(String ids) {
        String[] recordIds = Convert.toStrArray(ids);
        for (String recordId : recordIds) {
            patrolMapper.deleteById(recordId);
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapConfService.java
@@ -6,6 +6,7 @@
import com.fzzy.igds.domain.SnapConf;
import com.fzzy.igds.mapper.SnapConfMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -21,36 +22,83 @@
    @Resource
    private SnapConfMapper snapConfMapper;
    public List<SnapConf> listAll(IgdsBaseParam param) {
        if (null == param)
            return snapConfMapper.selectList(null);
        QueryWrapper<SnapConf> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotEmpty(param.getName())) {
            queryWrapper.like("name", param.getName());
        }
    /**
     * æŸ¥è¯¢åˆ—表数据
     *
     * @param param æŸ¥è¯¢å‚æ•°
     * @return æ•°æ®åˆ—表
     */
    public List<SnapConf> selectList(SnapConf param) {
        QueryWrapper<SnapConf> queryWrapper = getQueryWrapper(param);
        return snapConfMapper.selectList(queryWrapper);
    }
    public BaseResp addData(SnapConf snapConf) {
        snapConf.setId(ContextUtil.generateId());
        snapConf.setCompanyId(ContextUtil.getCompanyId());
        snapConf.setUpdateBy(ContextUtil.getLoginUserName());
        snapConf.setUpdateTime(new Date());
        snapConf.setCreateBy(ContextUtil.getLoginUserName());
        snapConf.setCreateTime(new Date());
        return snapConfMapper.insert(snapConf) > 0 ? BaseResp.success() : BaseResp.error("添加失败");
    /**
     * å°è£…查询条件
     *
     * @param param æŸ¥è¯¢å‚æ•°
     * @return æŸ¥è¯¢æž„造器
     */
    public QueryWrapper<SnapConf> getQueryWrapper(SnapConf param) {
        QueryWrapper<SnapConf> queryWrapper = new QueryWrapper<>();
        // è®¾ç½®å…¬å¸ID并作为查询条件
        param.setCompanyId(ContextUtil.getCompanyId());
        queryWrapper.eq("company_id", param.getCompanyId());
        // æŒ‰åˆ›å»ºæ—¶é—´å€’序排序
        queryWrapper.orderByDesc("create_time");
        return queryWrapper;
    }
    public BaseResp updateData(SnapConf snapConf) {
        snapConf.setUpdateBy(ContextUtil.getLoginUserName());
        snapConf.setUpdateTime(new Date());
        return snapConfMapper.updateById(snapConf) > 0 ? BaseResp.success() : BaseResp.error("更新失败");
    /**
     * æ ¹æ®ID查询详情
     *
     * @param id ä¸»é”®ID
     * @return å®žä½“对象
     */
    public SnapConf selectById(String id) {
        return snapConfMapper.selectById(id);
    }
    public BaseResp deleteData(SnapConf snapConf) {
        return snapConfMapper.deleteById(snapConf) > 0 ? BaseResp.success() : BaseResp.error("删除失败");
    /**
     * æ’入新数据
     *
     * @param param æ•°æ®å®žä½“
     * @return å½±å“è¡Œæ•°
     */
    public int insertData(SnapConf param) {
        param.setId(ContextUtil.generateId());
        param.setCompanyId(ContextUtil.getCompanyId());
        param.setUpdateBy(ContextUtil.getLoginUserName());
        param.setUpdateTime(new Date());
        param.setCreateBy(ContextUtil.getLoginUserName());
        param.setCreateTime(new Date());
        return snapConfMapper.insert(param);
    }
    /**
     * æ›´æ–°å·²æœ‰æ•°æ®
     *
     * @param param æ•°æ®å®žä½“
     * @return å½±å“è¡Œæ•°
     */
    public int updateData(SnapConf param) {
        param.setUpdateBy(ContextUtil.getLoginUserName());
        param.setUpdateTime(new Date());
        return snapConfMapper.updateById(param);
    }
    /**
     * åˆ é™¤æŒ‡å®šID的数据
     *
     * @param ids è¦åˆ é™¤çš„记录ID集合(逗号分隔)
     */
    public void deleteDataById(String ids) {
        String[] recordIds = Convert.toStrArray(ids);
        for (String recordId : recordIds) {
            snapConfMapper.deleteById(recordId);
        }
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapRecordService.java
@@ -52,6 +52,13 @@
        return queryWrapper;
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰æ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public List<SnapRecord> listAll(IgdsBaseParam param) {
        if (null == param)
@@ -64,6 +71,13 @@
        return snapRecordMapper.selectList(queryWrapper);
    }
    /**
     * æ–°å¢žæ•°æ®
     *
     * @param snapRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp addData(SnapRecord snapRecord) {
        snapRecord.setId(ContextUtil.generateId());
        snapRecord.setCompanyId(ContextUtil.getCompanyId());
@@ -74,12 +88,26 @@
        return snapRecordMapper.insert(snapRecord) > 0 ? BaseResp.success() : BaseResp.error("添加失败");
    }
    /**
     * æ›´æ–°æ•°æ®
     *
     * @param snapRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp updateData(SnapRecord snapRecord) {
        snapRecord.setUpdateBy(ContextUtil.getLoginUserName());
        snapRecord.setUpdateTime(new Date());
        return snapRecordMapper.updateById(snapRecord) > 0 ? BaseResp.success() : BaseResp.error("更新失败");
    }
    /**
     * åˆ é™¤æ•°æ®
     *
     * @param snapRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp deleteData(SnapRecord snapRecord) {
        return snapRecordMapper.deleteById(snapRecord) > 0 ? BaseResp.success() : BaseResp.error("删除失败");
    }
fzzy-igdss-view/src/main/java/com/fzzy/igds/GatewaySer.view.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,283 @@
<?xml version="1.0" encoding="UTF-8"?>
<ViewConfig>
  <Arguments/>
  <Context/>
  <Model/>
  <View layout="padding:10">
    <ClientEvent name="onReady">&#xD;
addData = function(){&#xD;
    view.get(&quot;#dsGatewaySer&quot;).insert();&#xD;
    view.get(&quot;#dialog1&quot;).set(&quot;caption&quot;,&quot;网关信息&quot;);&#xD;
&#xD;
    view.get(&quot;#dialog1&quot;).show();&#xD;
};&#xD;
&#xD;
delData = function(){&#xD;
    var cur = view.get(&quot;#dsGatewaySer.data:#&quot;);&#xD;
    if(!cur) return;&#xD;
    cur.setState(dorado.Entity.STATE_DELETED);&#xD;
    $confirm(&quot;确定要删除该数据么?&quot;,function(){&#xD;
        view.get(&quot;#uaSave&quot;).execute(function(){&#xD;
            cur.remove();&#xD;
        });&#xD;
    });&#xD;
};&#xD;
&#xD;
btnCancel = function(){&#xD;
    view.get(&quot;#dialog1&quot;).hide();&#xD;
};&#xD;
&#xD;
onDialogHide = function(){&#xD;
    var cur = view.get(&quot;#dsGatewaySer.data:#&quot;);&#xD;
    cur.cancel();&#xD;
};</ClientEvent>
    <Property name="packages">font-awesome,css-common</Property>
    <Property name="cache">
      <Property name="mode">clientSide</Property>
    </Property>
    <DataSet id="dsGatewaySer">
      <Property name="parameter"></Property>
      <Property name="dataProvider">gatewaySerPR#getAllSer</Property>
      <Property name="dataType">[dtGatewaySer]</Property>
    </DataSet>
    <Container>
      <Property name="className">c-param</Property>
      <ToolBar>
        <ToolBarButton>
          <ClientEvent name="onClick">addData();</ClientEvent>
            <Property name="caption">新增</Property>
            <Property name="exClassName">btn1</Property>
            <Property name="width">100</Property>
            <Property name="iconClass">fa fa-plus</Property>
        </ToolBarButton>
        <ToolBarButton>
          <ClientEvent name="onClick">&#xD;
var select = view.get(&quot;#dataGridMain&quot;).get(&quot;selection&quot;);&#xD;
if(select){&#xD;
    view.get(&quot;#dialog1&quot;).show();&#xD;
}else{&#xD;
    $notify(&quot;请选择需要修改的数据……&quot;);&#xD;
}</ClientEvent>
          <Property name="caption">修改</Property>
          <Property name="exClassName">btn2</Property>
          <Property name="width">100</Property>
          <Property name="iconClass">fa fa-pencil-square-o</Property>
        </ToolBarButton>
        <ToolBarButton>
          <ClientEvent name="onClick">
var select = view.get(&quot;#dataGridMain&quot;).get(&quot;selection&quot;);&#xD;
if(select){&#xD;
    view.get(&quot;#ajaxActionDel&quot;).set(&quot;parameter&quot;,{&#xD;id: select.get(&quot;id&quot;)&#xD;
        }).execute(function(){&#xD;
        select.remove();&#xD;
    });&#xD;
}else{&#xD;
    $notify(&quot;请选择需要删除的数据……&quot;);&#xD;
}&#xD;</ClientEvent>
          <Property name="caption">删除</Property>
          <Property name="exClassName">btn3</Property>
          <Property name="width">100</Property>
          <Property name="iconClass">fa fa-times</Property>
          <Property name="action">ajaxActionDel</Property>
        </ToolBarButton>
        <ToolBarButton>
          <ClientEvent name="onClick">view.get(&quot;#dsGatewaySer&quot;).flushAsync();&#xD;
          </ClientEvent>
          <Property name="caption">刷新数据</Property>
          <Property name="exClassName">btn2</Property>
          <Property name="iconClass">fa fa-refresh</Property>
        </ToolBarButton>
        <ToolBarButton>
          <Property name="caption">刷新缓存</Property>
          <Property name="exClassName">btn4</Property>
          <Property name="iconClass">fa fa-refresh</Property>
          <Property name="width">100</Property>
          <Property name="action">ajaxRefreshCache</Property>
        </ToolBarButton>
      </ToolBar>
      <DataGrid id="dataGridMain" layoutConstraint="padding:8">
        <ClientEvent name="onDataRowClick">view.get(&quot;#dataGridMain&quot;).set(&quot;selection&quot;,arg.data);</ClientEvent>
        <Property name="dataSet">dsGatewaySer</Property>
        <Property name="readOnly">true</Property>
        <Property name="selectionMode">singleRow</Property>
        <RowSelectorColumn/>
        <RowNumColumn/>
        <DataColumn name="id">
          <Property name="property">id</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="name">
          <Property name="property">name</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="deptId">
          <Property name="property">deptId</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="ip">
          <Property name="property">ip</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="port">
          <Property name="property">port</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="status">
          <ClientEvent name="onRenderCell">arg.dom.style.background = arg.data.get(&quot;status&quot;)== 'Y' ?&quot;&quot;:&quot;#FF5722&quot;;&#xD;
arg.processDefault = true;</ClientEvent>
          <Property name="property">status</Property>
          <Property name="align">center</Property>
          <Property name="width">120</Property>
        </DataColumn>
        <DataColumn name="updateBy">
          <Property name="property">updateBy</Property>
          <Property name="align">center</Property>
        </DataColumn>
        <DataColumn name="updateTime">
          <Property name="property">updateTime</Property>
          <Property name="align">center</Property>
          <Property name="width">180</Property>
        </DataColumn>
      </DataGrid>
    </Container>
    <Dialog id="dialog1" layout="regionPadding:8">
      <ClientEvent name="onHide">onDialogHide();</ClientEvent>
      <Property name="iconClass">fa fa-tasks</Property>
      <Property name="width">1200</Property>
      <Property name="caption">网关信息</Property>
      <Property name="closeable">false</Property>
      <Buttons>
        <Button>
          <ClientEvent name="onClick">var cur = view.get(&quot;#dsGatewaySer.data:#&quot;);&#xD;
if(cur.validate() == 'ok'){&#xD;
    view.get(&quot;#updateAction&quot;).execute(function(){&#xD;
        view.get(&quot;#dialog1&quot;).close();&#xD;
    });&#xD;
}else{&#xD;
    $alert(&quot;数据校验失败!&quot;);&#xD;
}</ClientEvent>
          <Property name="caption">保存</Property>
          <Property name="iconClass">fa fa-check-circle</Property>
          <Property name="exClassName">btn1</Property>
          <Property name="width">120</Property>
        </Button>
        <Button>
          <ClientEvent name="onClick">btnCancel();</ClientEvent>
          <Property name="caption">取消</Property>
          <Property name="exClassName">btn3</Property>
          <Property name="iconClass">fa fa-times-circle</Property>
          <Property name="width">120</Property>
        </Button>
      </Buttons>
      <Children>
        <FieldSet layout="padding:5">
          <Property name="caption">基本信息</Property>
          <Buttons/>
          <Children>
            <AutoForm>
              <Property name="dataSet">dsGatewaySer</Property>
              <Property name="cols">*,*,*</Property>
              <Property name="labelSeparator">:</Property>
              <Property name="labelAlign">right</Property>
              <Property name="labelWidth">100</Property>
              <AutoFormElement>
                <Property name="name">id</Property>
                <Property name="property">id</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">name</Property>
                <Property name="property">name</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">deptId</Property>
                <Property name="property">deptId</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">sn</Property>
                <Property name="property">sn</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">ip</Property>
                <Property name="property">ip</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">port</Property>
                <Property name="property">port</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">snapUrl</Property>
                <Property name="property">snapUrl</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">status</Property>
                <Property name="property">status</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">ptzUrl</Property>
                <Property name="property">ptzUrl</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">orderNum</Property>
                <Property name="property">orderNum</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement layoutConstraint="colSpan:2">
                <Property name="name">remark</Property>
                <Property name="property">remark</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">createBy</Property>
                <Property name="property">createBy</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">createTime</Property>
                <Property name="property">createTime</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">updateBy</Property>
                <Property name="property">updateBy</Property>
                <Editor/>
              </AutoFormElement>
              <AutoFormElement>
                <Property name="name">updateTime</Property>
                <Property name="property">updateTime</Property>
                <Editor/>
              </AutoFormElement>
            </AutoForm>
          </Children>
        </FieldSet>
      </Children>
      <Tools/>
    </Dialog>
    <UpdateAction id="updateAction">
      <Property name="dataResolver">gatewaySerPR#updateSer</Property>
      <UpdateItem>
        <Property name="dataSet">dsGatewaySer</Property>
        <Property name="dataPath">[#current]</Property>
      </UpdateItem>
    </UpdateAction>
    <AjaxAction id="ajaxActionDel">
      <Property name="service">gatewaySerPR#delSerById</Property>
      <Property name="confirmMessage">确定要删除么?</Property>
      <Property name="executingMessage">正在删除</Property>
      <Property name="successMessage">删除成功</Property>
    </AjaxAction>
    <AjaxAction id="ajaxRefreshCache">
      <Property name="service">gatewaySerPR#refreshCache</Property>
      <Property name="successMessage">刷新成功!</Property>
      <Property name="confirmMessage">确定要刷新缓存么?</Property>
    </AjaxAction>
  </View>
</ViewConfig>
fzzy-igdss-view/src/main/java/com/fzzy/igds/GatewaySerPR.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.fzzy.igds;
import com.bstek.dorado.annotation.DataProvider;
import com.bstek.dorado.annotation.DataResolver;
import com.bstek.dorado.annotation.Expose;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.service.GatewaySerService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Description
 * @Author CZT
 * @Date 2025/12/10 16:48
 */
@Component
public class GatewaySerPR {
    @Resource
    private GatewaySerService gatewaySerService;
    /**
     * gatewaySerPR#getAllSer
     *
     * @return
     */
    @DataProvider
    public List<GatewaySer> getAllSer() {
        return gatewaySerService.getAllSer();
    }
    /**
     * deviceSerPR#updateSer
     *
     * @param data
     */
    @DataResolver
    public void updateSer(GatewaySer data) {
        GatewaySer ser = new GatewaySer();
        BeanUtils.copyProperties(data, ser);
        gatewaySerService.saveSer(ser);
    }
    /**
     * æ ¹æ®åˆ†æœºid和名称删除分机
     */
    @Expose
    @Transactional
    public void delSerById(String id) {
        GatewaySer ser = gatewaySerService.getById(id);
        gatewaySerService.delSer(ser);
    }
    /**
     * deviceSerPR#refreshCache
     *
     * @throws
     * @Title: refreshCache
     * @Description: åˆ·æ–°ç¼“å­˜ void
     */
    @Expose
    public void refreshCache() {
        gatewaySerService.refreshCache(null);
    }
}
fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConf.view.xml
ÎļþÒÑɾ³ý
fzzy-igdss-view/src/main/java/com/fzzy/igds/SnapConfPR.java
ÎļþÒÑɾ³ý
fzzy-igdss-view/src/main/java/models/core.model.xml
@@ -1325,4 +1325,88 @@
      <Property name="readOnly">true</Property>
    </PropertyDef>
  </DataType>
  <DataType name="dtGatewaySer">
    <Property name="creationType">com.fzzy.igds.domain.GatewaySer</Property>
    <PropertyDef name="id">
      <Property></Property>
      <Property name="label">网关ID</Property>
    </PropertyDef>
    <PropertyDef name="deptId">
      <Property></Property>
      <Property name="label">所属库区</Property>
      <Property name="mapping">
        <Property name="mapValues">${dorado.getDataProvider(&quot;deptPR#getAllData&quot;).getResult()}</Property>
        <Property name="keyProperty">id</Property>
        <Property name="valueProperty">kqmc</Property>
      </Property>
      <Property name="required">true</Property>
    </PropertyDef>
    <PropertyDef name="companyId">
      <Property></Property>
      <Property name="label">组织编码</Property>
    </PropertyDef>
    <PropertyDef name="sn">
      <Property></Property>
      <Property name="label">序列号</Property>
    </PropertyDef>
    <PropertyDef name="name">
      <Property></Property>
      <Property name="label">网关名称</Property>
    </PropertyDef>
    <PropertyDef name="ip">
      <Property></Property>
      <Property name="label">网关IP</Property>
      <Property name="required">true</Property>
    </PropertyDef>
    <PropertyDef name="port">
      <Property name="dataType">Integer</Property>
      <Property name="label">网关端口</Property>
      <Property name="required">true</Property>
    </PropertyDef>
    <PropertyDef name="status">
      <Property></Property>
      <Property name="label">是否在线</Property>
      <Property name="mapping">
        <Property name="mapValues">${dorado.getDataProvider(&quot;dicPR#sysDictData&quot;).getResult(&quot;sys_yes_no&quot;)}</Property>
        <Property name="keyProperty">dictValue</Property>
        <Property name="valueProperty">dictLabel</Property>
      </Property>
    </PropertyDef>
    <PropertyDef name="orderNum">
      <Property name="dataType">Integer</Property>
      <Property name="label">顺序号</Property>
    </PropertyDef>
    <PropertyDef name="snapUrl">
      <Property></Property>
      <Property name="label">抓拍路径</Property>
    </PropertyDef>
    <PropertyDef name="ptzUrl">
      <Property></Property>
      <Property name="label">云台路径</Property>
    </PropertyDef>
    <PropertyDef name="remark">
      <Property></Property>
      <Property name="label">备注</Property>
    </PropertyDef>
    <PropertyDef name="createTime">
      <Property name="dataType">DateTime</Property>
      <Property name="label">创建时间</Property>
      <Property name="readOnly">true</Property>
    </PropertyDef>
    <PropertyDef name="createBy">
      <Property></Property>
      <Property name="label">创建人</Property>
      <Property name="readOnly">true</Property>
    </PropertyDef>
    <PropertyDef name="updateTime">
      <Property name="dataType">DateTime</Property>
      <Property name="label">更新时间</Property>
      <Property name="readOnly">true</Property>
    </PropertyDef>
    <PropertyDef name="updateBy">
      <Property></Property>
      <Property name="label">更新人</Property>
      <Property name="readOnly">true</Property>
    </PropertyDef>
  </DataType>
</Model>
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/EventInfoController.java
@@ -26,6 +26,14 @@
    @Resource
    private EventInfoManager eventInfoManager;
    /**
     * AI事件管理页面
     *
     * @author sgj
     * @date 2025/12/10
     * @param model
     */
    @GetMapping
    public String getEventInfo(
            Model model) {
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/PatrolRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.fzzy.sys.controller.security;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fzzy.igds.constant.RespCodeEnum;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.data.PageResponse;
import com.fzzy.igds.domain.PatrolRecord;
import com.fzzy.sys.manager.security.PatrolRecordManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Controller
@RequestMapping("/security/patrol/patrolRecord")
public class PatrolRecordController {
    private static final String prefix = "security/patrol/patrolRecord";
    @Resource
    private PatrolRecordManager patrolRecordManager;
    /**
     * èŽ·å–å·¡æ›´è®°å½•é¡µé¢
     *
     * @param patrolId
     * @param model
     * @return
     */
    @GetMapping("/{patrolId}")
    public String getPatrolRecordById(@PathVariable("patrolId") String patrolId, Model model) {
        IgdsBaseParam param = new IgdsBaseParam();
        param.setPage(1);
        param.setLimit(6);
        param.setKey(patrolId);
        Page<PatrolRecord> records = patrolRecordManager.pageData(param);
        model.addAttribute("patrolRecordList", records.getRecords());
        model.addAttribute("currentPage", records.getCurrent());
        model.addAttribute("totalItems", records.getTotal());
        model.addAttribute("pageSize", records.getSize());
        model.addAttribute("patrolId", patrolId);
        return prefix + "/patrolRecord";
    }
    /**
     * èŽ·å–è½¨è¿¹å›¾é¡µé¢
     */
    @GetMapping("trajectoryMap/{patrolId}")
    public String showTrajectoryMap(@PathVariable("patrolId") String patrolId, Model model) {
        IgdsBaseParam param = new IgdsBaseParam();
        param.setKey(patrolId);
        List<PatrolRecord> trackPoints = patrolRecordManager.listAll(param);
        model.addAttribute("trackPoints", trackPoints);
        return prefix + "/trajectoryMap";
    }
    /**
     * åˆ†é¡µèŽ·å–æ•°æ®
     *
     * @param param
     * @return
     */
    @RequestMapping("/pageData")
    @ResponseBody
    public PageResponse<Page<PatrolRecord>> pageData(@RequestBody IgdsBaseParam param) {
        Page<PatrolRecord> patrolRecordPage = patrolRecordManager.pageData(param);
        if (null == patrolRecordPage.getRecords() || patrolRecordPage.getRecords().isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "获取到数据信息为空");
        }
        return new PageResponse<>(RespCodeEnum.CODE_0000, patrolRecordPage);
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SecurityController.java
@@ -104,7 +104,7 @@
        String viewUrl = prefix + "/video-webrtc";
        //WEB-RTC大华播放
        //WEB-RTC播放
        if (CameraPlayType.PLAY_TYPE_WEB_RTC.getCode().equals(playType)) {
            viewUrl = prefix + "/video-webrtc";
        }
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SnapConfController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
package com.fzzy.sys.controller.security;
import com.fzzy.igds.domain.SnapConf;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.sys.manager.security.SnapConfManager;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/security/snap/snapConf")
public class SnapConfController extends BaseController {
    private static final String prefix = "security/snap/snapConf";
    @Resource
    private SnapConfManager snapConfManager;
    /**
     * æŠ“拍配置页面
     */
    @GetMapping()
    public String snapConf() {
        return prefix + "/snapConf";
    }
    /**
     * æŸ¥è¯¢æŠ“拍配置列表
     */
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(SnapConf param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ShiroUtils.getLoginUserCompanyId());
        }
        startPage();
        List<SnapConf> list = snapConfManager.selectList(param);
        return getDataTable(list);
    }
    /**
     * å¯¼å‡ºæŠ“拍配置列表
     */
    @Log(title = "抓拍配置管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(SnapConf param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ShiroUtils.getLoginUserCompanyId());
        }
        List<SnapConf> list = snapConfManager.selectList(param);
        ExcelUtil<SnapConf> util = new ExcelUtil<>(SnapConf.class);
        return util.exportExcel(list, "抓拍配置数据");
    }
    /**
     * æ–°å¢žæŠ“拍配置页面
     */
    @GetMapping("/add")
    public String add(ModelMap mmap) {
        return prefix + "/add";
    }
    /**
     * æ–°å¢žæŠ“拍配置数据
     */
    @Log(title = "抓拍配置管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@Validated SnapConf param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ShiroUtils.getLoginUserCompanyId());
        }
        param.setCreateBy(getLoginName());
        param.setCreateTime(new Date());
        if (StringUtils.isEmpty(param.getId())) {
            param.setId(ContextUtil.generateId());
        }
        return toAjax(snapConfManager.insertData(param));
    }
    /**
     * ä¿®æ”¹æŠ“拍配置页面
     */
    @GetMapping("/edit/{id}")
    public String edit(@PathVariable("id") String id, ModelMap mmap) {
        SnapConf record = snapConfManager.selectById(id);
        mmap.put("snapConf", record);
        return prefix + "/edit";
    }
    /**
     * ä¿®æ”¹æŠ“拍配置数据
     */
    @Log(title = "抓拍配置管理", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(@Validated SnapConf param) {
        if (null == param.getCompanyId()) {
            param.setCompanyId(ShiroUtils.getLoginUserCompanyId());
        }
        param.setUpdateBy(getLoginName());
        param.setUpdateTime(new Date());
        SnapConf snapConf = snapConfManager.selectById(param.getId());
        if (snapConf == null) {
            param.setId(ContextUtil.generateId());
            return toAjax(snapConfManager.insertData(param));
        }
        return toAjax(snapConfManager.updateData(param));
    }
    /**
     * åˆ é™¤æŠ“拍配置数据
     */
    @Log(title = "抓拍配置管理", businessType = BusinessType.DELETE)
    @PostMapping("/remove")
    @ResponseBody
    public AjaxResult remove(String ids) {
        snapConfManager.deleteDataById(ids);
        return success();
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SnapRecordController.java
@@ -27,6 +27,9 @@
    @Resource
    private SnapRecordManager snapRecordManager;
    /**
     * èŽ·å–æ™ºèƒ½æŠ“æ‹é¡µé¢
     */
    @GetMapping
    public String getSnapRecord(
            Model model) {
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolConfManager.java
@@ -15,22 +15,51 @@
    @Resource
    private PatrolConfService patrolConfService;
    /**
     * æŸ¥è¯¢æ•°æ®
     *
     * @param param
     * @return
     */
    public List<PatrolConf> selectList(PatrolConf param) {
        return patrolConfService.selectList(param);
    }
    /**
     * æ ¹æ®ID查询数据
     *
     * @param id
     * @return
     */
    public PatrolConf selectById(String id) {
        return patrolConfService.selectById(id);
    }
    /**
     * æ’入数据
     *
     * @param param
     * @return
     */
    public int insertData(PatrolConf param) {
        return patrolConfService.insertData(param);
    }
    /**
     * æ›´æ–°æ•°æ®
     *
     * @param param
     * @return
     */
    public int updateData(PatrolConf param) {
        return patrolConfService.updateData(param);
    }
    /**
     * åˆ é™¤æ•°æ®
     *
     * @param ids
     */
    public void deleteDataById( String ids) {
        patrolConfService.deleteDataById( ids);
    }
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolManager.java
@@ -15,24 +15,60 @@
    @Resource
    private PatrolService patrolService;
    /**
     * æŸ¥è¯¢æ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public List<Patrol> selectList(Patrol param) {
        return patrolService.selectList(param);
    }
    public Patrol selectById( String id) {
        return patrolService.selectById( id);
    /**
     * æ ¹æ®id查询数据
     *
     * @param id
     * @author sgj
     * @date 2025/12/10
     */
    public Patrol selectById(String id) {
        return patrolService.selectById(id);
    }
    /**
     * æ–°å¢žæ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public int insertData(Patrol param) {
        return patrolService.insertData(param);
    }
    /**
     * ä¿®æ”¹æ•°æ®
     *
     * @param param
     * @author sgj
     * @date 2025/12/10
     */
    public int updateData(Patrol param) {
        return patrolService.updateData(param);
    }
    public void deleteDataById( String ids) {
         patrolService.deleteDataById(ids);
    /**
     * åˆ é™¤æ•°æ®
     *
     * @param ids
     * @author sgj
     * @date 2025/12/10
     */
    public void deleteDataById(String ids) {
        patrolService.deleteDataById(ids);
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/PatrolRecordManager.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.fzzy.sys.manager.security;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.domain.PatrolRecord;
import com.fzzy.igds.service.PatrolRecordService;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class PatrolRecordManager {
    @Resource
    private PatrolRecordService patrolRecordService;
    /**
     * åˆ†é¡µæŸ¥è¯¢æ•°æ®
     *
     * @param param
     * @return
     */
    public Page<PatrolRecord> pageData(IgdsBaseParam param) {
        if (StringUtils.isEmpty(param.getCompanyId())) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
        Page<PatrolRecord> corePage = new Page<>(param.getPage(), param.getLimit());
        patrolRecordService.listPage(corePage, param);
        if (null == corePage.getRecords() || corePage.getRecords().isEmpty()) {
            return corePage.setRecords(new ArrayList<>());
        }
        return corePage;
    }
    /**
     * èŽ·å–æ‰€æœ‰æ•°æ®
     *
     * @param param
     * @return
     */
    public List<PatrolRecord> listAll(IgdsBaseParam param) {
        if (StringUtils.isEmpty(param.getCompanyId())) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
        return patrolRecordService.listAll(param);
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/security/SnapConfManager.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.fzzy.sys.manager.security;
import com.fzzy.igds.domain.SnapConf;
import com.fzzy.igds.service.SnapConfService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
@Component
public class SnapConfManager {
    @Resource
    private SnapConfService snapConfService;
    /**
     * æŸ¥è¯¢æ•°æ®
     *
     * @param param æŸ¥è¯¢å‚æ•°
     * @return æ•°æ®åˆ—表
     */
    public List<SnapConf> selectList(SnapConf param) {
        return snapConfService.selectList(param);
    }
    /**
     * æ ¹æ®ID查询数据
     *
     * @param id ä¸»é”®ID
     * @return SnapConf实体对象
     */
    public SnapConf selectById(String id) {
        return snapConfService.selectById(id);
    }
    /**
     * æ’入数据
     *
     * @param param æ•°æ®å®žä½“
     * @return å½±å“è¡Œæ•°
     */
    public int insertData(SnapConf param) {
        return snapConfService.insertData(param);
    }
    /**
     * æ›´æ–°æ•°æ®
     *
     * @param param æ•°æ®å®žä½“
     * @return å½±å“è¡Œæ•°
     */
    public int updateData(SnapConf param) {
        return snapConfService.updateData(param);
    }
    /**
     * åˆ é™¤æ•°æ®
     *
     * @param ids è¦åˆ é™¤çš„记录ID集合(逗号分隔)
     */
    public void deleteDataById(String ids) {
        snapConfService.deleteDataById(ids);
    }
}
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo.js
@@ -195,8 +195,7 @@
        String(d.getMonth() + 1).padStart(2, '0') + '-' +
        String(d.getDate()).padStart(2, '0') + ' ' +
        String(d.getHours()).padStart(2, '0') + ':' +
        String(d.getMinutes()).padStart(2, '0') + ':' +
        String(d.getSeconds()).padStart(2, '0');
        String(d.getMinutes()).padStart(2, '0') ;
}
/**
fzzy-igdss-web/src/main/resources/static/security/patrol/patrolRecord-style.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,203 @@
/* å›¾ç‰‡é¢„览层样式 */
.img-preview {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.9);
    z-index: 1000;
    justify-content: center;
    align-items: center;
}
.preview-content {
    max-width: 90%;
    max-height: 90%;
    position: relative;
}
.preview-img {
    max-width: 100%;
    max-height: 90vh;
    border-radius: 4px;
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
}
.close-preview {
    position: absolute;
    top: -40px;
    right: -10px;
    color: white;
    font-size: 2rem;
    cursor: pointer;
    background: rgba(0, 0, 0, 0.5);
    width: 40px;
    height: 40px;
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    transition: all 0.3s ease;
}
.close-preview:hover {
    background: rgba(255, 255, 255, 0.2);
    transform: scale(1.1);
}
/* å›¾ç‰‡ç½‘格样式 */
.gallery-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
    gap: 20px;
    margin-bottom: 5px;
}
.gallery-item {
    background: white;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
    transition: all 0.3s ease;
}
.gallery-item:hover {
    transform: translateY(-5px);
    box-shadow: 0 10px 20px rgba(0, 0, 0, 0.12);
}
.gallery-img {
    width: 100%;
    height: 240px;
    object-fit: cover;
    cursor: pointer;
    transition: all 0.3s ease;
}
.gallery-img:hover {
    opacity: 0.95;
}
.gallery-info {
    padding: 15px;
}
.gallery-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 10px;
}
.gallery-title {
    font-size: 1.5rem;
    font-weight: 600;
    color: #333;
    margin: 0;
    flex: 1;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.gallery-meta {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.meta-item {
    display: flex;
    align-items: center;
    font-size: 1.3rem;
    color: #666;
}
.meta-item i {
    width: 16px;
    margin-right: 6px;
    color: #999;
    font-size: 1.25rem;
}
.gallery-filename i {
    margin-right: 5px;
    font-size: 0.7rem;
}
/* æ ‡ç­¾æ ·å¼ */
.gallery-tags {
    display: flex;
    flex-wrap: wrap;
    margin-left: auto;
    gap: 3px;
    /*margin: 12px 0;*/
}
/* åˆ†é¡µæ ·å¼ */
.pagination-container {
    display: flex;
    justify-content: flex-end;
    width: 100%;
    /*margin-top: 40px;*/
}
/* ç©ºçŠ¶æ€æ ·å¼ */
.empty-state {
    grid-column: 1 / -1;
    text-align: center;
    padding: 60px 20px;
    color: #999;
}
.empty-state i {
    font-size: 4rem;
    margin-bottom: 20px;
    color: #ddd;
}
.empty-state h3 {
    font-size: 1.5rem;
    margin-bottom: 10px;
    color: #666;
}
/* å“åº”式设计 */
@media (max-width: 992px) {
    .gallery-grid {
        grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
        gap: 25px;
    }
}
@media (max-width: 768px) {
    .main-nav li {
        margin: 0 10px;
    }
    .gallery-grid {
        grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
        gap: 20px;
    }
    .gallery-img {
        height: 180px;
    }
}
@media (max-width: 576px) {
    .gallery-grid {
        grid-template-columns: 1fr;
    }
    .gallery-img {
        height: 200px;
    }
}
fzzy-igdss-web/src/main/resources/static/security/patrol/patrolRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,281 @@
var layer;
var laypage;
$(function () {
    // åˆå§‹åŒ–分页
    layui.use(['laypage', 'layer'], function () {
        layer = layui.layer;
        laypage = layui.laypage;
        // åˆå§‹åŒ–分页组件
        initPagination();
    });
    // åˆå§‹åŒ–图片预览功能
    initImagePreview();
});
/**
 * åˆå§‹åŒ–分页组件
 */
function initPagination() {
    laypage.render({
        elem: 'pagination',
        count: typeof totalItems !== 'undefined' ? totalItems : 0,
        limit: typeof pageSize !== 'undefined' ? pageSize : 6,
        curr: typeof currentPage !== 'undefined' ? currentPage : 1,
        layout: ['prev', 'page', 'next', 'refresh', 'skip'],
        jump: function (obj, first) {
            if (!first) {
                searchRecord(obj.curr, obj.limit)
            }
        }
    });
}
/**
 * é‡æ–°åˆå§‹åŒ–分页组件
 * @param {number} totalCount - æ€»è®°å½•æ•°
 * @param {number} pageSize - æ¯é¡µå¤§å°
 * @param {number} currentPage - å½“前页码
 */
function reinitPagination(totalCount, pageSize, currentPage) {
    laypage.render({
        elem: 'pagination',
        count: totalCount,
        limit: pageSize,
        curr: currentPage,
        layout: ['prev', 'page', 'next', 'refresh', 'skip'],
        jump: function (obj, first) {
            if (!first) {
                searchRecord(obj.curr, obj.limit)
            }
        }
    });
}
/**
 * èŽ·å–å·¡æ£€è®°å½•æ•°æ®
 * @param {Object} params - æŸ¥è¯¢å‚数对象
 * @param {Function} callback - å›žè°ƒå‡½æ•°
 */
function fetchPatrolRecordData(params, callback) {
    $.ajax({
        url: '../../patrol/patrolRecord/pageData',
        type: 'POST',
        dataType: "json",
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify(params),
        success: function (response) {
            if (response.code === '0000') {
                callback(null, response.data);
            } else {
                callback(new Error(response.msg || '数据加载失败'), null);
            }
        },
        error: function (xhr, status, error) {
            callback(new Error('请求失败,请稍后重试'), null);
        }
    });
}
/**
 * æž„建查询参数
 * @param {number} page - é¡µç 
 * @param {number} size - æ¯é¡µå¤§å°
 * @returns {Object} æŸ¥è¯¢å‚数对象
 */
function buildQueryParams(page, size) {
    var params = {
        page: page,
        limit: size,
        key: patrolId  //主表id查询
    };
    // æ·»åŠ è¡¨å•æŸ¥è¯¢æ¡ä»¶
    var form = document.getElementById('patrolRecord-form');
    if (form) {
        var inputs = form.querySelectorAll('input[name], select[name]');
        inputs.forEach(function(input) {
            if (input.value) { // åªæ·»åŠ éžç©ºå€¼
                params[input.name] = input.value;
            }
        });
    }
    return params;
}
/**
 * æ›´æ–°å·¡æ£€è®°å½•画廊内容
 * @param {Array} records - å·¡æ£€è®°å½•数据
 */
function updateGallery(records) {
    var container = document.getElementById('gallery-container');
    if (!container) return;
    // æ¸…空现有内容
    container.innerHTML = '';
    if (!records || records.length === 0) {
        // æ˜¾ç¤ºç©ºçŠ¶æ€
        container.innerHTML = `
            <div class="empty-state">
                <i class="fa-solid fa-clipboard-list"></i>
                <h3>暂无巡检记录</h3>
                <p>当前没有可展示的巡检记录数据</p>
            </div>
        `;
        // éšè—åˆ†é¡µ
        $('.pagination-container').hide();
        return;
    }
    // æ˜¾ç¤ºåˆ†é¡µ
    $('.pagination-container').show();
    // ç”Ÿæˆå·¡æ£€è®°å½•卡片
    var html = '';
    records.forEach(function(record) {
        html += `
            <div class="gallery-item">
                <img src="${record.imgName || '/logo-sm.png'}" alt="${record.id}"
                     data-url="${record.imgName || '/logo-sm.png'}" data-id="${record.id}"
                     class="gallery-img" onclick="showPatrolRecordPreview(this.getAttribute('data-url'))">
                <div class="gallery-info">
                    <div class="gallery-header">
                        <h3 class="gallery-title">${record.pointName || record.id}</h3>
                    <!--
                        <div class="gallery-tags">
                            <span class="tag-person">
                                <i class="layui-icon layui-icon-user"></i>
                                <span>'未知'</span>
                            </span>
                        </div>
                         -->
                    </div>
                    <div class="gallery-meta">
                         <div style="display: flex; align-items: center; gap: 15px;width: 100%">
                             <div class="meta-item" style="width: 50%">
                                <i class="layui-icon layui-icon-location"></i>
                                <span>${record.longitude || ''}</span>
                            </div>
                            <div class="meta-item">
                                <i class="layui-icon layui-icon-location"></i>
                                <span>${record.latitude || ''}</span>
                            </div>
                         </div>
                        <div class="meta-item" style="width: 50%">
                                <i class="layui-icon layui-icon-date"></i>
                                <span>${formatDate(record.createTime)}</span>
                            </div>
                    </div>
                </div>
            </div>
        `;
    });
    container.innerHTML = html;
}
/**
 * æ ¼å¼åŒ–日期
 * @param {string|number} date - æ—¥æœŸå­—符串或时间戳
 */
function formatDate(date) {
    if (!date) return '';
    var d = new Date(date);
    return d.getFullYear() + '-' +
        String(d.getMonth() + 1).padStart(2, '0') + '-' +
        String(d.getDate()).padStart(2, '0') + ' ' +
        String(d.getHours()).padStart(2, '0') + ':' +
        String(d.getMinutes()).padStart(2, '0') ;
}
/**
 * åˆå§‹åŒ–图片预览功能
 */
function initImagePreview() {
    var preview = document.getElementById('imgPreview');
    var previewImg = document.getElementById('previewImg');
    var closeBtn = document.getElementById('closePreview');
    // å¦‚果预览元素不存在,则不初始化
    if (!preview || !previewImg) {
        return;
    }
    // å…³é—­æŒ‰é’®ç‚¹å‡»äº‹ä»¶
    if (closeBtn) {
        closeBtn.addEventListener('click', closePreview);
    }
    // ç‚¹å‡»é¢„览区域外关闭
    preview.addEventListener('click', function (e) {
        if (e.target === preview) {
            closePreview();
        }
    });
    // é”®ç›˜äº‹ä»¶ç›‘听
    document.addEventListener('keydown', function (e) {
        if (e.key === 'Escape' && preview.style.display === 'flex') {
            closePreview();
        }
    });
    // å…³é—­é¢„览函数
    function closePreview() {
        preview.style.display = 'none';
        previewImg.src = '';
    }
}
/**
 * æ˜¾ç¤ºå›¾ç‰‡é¢„览
 * @param {string} imgUrl å›¾ç‰‡URL
 */
function showPatrolRecordPreview(imgUrl) {
    var preview = document.getElementById('imgPreview');
    var previewImg = document.getElementById('previewImg');
    if (preview && previewImg) {
        previewImg.src = imgUrl;
        preview.style.display = 'flex';
    }
}
/**
 * è¯»å–巡检记录
 */
function searchRecord(page , size) {
    var pageNumber = 1;
    var sizeNumber = 6;
    if (pageSize && pageSize > 0){
        size = pageSize;
    }
    if (size && size > 0){
        sizeNumber = size;
    }
    if (page && page > 0){
        pageNumber = page;
    }
    // æž„造查询参数,从第一页开始
    var queryParams = buildQueryParams(pageNumber, sizeNumber);
    // æ˜¾ç¤ºloading
    var loadingIndex = layer.load(1, {shade: [0.1, '#fff']});
    // è°ƒç”¨æ•°æ®è¯·æ±‚方法
    fetchPatrolRecordData(queryParams, function(error, data) {
        // å…³é—­loading
        layer.close(loadingIndex);
        if (error) {
            layer.msg(error.message);
            return;
        }
        // æ›´æ–°é¡µé¢æ•°æ®
        updateGallery(data.records);
        // é‡æ–°åˆå§‹åŒ–分页组件
        reinitPagination(data.total, data.size, data.current);
    });
}
fzzy-igdss-web/src/main/resources/static/security/snap/snapRecord.js
@@ -194,8 +194,9 @@
        String(d.getMonth() + 1).padStart(2, '0') + '-' +
        String(d.getDate()).padStart(2, '0') + ' ' +
        String(d.getHours()).padStart(2, '0') + ':' +
        String(d.getMinutes()).padStart(2, '0') + ':' +
        String(d.getSeconds()).padStart(2, '0');
        String(d.getMinutes()).padStart(2, '0')
        // + ':' +
        // String(d.getSeconds()).padStart(2, '0');
}
/**
@@ -287,6 +288,6 @@
    });
}
function openConf() {
    var url = ctx + "com.fzzy.igds.SnapConf.d";
    var url = ctx + "security/snap/snapConf";
    $.modal.openTab("抓拍配置", url);
}
fzzy-igdss-web/src/main/resources/templates/security/eventInfo/eventInfo.html
@@ -80,7 +80,7 @@
                                </div>
                                <div class="meta-item" style="width: 50%">
                                    <i class="layui-icon layui-icon-date"></i>
                                    <span th:text="${#dates.format(eventInfo.time, 'yyyy-MM-dd HH:mm:ss')}"></span>
                                    <span th:text="${#dates.format(eventInfo.time, 'yyyy-MM-dd HH:mm')}"></span>
                                </div>
                            </div>
                            <div class="meta-item">
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrol.html
@@ -99,6 +99,7 @@
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                        actions.push('<a class="btn btn-danger btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
                        actions.push('<a class="btn btn-info btn-xs '  + '" href="javascript:void(0)" onclick="patrolDetail(\'' + row.id + '\')"><i class="fa fa-list-ul"></i>详情</a> ');
                        return actions.join('');
                    }
                }]
@@ -106,6 +107,12 @@
        $.table.init(options);
    });
    /*详情*/
    function patrolDetail(patrolId) {
        var url = prefix + '/patrolRecord/' + patrolId;
        $.modal.openTab("巡更详情", url);
    }
    function openPatrolConf() {
        var url = ctx + "security/patrol/patrolConf";
        $.modal.openTab("巡更配置", url);
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolConf/patrolConf.html
@@ -24,16 +24,16 @@
        </div>
        <div class="btn-group-sm" id="toolbar" role="group">
            <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="web:security:patrol:patrolConf:add">
            <a class="btn btn-success" onclick="$.operate.add()" >
                <i class="fa fa-plus"></i> æ–°å¢ž
            </a>
            <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="web:security:patrol:patrolConf:edit">
            <a class="btn btn-primary single disabled" onclick="$.operate.edit()" >
                <i class="fa fa-edit"></i> ä¿®æ”¹
            </a>
            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="web:security:patrol:patrolConf:remove">
            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" >
                <i class="fa fa-remove"></i> åˆ é™¤
            </a>
            <a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="web:security:patrol:patrolConf:export">
            <a class="btn btn-warning" onclick="$.table.exportExcel()" >
                <i class="fa fa-download"></i> å¯¼å‡º
            </a>
        </div>
@@ -45,8 +45,6 @@
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<script th:inline="javascript">
    var editFlag = [[${@permission.hasPermi('web:security:patrol:patrolConf:edit')}]];
    var removeFlag = [[${@permission.hasPermi('web:security:patrol:patrolConf:remove')}]];
    var prefix = ctx + "security/patrol/patrolConf";
    $(function() {
@@ -88,8 +86,8 @@
                    align: 'center',
                    formatter: function(value, row, index) {
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.batchId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.batchId + '\')"><i class="fa fa-remove"></i>删除</a>');
                        actions.push('<a class="btn btn-success btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.batchId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                        actions.push('<a class="btn btn-danger btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.batchId + '\')"><i class="fa fa-remove"></i>删除</a>');
                        return actions.join('');
                    }
                }]
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolRecord/patrolRecord.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <th:block th:include="include :: header('巡更记录')"/>
    <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui-ruoyi/css/layui.css}"/>
    <link rel="stylesheet" th:href="@{/security/patrol/patrolRecord-style.css}">
</head>
<body class="gray-bg">
<div class="container-div">
    <div class="row">
        <div class="col-sm-12 search-collapse"
             style="display: flex; justify-content: space-between; align-items: center;">
            <form id="patrolRecord-form">
                <div class="select-list">
                    <ul>
                        <li>
                            å·¡æ›´ç‚¹ï¼š<input type="text" name="name"/>
                        </li>
                        <li>
                            <a class="btn btn-primary btn-rounded btn-sm" onclick="searchRecord()"><i
                                    class="fa fa-search"></i>&nbsp;搜索</a>
                            <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
                                    class="fa fa-refresh"></i>&nbsp;重置</a>
                        </li>
                    </ul>
                </div>
            </form>
            <div class="btn-group-sm" role="group">
                <!-- å¦‚果需要添加按钮可以放在这里 -->
                <a class="btn btn-success" onclick="openTrajectoryMap()" >
                    <i class="fa fa-search"></i> è½¨è¿¹å›¾æŸ¥çœ‹
                </a>
            </div>
        </div>
        <div class="col-sm-12 " style="padding-top: 10px;">
            <!-- å·¡æ£€è®°å½•网格 -->
            <div class="gallery-grid" id="gallery-container">
                <!-- è®°å½•为空时显示 -->
                <div th:if="${#lists.isEmpty(patrolRecordList)}" class="empty-state">
                    <i class="fa-solid fa-clipboard-list"></i>
                    <h3>暂无巡检记录</h3>
                    <p>当前没有可展示的巡检记录数据</p>
                </div>
                <!-- è®°å½•卡片 -->
                <div th:each="patrolRecord : ${patrolRecordList}" class="gallery-item">
                    <img th:src="${patrolRecord.imgName ?: '/logo-sm.png'}" th:alt="${patrolRecord.id}"
                         th:data-url="${patrolRecord.imgName ?: '/logo-sm.png'}" th:data-id="${patrolRecord.id}"
                         class="gallery-img" onclick="showPatrolRecordPreview(this.getAttribute('data-url'))">
                    <div class="gallery-info">
                        <div class="gallery-header">
                            <h3 class="gallery-title" th:text="${patrolRecord.pointName ?: patrolRecord.id}"></h3>
                            <!-- æ ‡ç­¾åˆ—表 -->
<!--                            <div class="gallery-tags">-->
<!--                                <span class="tag-person">-->
<!--                                    <i class="layui-icon layui-icon-user"></i>-->
<!--                                    <span th:text="'未知'"></span>-->
<!--                                </span>-->
<!--                            </div>-->
                        </div>
                        <div class="gallery-meta">
                            <div style="display: flex; align-items: center; gap: 15px;width: 100%">
                                <div class="meta-item" style="width: 50%">
                                    <i class="layui-icon layui-icon-location"></i>
                                    <span th:text="${patrolRecord.longitude ?: ''}"></span>
                                </div>
                                <div class="meta-item" style="width: 50%">
                                    <i class="layui-icon layui-icon-location"></i>
                                    <span th:text="${patrolRecord.latitude ?: ''}"></span>
                                </div>
                            </div>
                            <div class="meta-item" >
                                <i class="layui-icon layui-icon-date"></i>
                                <span th:text="${#dates.format(patrolRecord.createTime, 'yyyy-MM-dd HH:mm')}"></span>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <!-- åˆ†é¡µæŽ§ä»¶ -->
            <div class="pagination-container" th:if="${not #lists.isEmpty(patrolRecordList)}">
                <div id="pagination"></div>
            </div>
        </div>
    </div>
    <!-- å›¾ç‰‡é¢„览层 -->
    <div class="img-preview" id="imgPreview">
        <div class="preview-content">
            <img src="" alt="预览图片" class="preview-img" id="previewImg">
            <div class="close-preview" id="closePreview">
                <i class="layui-icon layui-icon-clear"></i>
            </div>
        </div>
    </div>
</div>
<th:block th:include="include :: footer"/>
<script th:src="@{/ajax/libs/layui-ruoyi/layui.js}"></script>
<script th:src="@{/security/patrol/patrolRecord.js}"></script>
<script th:inline="javascript">
    var prefix = ctx + "security/patrol/patrolRecord";
    var currentPage = [[${currentPage}]];
    var totalItems = [[${totalItems}]];
    var pageSize = [[${pageSize}]];
    var patrolId = [[${patrolId}]];
    function openTrajectoryMap() {
        var url = prefix + '/trajectoryMap/'+patrolId ;
        var options = {
            title: "轨迹图",
            width: 500,
            height: 500,
            url: url,
            btn: 0,
            yes: function (index, layero) {
                $.modal.close(index);
            }
        };
        $.modal.openOptions(options);
    }
</script>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/security/patrol/patrolRecord/trajectoryMap.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <th:block th:include="include :: header('轨迹图展示')"/>
    <!-- ç™¾åº¦åœ°å›¾API -->
    <script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=R3FfyIEbBAWNckTqRSopHQktdkgp924F"></script>
</head>
<body>
<!-- åœ°å›¾å®¹å™¨ -->
<div class="container-div" id="map-container">
</div>
<th:block th:include="include :: footer"/>
<script th:inline="javascript">
    // 1. èŽ·å–åŽç«¯ä¼ é€’çš„è½¨è¿¹æ•°æ®
    const trackPoints = [[${trackPoints}]];
    // è½¬æ¢ä¸ºç™¾åº¦åœ°å›¾åæ ‡æ•°ç»„
    const path = trackPoints.map(point => new BMapGL.Point(point.longitude, point.latitude));
    // 2. åˆå§‹åŒ–地图
    function initMap() {
        // åˆ›å»ºåœ°å›¾å®žä¾‹ï¼Œä¸­å¿ƒç‚¹è®¾ä¸ºç¬¬ä¸€ä¸ªè½¨è¿¹ç‚¹
        const map = new BMapGL.Map("map-container");
        const centerPoint = path[0] || new BMapGL.Point(116.404, 39.915);
        map.centerAndZoom(centerPoint, 14); // 14为地图缩放级别
        map.enableScrollWheelZoom(true); // å¼€å¯é¼ æ ‡æ»šè½®ç¼©æ”¾
        // 3. æ·»åŠ è½¨è¿¹çº¿
        const polyline = new BMapGL.Polyline(path, {
            strokeColor: "#3388ff", // çº¿é¢œè‰²
            strokeWeight: 5, // çº¿å®½åº¦
            strokeOpacity: 0.8 // çº¿é€æ˜Žåº¦
        });
        map.addOverlay(polyline);
        // 4. ä¸ºæ¯ä¸ªè½¨è¿¹ç‚¹æ·»åŠ æ ‡è®°å’Œä¿¡æ¯çª—å£
        trackPoints.forEach((point, index) => {
            const markerPoint = new BMapGL.Point(point.longitude, point.latitude);
            // åˆ›å»ºæ ‡è®°
            const marker = new BMapGL.Marker(markerPoint);
            map.addOverlay(marker);
            // åˆ›å»ºä¿¡æ¯çª—口内容
            const infoWindow = new BMapGL.InfoWindow(`
                    <div style="font-size:14px;">
                        <p>序号:${index + 1}</p>
                        <p>经度:${point.longitude}</p>
                        <p>纬度:${point.latitude}</p>
                        <p>时间:${point.createTime}</p>
                    </div>
                `);
            // ç‚¹å‡»æ ‡è®°æ˜¾ç¤ºä¿¡æ¯çª—口
            marker.addEventListener("click", () => {
                map.openInfoWindow(infoWindow, markerPoint);
            });
        });
        // 5. è°ƒæ•´åœ°å›¾è§†é‡Žä»¥æ˜¾ç¤ºæ•´ä¸ªè½¨è¿¹
        if (path.length > 1) {
            map.setViewport(path); // è‡ªåŠ¨é€‚é…è½¨è¿¹èŒƒå›´
        }
    }
    // é¡µé¢åŠ è½½å®ŒæˆåŽåˆå§‹åŒ–åœ°å›¾
    window.onload = initMap;
</script>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/add.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <th:block th:include="include :: header('新增抓拍配置')"/>
    <th:block th:include="include :: select2-css"/>
</head>
<body>
<div class="main-content">
    <form id="form-snap-add" class="form-horizontal">
        <input name="deptId" type="hidden" id="treeId"/>
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">所属库区:</label>
                    <div class="col-sm-8">
                        <input name="deptId" id="deptId" placeholder="请输入所属库区" class="form-control" type="text"
                               maxlength="40">
                    </div>
                </div>
            </div>
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">抓拍监控:</label>
                    <div class="col-sm-8">
                        <input name="cameraId" id="cameraId" placeholder="请输入抓拍监控ID" class="form-control" type="text"
                               maxlength="40">
                    </div>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间1(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour1" id="actHour1" placeholder="请输入执行时间1" class="form-control" type="number"
                               min="0" max="23">
                    </div>
                </div>
            </div>
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间2(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour2" id="actHour2" placeholder="请输入执行时间2" class="form-control" type="number"
                               min="0" max="23">
                    </div>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间3(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour3" id="actHour3" placeholder="请输入执行时间3" class="form-control" type="number"
                               min="0" max="23">
                    </div>
                </div>
            </div>
        </div>
    </form>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: select2-js"/>
<script>
    var prefix = ctx + "security/snap/snapConf";
    $("#form-snap-add").validate({
        onkeyup: false,
        rules: {},
        messages: {},
        focusCleanup: true
    });
    // ç¡®å®šæŒ‰é’® æäº¤æ•°æ®
    function submitHandler() {
        if ($.validate.form()) {
            $.operate.save(prefix + "/add", $('#form-snap-add').serialize());
        }
    }
</script>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/edit.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <th:block th:include="include :: header('修改抓拍配置')"/>
    <th:block th:include="include :: select2-css"/>
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
    <form class="form-horizontal m" id="form-snap-edit" th:object="${snapConf}">
        <input id="id" name="id" th:field="*{id}" type="hidden">
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">所属库区:</label>
                    <div class="col-sm-8">
                        <input name="deptId" id="deptId" th:field="*{deptId}" placeholder="请输入所属库区" class="form-control"
                               type="text" maxlength="40">
                    </div>
                </div>
            </div>
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">抓拍监控:</label>
                    <div class="col-sm-8">
                        <input name="cameraId" id="cameraId" th:field="*{cameraId}" placeholder="请输入抓拍监控ID" class="form-control"
                               type="text" maxlength="40">
                    </div>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间1(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour1" id="actHour1" th:field="*{actHour1}" placeholder="请输入执行时间1" class="form-control"
                               type="number" min="0" max="23">
                    </div>
                </div>
            </div>
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间2(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour2" id="actHour2" th:field="*{actHour2}" placeholder="请输入执行时间2" class="form-control"
                               type="number" min="0" max="23">
                    </div>
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-6">
                <div class="form-group">
                    <label class="col-sm-4 control-label">执行时间3(小时):</label>
                    <div class="col-sm-8">
                        <input name="actHour3" id="actHour3" th:field="*{actHour3}" placeholder="请输入执行时间3" class="form-control"
                               type="number" min="0" max="23">
                    </div>
                </div>
            </div>
        </div>
    </form>
</div>
<th:block th:include="include :: footer"/>
<th:block th:include="include :: select2-js"/>
<script type="text/javascript">
    var prefix = ctx + "security/snap/snapConf";
    $("#form-snap-edit").validate({
        onkeyup: false,
        rules: {},
        messages: {},
        focusCleanup: true
    });
    function submitHandler() {
        if ($.validate.form()) {
            $.operate.save(prefix + "/edit", $('#form-snap-edit').serialize());
        }
    }
</script>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/security/snap/snapConf/snapConf.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <th:block th:include="include :: header('快拍配置列表')" />
    <th:block th:include="include :: select2-css" />
</head>
<body class="gray-bg">
<div class="container-div">
    <div class="row">
        <div class="col-sm-12 search-collapse">
            <form id="property-form">
                <div class="select-list">
                    <ul>
                        <li>
                            åç§°ï¼š<input type="text" name="name"/>
                        </li>
                        <li>
                            <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
                            <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
                        </li>
                    </ul>
                </div>
            </form>
        </div>
        <div class="btn-group-sm" id="toolbar" role="group">
            <a class="btn btn-success" onclick="$.operate.add()" >
                <i class="fa fa-plus"></i> æ–°å¢ž
            </a>
            <a class="btn btn-primary single disabled" onclick="$.operate.edit()" >
                <i class="fa fa-edit"></i> ä¿®æ”¹
            </a>
            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" >
                <i class="fa fa-remove"></i> åˆ é™¤
            </a>
            <a class="btn btn-warning" onclick="$.table.exportExcel()" >
                <i class="fa fa-download"></i> å¯¼å‡º
            </a>
        </div>
        <div class="col-sm-12 select-table table-striped">
            <table id="bootstrap-table"></table>
        </div>
    </div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: select2-js" />
<script th:inline="javascript">
    var prefix = ctx + "security/snap/snapConf";
    $(function() {
        var options = {
            url: prefix + "/list",
            createUrl: prefix + "/add",
            updateUrl: prefix + "/edit/{id}",
            removeUrl: prefix + "/remove",
            exportUrl: prefix + "/export",
            sortName: "id",
            sortOrder: "asc",
            modalName: "抓拍配置",
            columns: [{
                checkbox: true
            },
                {
                    field: 'id',
                    title: '主键',
                    visible: false,
                },
                {
                    field: 'deptId',
                    title: '所属库区',
                    align: 'left',
                },
                {
                    field: 'cameraId',
                    title: '抓拍监控',
                },
                {
                    title: '操作',
                    align: 'center',
                    formatter: function(value, row, index) {
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
                        actions.push('<a class="btn btn-danger btn-xs '  + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
                        return actions.join('');
                    }
                }]
        };
        $.table.init(options);
    });
</script>
</body>
</html>
fzzy-igdss-web/src/main/resources/templates/security/snap/snapRecord/snapRecord.html
@@ -30,7 +30,7 @@
                </div>
            </form>
            <div class="btn-group-sm" role="group">
                <a class="btn btn-success" onclick="openConf()" shiro:hasPermission="web:security:snap:snapRecord:view">
                <a class="btn btn-success" onclick="openConf()">
                    <i class="fa fa-plus"></i> æŠ“拍配置
                </a>
            </div>
@@ -79,7 +79,7 @@
                                </div>
                                <div class="meta-item" style="width: 50%">
                                    <i class="layui-icon layui-icon-date"></i>
                                    <span th:text="${#dates.format(snapRecord.snapTime, 'yyyy-MM-dd HH:mm:ss')}"></span>
                                    <span th:text="${#dates.format(snapRecord.snapTime, 'yyyy-MM-dd HH:mm')}"></span>
                                </div>
                            </div>
                            <div class="meta-item">