czt
2026-01-07 0c8d20900c14651cb50180ade4ccd0e2074796b4
质押监管接口解析
已重命名2个文件
已删除1个文件
已修改11个文件
已添加12个文件
981 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/GatewaySer.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GatewaySerService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SecCameraService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapConfService.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapRecordService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/Base64Util.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/ApiV1Controller.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/ApiV1Req.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/ApiV1Resp.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/Param3030.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/Param3031.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/package-info.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3010.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3020.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3021.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3030.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3031.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/util/ApiV1Constant.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/common/manager/ExportManager.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/grain/manager/GrainExportBuilder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/security/EventInfoController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/security/SnapRecordController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/eventInfo.html 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/snapRecord.html 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/GatewaySer.java
@@ -2,14 +2,15 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fzzy.igds.constant.Constant;
import com.ruoyi.common.annotation.Excel;
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;
import java.util.Date;
/**
 * @Description ç½‘关配置
@@ -29,7 +30,7 @@
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id", columnDefinition = "varchar(40) COMMENT '网关ID'")
    @Column(name = "id", columnDefinition = "varchar(40) COMMENT '网关ID,同SN'")
    @TableField("id")
    private String id;
@@ -81,4 +82,10 @@
    @TableField("remark")
    private String remark;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(name = "heartbeat_time", columnDefinition = "DATETIME COMMENT '心跳时间'")
    @Temporal(TemporalType.TIMESTAMP)
    @TableField("heartbeat_time")
    private Date heartbeatTime;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java
@@ -5,6 +5,7 @@
import com.fzzy.igds.data.BaseResp;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.domain.EventInfo;
import com.fzzy.igds.domain.SnapRecord;
import com.fzzy.igds.mapper.EventInfoMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.igds.utils.DateUtil;
@@ -101,4 +102,23 @@
        return eventInfoMapper.selectList(queryWrapper);
    }
    /**
     * æŒä¹…化保存
     * @param info
     */
    public void addData(EventInfo info) {
        if(StringUtils.isBlank(info.getId())){
            info.setId(ContextUtil.generateId());
        }
        if(StringUtils.isBlank(info.getCompanyId())){
            info.setCompanyId(ContextUtil.getCompanyId());
        }
        info.setUpdateBy(ContextUtil.getLoginUserName());
        info.setUpdateTime(new Date());
        info.setCreateBy(ContextUtil.getLoginUserName());
        info.setCreateTime(new Date());
        eventInfoMapper.insert(info);
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/FileService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fzzy.igds.domain.FileInfo;
import com.fzzy.igds.mapper.FileMapper;
import com.fzzy.igds.utils.Base64Util;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.config.FrameworkConfig;
import org.apache.commons.lang3.time.DateFormatUtils;
@@ -98,15 +99,7 @@
    }
    /**
     *
     * @param id
     */
    public void delFile(String id) {
        fileMapper.deleteById(id);
    }
    /**
     * èŽ·å–å‡ºå…¥åº“æ–‡ä»¶è·¯å¾„
     * æ ¹æ®ç±»åž‹èŽ·å–æ–‡ä»¶è·¯å¾„
     * @param pathTag
     * @return
     */
@@ -114,19 +107,51 @@
        if(StringUtils.isBlank(pathTag)){
            pathTag = "COMMON";
        }
        if("EVENT".equals(pathTag)) return getEventFilePath();
        if("SNAP".equals(pathTag)) return getSnapFilePath();
        if("INOUT".equals(pathTag)) return getInoutFilePath();
        if("PATROL".equals(pathTag)) return getPatrolFilePath();
        if("DEPT".equals(pathTag)) return getDeptFilePath();
        if("TEMP".equals(pathTag)) return getTempFilePath();
        if("CONF".equals(pathTag)) return getConfPath();
        if("TEMPLATE".equals(pathTag)) return getTemplateFilePath();
        if("WORD".equals(pathTag)) return getWordPath();
        return getCommonFilePath();
    }
    /**
     * èŽ·å–å‡ºå…¥åº“æ–‡ä»¶è·¯å¾„
     * èŽ·å–äº‹ä»¶æ–‡ä»¶è·¯å¾„
     * @return
     */
    public String getEventFilePath() {
        String basePath = FrameworkConfig.getProfile() + "EVENT/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * èŽ·å–æŠ“æ‹æ–‡ä»¶è·¯å¾„
     * @return
     */
    public String getSnapFilePath() {
        String basePath = FrameworkConfig.getProfile() + "SNAP/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * èŽ·å–å·¡æ£€æ–‡ä»¶è·¯å¾„
     * @return
     */
    public String getPatrolFilePath() {
        String basePath = FrameworkConfig.getProfile() + "INOUT/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/";
        String basePath = FrameworkConfig.getProfile() + "PATROL/" + DateFormatUtils.format(new Date(), "yyyyMM") + "/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
@@ -179,15 +204,11 @@
    /**
     * èŽ·å–ä¸´æ—¶è·¯å¾„
     * @param companyId
     * @return
     */
    public String getTempFilePath(String companyId) {
    public String getTempFilePath() {
        String basePath = FrameworkConfig.getProfile() + "TEMP/";
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(companyId)) {
            basePath += companyId + "/";
        }
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
@@ -207,6 +228,42 @@
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * èŽ·å–æ¨¡æ¿è·¯å¾„ï¼šæ‰€æœ‰æ¨¡æ¿ç»Ÿä¸€æ”¾åœ¨TEMPLATE/目录下
     * @return
     */
    public String getTemplateFilePath() {
        String basePath = FrameworkConfig.getProfile() + "TEMPLATE/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * èŽ·å–word路径
     * @return
     */
    public String getWordPath() {
        String basePath = FrameworkConfig.getProfile()  + "WORD/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * base64转图片保存
     * @param filePath
     * @param imgData
     */
    public void baseImg2Disk(String filePath, String imgData) {
        Base64Util.generateImage(imgData, filePath);
    }
    /**
@@ -252,33 +309,5 @@
        return path;
    }
    /**
     * èŽ·å–æ¨¡æ¿è·¯å¾„ï¼šæ‰€æœ‰æ¨¡æ¿ç»Ÿä¸€æ”¾åœ¨TEMPLATE/目录下
     * @return
     */
    public String getTemplateFilePath() {
        String basePath = FrameworkConfig.getProfile() + "TEMPLATE/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
    /**
     * èŽ·å–word路径
     * @param deptId
     * @return
     */
    public String getWordPath(String deptId) {
        if(StringUtils.isBlank(deptId)){
            deptId = "0000";
        }
        String basePath = FrameworkConfig.getProfile() + deptId + "/WORD/";
        File file = new File(basePath);
        if (!file.exists()) {
            file.mkdirs();
        }
        return basePath;
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/GatewaySerService.java
@@ -12,6 +12,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
@@ -102,19 +103,40 @@
        if (StringUtils.isEmpty(ser.getDeptId())) {
            ser.setDeptId(ContextUtil.subDeptId(null));
        }
        if (StringUtils.isBlank(ser.getUpdateBy())) {
        ser.setUpdateBy(ContextUtil.getLoginUserName());
        ser.setUpdateTime(new Date());
        if (StringUtils.isBlank(ser.getCreateBy())) {
            ser.setHeartbeatTime(new Date());
            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  ä¿¡æ¯
     * @param status  çŠ¶æ€
     * @param isUpdateTime  æ˜¯å¦æ›´æ–°å¿ƒè·³æ—¶é—´
     */
    @Async
    public void updateStatus(GatewaySer ser, String status, boolean isUpdateTime) {
        if(isUpdateTime){
            //心跳时间
            ser.setHeartbeatTime(new Date());
        }
        ser.setUpdateTime(new Date());
        ser.setStatus(status);
        gatewaySerMapper.updateById(ser);
        setCacheSer(ser);
    }
    /**
@@ -128,34 +150,6 @@
        //删除缓存
        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;
    }
    /**
@@ -178,7 +172,6 @@
            return null;
        }
        List<GatewaySer> list = new ArrayList<>();
        GatewaySer ser = null;
        for (String key : keys) {
            ser = (GatewaySer) redisCache.getCacheObject(key);
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SecCameraService.java
@@ -6,6 +6,7 @@
import com.fzzy.igds.domain.Camera;
import com.fzzy.igds.mapper.CameraMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.igds.utils.DateUtil;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
@@ -73,6 +74,30 @@
    }
    /**
     * èŽ·å–æ›´æ–°ç›‘æŽ§æ•°é‡
     * @param deptId
     * @param start
     * @param end
     * @return
     */
    public int getUpdateCount(String deptId, Date start, Date end) {
        QueryWrapper<Camera> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(deptId)){
            queryWrapper.eq("dept_id", deptId);
        }
        if (null != start) {
            queryWrapper.ge("update_time", start);
        }
        if (null != end) {
            queryWrapper.le("update_time", end);
        }
        return cameraMapper.selectCount(queryWrapper);
    }
    /**
     * ä¿å­˜æ•°æ®
     * @param data
     */
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapConfService.java
@@ -2,15 +2,12 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fzzy.igds.data.BaseResp;
import com.fzzy.igds.data.IgdsBaseParam;
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;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@@ -39,13 +36,26 @@
    }
    /**
     * æ ¹æ®ID查询详情
     *
     * @param id ä¸»é”®ID
     * @return å®žä½“对象
     * èŽ·å–æ›´æ–°é…ç½®æ•°é‡
     * @param deptId
     * @param start
     * @param end
     * @return
     */
    public SnapConf selectById(String id) {
        return snapConfMapper.selectById(id);
    public int getUpdateCount(String deptId, Date start, Date end) {
        QueryWrapper<SnapConf> queryWrapper = new QueryWrapper<>();
        if(StringUtils.isNotBlank(deptId)){
            queryWrapper.eq("dept_id", deptId);
        }
        if (null != start) {
            queryWrapper.ge("update_time", start);
        }
        if (null != end) {
            queryWrapper.le("update_time", end);
        }
        return snapConfMapper.selectCount(queryWrapper);
    }
    /**
@@ -87,17 +97,6 @@
            return BaseResp.error("更新失败:" + e.getMessage());
        }
    }
    /**
     * åˆ é™¤æŒ‡å®šID的数据
     *
     * @param param è¦åˆ é™¤çš„记录
     * @return æ“ä½œç»“æžœ
     */
    public BaseResp deleteData(SnapConf param) {
        return snapConfMapper.deleteById(param) > 0 ? BaseResp.success() : BaseResp.error("删除失败");
    }
    /**
     * æ›´æ–°æ‰§è¡Œæ—¶é—´
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapRecordService.java
@@ -97,20 +97,22 @@
    }
    /**
     * æ–°å¢žæ•°æ®
     *
     * æŒä¹…化保存
     * @param snapRecord
     * @author sgj
     * @date 2025/12/10
     */
    public BaseResp addData(SnapRecord snapRecord) {
    public void addData(SnapRecord snapRecord) {
        if(StringUtils.isBlank(snapRecord.getId())){
        snapRecord.setId(ContextUtil.generateId());
        }
        if(StringUtils.isBlank(snapRecord.getCompanyId())){
        snapRecord.setCompanyId(ContextUtil.getCompanyId());
        }
        snapRecord.setUpdateBy(ContextUtil.getLoginUserName());
        snapRecord.setUpdateTime(new Date());
        snapRecord.setCreateBy(ContextUtil.getLoginUserName());
        snapRecord.setCreateTime(new Date());
        return snapRecordMapper.insert(snapRecord) > 0 ? BaseResp.success() : BaseResp.error("添加失败");
        snapRecordMapper.insert(snapRecord);
    }
    /**
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/Base64Util.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.fzzy.igds.utils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
/**
 * @Description å›¾ç‰‡Base处理
 * @Author CZT
 * @Date 2026/1/7 11:07
 */
public class Base64Util {
    public static String BASE_IMG_START = "data:image/jpg;base64,";
    /**
     * æ ¹æ®åœ°å€ï¼ŒæŠŠå›¾ç‰‡è½¬æ¢ä¸ºBase64字符串
     * <p>
     * data:image/jpg;base64,
     *
     * @param diskFile
     * @return
     */
    public static String getImageStr(String diskFile) {
        InputStream in = null;
        byte[] data = null;
        // è¯»å–图片字节数组
        try {
            in = new FileInputStream(diskFile);
            data = new byte[in.available()];
            in.read(data);
            // in.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != in)
                    in.close();
            } catch (Exception e) {
            }
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return BASE_IMG_START + encoder.encode(data);
    }
    /**
     * å¯¹å­—节数组字符串进行Base64解码并生成图片
     *
     * @param imgStr
     * @return
     */
    public static boolean generateImage(String imgStr, String diskFile) {
        if (imgStr == null)
            return false;
        if (imgStr.startsWith("data:")) {
            imgStr = imgStr.substring(BASE_IMG_START.length());
        }
        BASE64Decoder decoder = new BASE64Decoder();
        OutputStream out = null;
        try {
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            // ç”Ÿæˆjpeg图片
            out = new FileOutputStream(diskFile);
            out.write(b);
            out.flush();
            // out.close();
            return true;
        } catch (Exception e) {
            return false;
        } finally {
            try {
                if (null != out)
                    out.close();
            } catch (Exception e) {
            }
        }
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/ApiV1Controller.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.fzzy.igds.api.v1;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.api.v1.service.*;
import com.fzzy.igds.api.v1.util.ApiV1Constant;
import com.fzzy.igds.constant.Constant;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.service.GatewaySerService;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
/**
 * @Description ç›‘管接口解析入口
 * @Author CZT
 * @Date 2026/1/7 10:25
 */
@Slf4j
@Controller
@RequestMapping("api/igdss/v1")
public class ApiV1Controller {
    @Resource
    private GatewaySerService gatewaySerService;
    @Resource
    private ApiV1Service3010 apiV1Service3010;
    @Resource
    private ApiV1Service3020 apiV1Service3020;
    @Resource
    private ApiV1Service3021 apiV1Service3021;
    @Resource
    private ApiV1Service3030 apiV1Service3030;
    @Resource
    private ApiV1Service3031 apiV1Service3031;
    @PostMapping
    @ResponseBody
    public ApiV1Resp<Object> gateway(@RequestBody ApiV1Req<JSONObject> req) {
        log.info("质押监管接口V1,收到库区网关信息={}", req);
        try {
            //参数校验
            if (req == null) {
                return ApiV1Resp.error("参数有误!", req);
            }
            //校验接口编码和网关SN
            if (StringUtils.isEmpty(req.getFunctionId()) || StringUtils.isEmpty(req.getSn())) {
                return ApiV1Resp.error("参数有误!", req);
            }
            //校验网关是否存在
            GatewaySer gatewaySer = gatewaySerService.getCacheSerById(null, req.getSn());
            if (null == gatewaySer) {
                return ApiV1Resp.error("当前网关<SN=" + req.getSn() + ">暂未添加,请核查!", req);
            }
            //异步更新网关状态
            gatewaySerService.updateStatus(gatewaySer, Constant.YN_Y, ApiV1Constant.API_FUNCTION_3010.equals(req.getFunctionId()));
            //解析
            String functionId = req.getFunctionId();
            switch (functionId) {
                case ApiV1Constant.API_FUNCTION_3010:
                    return apiV1Service3010.analysis(req, gatewaySer);
                case ApiV1Constant.API_FUNCTION_3020:
                    return apiV1Service3020.analysis(req, gatewaySer);
                case ApiV1Constant.API_FUNCTION_3021:
                    return apiV1Service3021.analysis(req, gatewaySer);
                case ApiV1Constant.API_FUNCTION_3030:
                    return apiV1Service3030.analysis(req, gatewaySer);
                case ApiV1Constant.API_FUNCTION_3031:
                    return apiV1Service3031.analysis(req, gatewaySer);
            }
            return ApiV1Resp.error("接口编码<" + functionId + ">不存在,请核查!", req);
        } catch (Exception e) {
            log.info("质押监管接口V1,接口解析异常={}", e.toString());
            return ApiV1Resp.error("解析异常!", req);
        }
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/ApiV1Req.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.fzzy.igds.api.v1.data;
import lombok.Data;
import java.io.Serializable;
/**
 * @Description   æŽ¥å£è¯·æ±‚封装类
 * @Author CZT
 * @Date 2026/1/7 9:59
 */
@Data
public class ApiV1Req<T> implements Serializable {
    /*-----消息头-----*/
    private String sn;         //设备、系统编码
    private String auth;       //权限标识
    private String sign;       //权限签名
    private String outId;      //自定义编码
    private String functionId; //功能码
    private Long timestamp;    //时间戳
    /*-----消息体-----*/
    private T data;
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/ApiV1Resp.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.fzzy.igds.api.v1.data;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.io.Serializable;
/**
 * @Description æŽ¥å£å›žå¤å°è£…ç±»
 * @Author CZT
 * @Date 2026/1/7 10:02
 */
@Data
public class ApiV1Resp<T> implements Serializable {
    /**
     * è¿”回码
     */
    public static final String CODE_SUCCESS = "200";
    public static final String CODE_ERROR = "400";
    /*-----消息头-----*/
    private String sn;         //设备、系统编码
    private String auth;       //权限标识
    private String sign;       //权限签名
    private String outId;      //自定义编码
    private String functionId; //功能码
    private Long timestamp;    //时间戳
    private String respCode;     //返回码
    private String respMsg;      //返回说明
    /*-----消息体-----*/
    private T data;
    public ApiV1Resp() {
        super();
    }
    public ApiV1Resp(String respCode, String respMsg, T data, ApiV1Req<JSONObject> req) {
        this.data = data;
        this.sn = req.getSn();
        this.auth = req.getAuth();
        this.sign = req.getSign();
        this.outId = req.getOutId();
        this.functionId = req.getFunctionId();
        this.timestamp = System.currentTimeMillis();
        this.respCode = respCode;
        this.respMsg = respMsg;
    }
    public static ApiV1Resp<Object> success(Object data, ApiV1Req<JSONObject> req) {
        return new ApiV1Resp<>(CODE_SUCCESS, null, data, req);
    }
    public static ApiV1Resp<Object> error(String respMsg, ApiV1Req<JSONObject> req) {
        return new ApiV1Resp<>(CODE_ERROR, respMsg, null, req);
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/Param3030.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.fzzy.igds.api.v1.data;
import lombok.Data;
import java.io.Serializable;
/**
 * @Description æŠ“拍信息封装类
 * @Author CZT
 * @Date 2026/1/7 10:20
 */
@Data
public class Param3030 implements Serializable {
    private String cameraId;
    private String cameraName;
    private String result;
    private String tags;
    private String snapTime;
    private String imgBase64;
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/Param3031.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.fzzy.igds.api.v1.data;
import lombok.Data;
import java.io.Serializable;
/**
 * @Description
 * @Author CZT
 * @Date 2026/1/7 10:21
 */
@Data
public class Param3031 implements Serializable {
    private String cameraId;
    private String cameraName;
    private String name;
    private String bizType;
    private String type;
    private String level;
    private String info;
    private String time;
    private String tags;
    private String imgBase64;
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/data/package-info.java
ÎļþÒÑɾ³ý
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3010.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.fzzy.igds.api.v1.service;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.api.v1.util.ApiV1Constant;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.service.SecCameraService;
import com.fzzy.igds.service.SnapConfService;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
/**
 * @Description å¿ƒè·³è§£æž
 * @Author CZT
 * @Date 2026/1/7 11:01
 */
@Component
public class ApiV1Service3010 {
    @Resource
    private SecCameraService cameraService;
    @Resource
    private SnapConfService snapConfService;
    /**
     *
     * @param req
     * @param gatewaySer
     * @return
     */
    public ApiV1Resp<Object> analysis(ApiV1Req<JSONObject> req, GatewaySer gatewaySer) {
        Date end = new Date();
        Date start = gatewaySer.getHeartbeatTime();
        String functionId = "";
        //判断抓拍配置是否有更新
        int snapConfCount = snapConfService.getUpdateCount(gatewaySer.getDeptId(), start, end);
        if (snapConfCount > 0) {
            functionId += ApiV1Constant.API_FUNCTION_3020 + ",";
        }
        //判断监控是有更新
        int cameraCount = cameraService.getUpdateCount(gatewaySer.getDeptId(), start, end);
        if (cameraCount > 0) {
            functionId += ApiV1Constant.API_FUNCTION_3021 + ",";
        }
        if (StringUtils.isNotBlank(functionId)) {
            req.setFunctionId(functionId);
        }
        return ApiV1Resp.success(null, req);
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3020.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.fzzy.igds.api.v1.service;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.domain.SnapConf;
import com.fzzy.igds.service.SnapConfService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Description æŠ“拍配置解析
 * @Author CZT
 * @Date 2026/1/7 11:03
 */
@Component
public class ApiV1Service3020 {
    @Resource
    private SnapConfService snapConfService;
    /**
     *
     * @param req
     * @param gatewaySer
     * @return
     */
    public ApiV1Resp<Object> analysis(ApiV1Req<JSONObject> req, GatewaySer gatewaySer) {
        //获取库区下所有抓拍配置
        List<SnapConf> list = snapConfService.selectList(gatewaySer.getDeptId());
        if(null == list || list.isEmpty()){
            return ApiV1Resp.error("未获取到抓拍配置信息!", req);
        }
        return ApiV1Resp.success(list, req);
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3021.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.fzzy.igds.api.v1.service;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.domain.Camera;
import com.fzzy.igds.domain.GatewaySer;
import com.fzzy.igds.service.SecCameraService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Description ç›‘控配置解析
 * @Author CZT
 * @Date 2026/1/7 11:05
 */
@Component
public class ApiV1Service3021 {
    @Resource
    private SecCameraService cameraService;
    /**
     *
     * @param req
     * @param gatewaySer
     * @return
     */
    public ApiV1Resp<Object> analysis(ApiV1Req<JSONObject> req, GatewaySer gatewaySer) {
        //获取库区下所有监控信息
        List<Camera> list = cameraService.getCameraByDeptId(gatewaySer.getCompanyId(), gatewaySer.getDeptId());
        if(null == list || list.isEmpty()){
            return ApiV1Resp.error("未获取到监控信息!", req);
        }
        return ApiV1Resp.success(list, req);
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3030.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.fzzy.igds.api.v1.service;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.api.v1.data.Param3030;
import com.fzzy.igds.domain.GatewaySer;
import com.alibaba.fastjson.JSONObject;
import com.fzzy.igds.domain.SnapRecord;
import com.fzzy.igds.service.FileService;
import com.fzzy.igds.service.SnapRecordService;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.config.FrameworkConfig;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Description æŠ“拍解析
 * @Author CZT
 * @Date 2026/1/7 11:07
 */
@Component
public class ApiV1Service3030 {
    @Resource
    private SnapRecordService snapRecordService;
    @Resource
    private FileService fileService;
    /**
     *
     * @param req
     * @param gatewaySer
     * @return
     */
    public ApiV1Resp<Object> analysis(ApiV1Req<JSONObject> req, GatewaySer gatewaySer) throws Exception{
        //转化为对象
        List<Param3030> list = JSONObject.parseArray(req.getData().toString(), Param3030.class);
        if(null == list || list.isEmpty()){
            return ApiV1Resp.error("抓拍信息为空,不解析!", req);
        }
        step1(list, gatewaySer);
        return ApiV1Resp.success(null, req);
    }
    /**
     * å¼‚步解析
     * @param list
     */
    @Async
    public void step1(List<Param3030> list, GatewaySer gatewaySer) throws Exception {
        SnapRecord snapRecord;
        for (Param3030 param3030 : list) {
            snapRecord = new SnapRecord();
            snapRecord.setId(ContextUtil.generateId());
            snapRecord.setCompanyId(gatewaySer.getCompanyId());
            snapRecord.setDeptId(gatewaySer.getDeptId());
            snapRecord.setCameraId(param3030.getCameraId());
            snapRecord.setResult(param3030.getResult());
            snapRecord.setTags(param3030.getTags());
            snapRecord.setSnapTime(DateUtils.parseDate(param3030.getSnapTime(),"yyyy-MM-dd HH:mm:ss"));
            //base64转化为图片保存
            String savePath = fileService.getFileSavePath("SNAP");
            String fileName = ContextUtil.UUID() + ".jpg";
            String filePath = savePath+fileName;
            fileService.baseImg2Disk(filePath, param3030.getImgBase64());
            //设置保存图片路径
            snapRecord.setImgName(filePath.replace(FrameworkConfig.getProfile(), "/profile/"));
            snapRecordService.addData(snapRecord);
        }
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/service/ApiV1Service3031.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
package com.fzzy.igds.api.v1.service;
import com.fzzy.igds.api.v1.data.ApiV1Req;
import com.fzzy.igds.api.v1.data.ApiV1Resp;
import com.fzzy.igds.api.v1.data.Param3030;
import com.fzzy.igds.api.v1.data.Param3031;
import com.fzzy.igds.constant.WarnStatus;
import com.fzzy.igds.domain.EventInfo;
import com.fzzy.igds.domain.GatewaySer;
import com.alibaba.fastjson.JSONObject;
import com.fzzy.igds.domain.SnapRecord;
import com.fzzy.igds.service.EventInfoService;
import com.fzzy.igds.service.FileService;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.config.FrameworkConfig;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @Description AI事件解析
 * @Author CZT
 * @Date 2026/1/7 11:09
 */
@Component
public class ApiV1Service3031 {
    @Resource
    private EventInfoService eventInfoService;
    @Resource
    private FileService fileService;
    /**
     *
     * @param req
     * @param gatewaySer
     * @return
     */
    public ApiV1Resp<Object> analysis(ApiV1Req<JSONObject> req, GatewaySer gatewaySer) throws Exception {
        //转化为对象
        List<Param3031> list = JSONObject.parseArray(req.getData().toString(), Param3031.class);
        if(null == list || list.isEmpty()){
            return ApiV1Resp.error("抓拍信息为空,不解析!", req);
        }
        step1(list, gatewaySer);
        return ApiV1Resp.success(null, req);
    }
    /**
     * å¼‚步解析
     * @param list
     */
    @Async
    public void step1(List<Param3031> list, GatewaySer gatewaySer) throws Exception {
        EventInfo info;
        for (Param3031 param : list) {
            info = new EventInfo();
            info.setId(ContextUtil.generateId());
            info.setCompanyId(gatewaySer.getCompanyId());
            info.setDeptId(gatewaySer.getDeptId());
            info.setSerId(param.getCameraId());
            info.setName(param.getName());
            info.setBizType(param.getBizType());
            info.setType(param.getType());
            info.setLevel(param.getLevel());
            info.setInfo(param.getInfo());
            info.setTime(DateUtils.parseDate(param.getTime(),"yyyy-MM-dd HH:mm:ss"));
            info.setTags(param.getTags());
            //base64转化为图片保存
            String savePath = fileService.getFileSavePath("EVENT");
            String fileName = ContextUtil.UUID() + ".jpg";
            String filePath = savePath+fileName;
            fileService.baseImg2Disk(filePath, param.getImgBase64());
            //设置保存图片路径
            info.setImgName(filePath.replace(FrameworkConfig.getProfile(), "/profile/"));
            eventInfoService.addData(info);
        }
    }
}
fzzy-igdss-inte/src/main/java/com/fzzy/igds/api/v1/util/ApiV1Constant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.fzzy.igds.api.v1.util;
/**
 * @Description  æŽ¥å£å¸¸é‡ç±»
 * @Author CZT
 * @Date 2026/1/7 10:03
 */
public class ApiV1Constant {
    /*----------接口编码----------*/
    /**
     * å¿ƒè·³æŽ¥å£ç¼–码
     */
    public static final String API_FUNCTION_3010 = "3010";
    /**
     * åŒæ­¥æŠ“拍配置接口编码
     */
    public static final String API_FUNCTION_3020 = "3020";
    /**
     * åŒæ­¥ç›‘控配置接口编码
     */
    public static final String API_FUNCTION_3021 = "3021";
    /**
     * æŽ¨é€æŠ“拍信息接口编码
     */
    public static final String API_FUNCTION_3030 = "3030";
    public static final String API_FUNCTION_3031 = "3031";
}
fzzy-igdss-web/src/main/java/com/fzzy/common/manager/ExportManager.java
@@ -52,7 +52,7 @@
            }
            //获取模板路径
            String templatePath = fileService.getTemplateFilePath();
            String templatePath = fileService.getFileSavePath("TEMPLATE");
            File file = new File(templatePath + templateName);
            if (!file.exists()) {
                log.error("模板文件不存在,不执行导出!");
@@ -60,7 +60,7 @@
            }
            //获取文件保存路径,以库区分开
            String savePath = fileService.getWordPath(null);
            String savePath = fileService.getFileSavePath(null);
            param.setTemplatePath(templatePath);
            param.setTemplateName(templateName);
fzzy-igdss-web/src/main/java/com/fzzy/grain/manager/GrainExportBuilder.java
@@ -88,7 +88,7 @@
            }
            result = ContextUtil.getTimeId() + ".xls";
            String tempPath = fileService.getTempFilePath(depot == null ? ContextUtil.getCompanyId() : depot.getCompanyId());
            String tempPath = fileService.getFileSavePath("TEMP");
            FileOutputStream fos = new FileOutputStream(tempPath + "/" + result);
            toWorkbook.write(fos);
            if (null != fos) fos.close();
@@ -104,7 +104,7 @@
    private HSSFWorkbook getFromWorkBook(GrainData data, Depot depot) throws Exception {
        FileInputStream fis = null;
        String filePath = fileService.getConfPath();
        String filePath = fileService.getFileSavePath("CONF");
        try {
            //获取模版的名称,注意筒仓名称配置规则
            if (StringUtils.isEmpty(data.getCableCir())) {
fzzy-igdss-web/src/main/java/com/fzzy/security/EventInfoController.java
@@ -26,7 +26,7 @@
@RequestMapping("/security/eventInfo")
public class EventInfoController {
    private static final String prefix = "security/eventInfo";
    private static final String prefix = "security";
    @Resource
    private EventInfoManager eventInfoManager;
fzzy-igdss-web/src/main/java/com/fzzy/security/SnapRecordController.java
@@ -23,7 +23,7 @@
@RequestMapping("/security/snap/snapRecord")
public class SnapRecordController {
    private static final String prefix = "security/snap/snapRecord";
    private static final String prefix = "security";
    @Resource
    private SnapRecordManager snapRecordManager;
fzzy-igdss-web/src/main/resources/templates/security/eventInfo.html
fzzy-igdss-web/src/main/resources/templates/security/snapRecord.html