sgj
10 小时以前 711221e4b28157efc1762508e73e07311aa57a1e
AI事件管理修改
已修改7个文件
219 ■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/EventInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/EventInfoController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo-style.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo.js 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/security/eventInfo/eventInfo.html 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/EventInfo.java
@@ -91,6 +91,10 @@
    @TableField("complete_time")
    private Date completeTime;
    @Column(name = "tags", columnDefinition = "varchar(100) COMMENT '标签'")
    @TableField("tags")
    private String tags ;
    @Column(name = "remark", columnDefinition = "varchar(200) COMMENT '备注说明'")
    @TableField("remark")
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java
@@ -43,14 +43,23 @@
        param.setCompanyId(ContextUtil.getCompanyId());
        queryWrapper.eq("company_id", param.getCompanyId());
        //库区
        //库区检索
        if (StringUtils.isNotBlank(param.getDeptId())) {
            queryWrapper.eq("dept_id", param.getDeptId());
        }
        //仓库
        //仓库检索
        if (StringUtils.isNotBlank(param.getDepotId())) {
            queryWrapper.eq("depot_id", param.getDepotId());
        }
        // 收储公司检索
        if (StringUtils.isNotBlank(param.getKey())) {
            queryWrapper.apply("dept_id IN (SELECT dept_id FROM sys_dept WHERE parent_id = {0})", param.getKey());
        }
        //抓拍时间检索
        if (param.getStart() != null && param.getEnd() != null) {
            queryWrapper.between("time", param.getStart(), param.getEnd());
        }
        queryWrapper.orderByDesc("create_time");
        return queryWrapper;
fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/EventInfoController.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fzzy.igds.constant.RespCodeEnum;
import com.fzzy.igds.constant.WarnType;
import com.fzzy.igds.data.IgdsBaseParam;
import com.fzzy.igds.data.PageResponse;
import com.fzzy.igds.domain.EventInfo;
import com.fzzy.sys.manager.common.CommonManager;
import com.fzzy.sys.manager.security.EventInfoManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
@@ -15,6 +17,10 @@
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Controller
@@ -25,6 +31,9 @@
    @Resource
    private EventInfoManager eventInfoManager;
    @Resource
    private CommonManager commonManager;
    /**
     * AI事件管理页面
@@ -46,6 +55,21 @@
        model.addAttribute("currentPage", events.getCurrent());
        model.addAttribute("totalItems", events.getTotal());
        model.addAttribute("pageSize", events.getSize());
        //设备数据
        model.addAttribute("cameraList", commonManager.listCameraData());
        //库区数据
        model.addAttribute("deptList", commonManager.listDeptData());
        //业务类型数据
        List<Map<String, String>> bizTypeList = new ArrayList<>();
        for (WarnType type : WarnType.values()) {
            Map<String, String> item = new HashMap<>();
            item.put("code", type.getCode());
            item.put("msg", type.getMsg());
            bizTypeList.add(item);
        }
        model.addAttribute("bizTypeList", bizTypeList);
        //公司数据
        model.addAttribute("companyList", commonManager.listCompanyData());
        return prefix + "/eventInfo";
    }
@@ -59,9 +83,9 @@
    @ResponseBody
    public PageResponse<Page<EventInfo>> pageData(@RequestBody IgdsBaseParam param) {
        Page<EventInfo> eventInfoPage = eventInfoManager.pageData(param);
        if (null == eventInfoPage.getRecords() || eventInfoPage.getRecords().isEmpty()) {
            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "获取到数据信息为空");
        }
//        if (null == eventInfoPage.getRecords() || eventInfoPage.getRecords().isEmpty()) {
//            return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "获取到数据信息为空");
//        }
        return new PageResponse<>(RespCodeEnum.CODE_0000, eventInfoPage);
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java
@@ -2,12 +2,10 @@
import com.fzzy.igds.constant.DepotType;
import com.fzzy.igds.domain.Camera;
import com.fzzy.igds.domain.Company;
import com.fzzy.igds.domain.Depot;
import com.fzzy.igds.domain.Dept;
import com.fzzy.igds.service.CoreDeptService;
import com.fzzy.igds.service.DepotService;
import com.fzzy.igds.service.DicService;
import com.fzzy.igds.service.SecCameraService;
import com.fzzy.igds.service.*;
import com.fzzy.igds.utils.ContextUtil;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -44,6 +42,8 @@
    @Resource
    private ISysDeptService iSysDeptService;
    @Resource
    private CoreCompanyService coreCompanyService;
    /**
     * 根据库区编码获取库区下所有仓库列表
     *
@@ -154,4 +154,14 @@
    public  List<Camera>  listCameraData() {
        return secCameraService.listCamera(ContextUtil.getCompanyId(),ContextUtil.subDeptId(null));
    }
    /**
     * 获取收储公司列表
     *
     * @author sgj
     * @date 2025/12/17
     */
    public  List<Company>  listCompanyData() {
        SysUser user = ContextUtil.getLoginUser();
        return coreCompanyService.listCompany(null, null, user.getDeptId() + "");    }
}
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo-style.css
@@ -70,7 +70,7 @@
.gallery-img {
    width: 100%;
    height: 240px;
    height: 229px;
    object-fit: cover;
    cursor: pointer;
    transition: all 0.3s ease;
fzzy-igdss-web/src/main/resources/static/security/eventInfo/eventInfo.js
@@ -24,7 +24,9 @@
        count: typeof totalItems !== 'undefined' ? totalItems : 0,
        limit: typeof pageSize !== 'undefined' ? pageSize : 6,
        curr: typeof currentPage !== 'undefined' ? currentPage : 1,
        layout: ['prev', 'page', 'next', 'refresh', 'skip'],
        layout: ['prev', 'next'],
        prev: '<i class="layui-icon layui-icon-left"></i>',
        next: '<i class="layui-icon layui-icon-right"></i>',
        jump: function (obj, first) {
            if (!first) {
                searchRecord(obj.curr, obj.limit)
@@ -45,7 +47,9 @@
        count: totalCount,
        limit: pageSize,
        curr: currentPage,
        layout: ['prev', 'page', 'next', 'refresh', 'skip'],
        layout: ['prev', 'next'],
        prev: '<i class="layui-icon layui-icon-left"></i>',
        next: '<i class="layui-icon layui-icon-right"></i>',
        jump: function (obj, first) {
            if (!first) {
                searchRecord(obj.curr, obj.limit)
@@ -94,7 +98,8 @@
    // 添加表单查询条件
    var form = document.getElementById('eventInfo-form');
    if (form) {
        var inputs = form.querySelectorAll('input[name], select[name]');
        // 处理普通输入框和选择框,排除隐藏域
        var inputs = form.querySelectorAll('input[name]:not([type="hidden"]), select[name]');
        inputs.forEach(function(input) {
            if (input.value) { // 只添加非空值
                params[input.name] = input.value;
@@ -136,6 +141,20 @@
    // 生成事件卡片
    var html = '';
    records.forEach(function(record) {
        // 标签展示
        var tagsHtml = '';
        if (record.tags) {
            var tags = record.tags.split(',');
            tags.forEach(function(tag) {
                tagsHtml += `
            <span class="tag-person">
                <i class="layui-icon layui-icon-note"></i>
                <span>${tag.trim()}</span>
            </span>
        `;
            });
        }
        html += `
            <div class="gallery-item">
                <img src="${record.imgName || '/logo-sm.png'}" alt="${record.id}"
@@ -144,37 +163,25 @@
                <div class="gallery-info">
                    <div class="gallery-header">
                        <h3 class="gallery-title">${record.name || record.id}</h3>
                         <div class="gallery-tags">
                            <span class="tag-person">
                                <i class="layui-icon layui-icon-note"></i>
                                <span>汽车</span>
                            </span>
                            <span class="tag-person">
                                <i class="layui-icon layui-icon-note"></i>
                                <span>卡车</span>
                            </span>
                            <span class="tag-person">
                                <i class="layui-icon layui-icon-note"></i>
                                <span>翻斗车</span>
                            </span>
                        <div class="gallery-tags">
                            ${tagsHtml}
                        </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-video"></i>
                                <span>${record.serId || ''}</span>
                                <span>${getCameraName(record.serId) || record.serId || ''}</span>
                            </div>
                            <div class="meta-item" style="width: 50%">
                                <i class="layui-icon layui-icon-date"></i>
                                <span>${formatDate(record.time)}</span>
                            </div>
                        </div>
                        <div class="meta-item" >
                            <i class="layui-icon layui-icon-home"></i>
                            <span>${record.deptId || ''}</span>
                        <div class="meta-item">
                            <i class="layui-icon layui-icon-component"></i>
                            <span>${getTypeName(record.bizType) || record.bizType || ''}</span>
                        </div>
                    </div>
                </div>
            </div>
@@ -183,6 +190,42 @@
    container.innerHTML = html;
}
/**
 * 根据摄像头ID获取摄像头名称
 * @param {string} serId - 摄像头ID
 * @returns {string|null} 摄像头名称或null
 */
function getCameraName(serId) {
    // 确保cameraList存在且为数组
    if (typeof cameraList !== 'undefined' && Array.isArray(cameraList) && serId) {
        // 查找匹配的摄像头对象
        var camera = cameraList.find(function(item) {
            return item.id === serId;
        });
        // 返回摄像头名称,如果找不到则返回null
        return camera ? camera.name : null;
    }
    return null;
}
/**
 * 根据业务类型编码获取业务类型名称
 * @param {string} bizType - 业务类型编码
 * @returns {string|null} 业务类型名称或null
 */
function getTypeName(bizType) {
    if (typeof bizTypeList !== 'undefined' && Array.isArray(bizTypeList) && bizType) {
        // 查找匹配的业务类型对象
        var type = bizTypeList.find(function(item) {
            return item.code === bizType;
        });
        // 返回业务类型名称,如果找不到则返回null
        return type ? type.msg : null;
    }
    return null;
}
/**
 * 格式化日期
@@ -195,7 +238,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.getMinutes()).padStart(2, '0');
}
/**
@@ -254,7 +297,7 @@
/**
 * 读取事件记录
 */
function searchRecord(page , size) {
function searchRecord(page, size) {
    var pageNumber = 1;
    var sizeNumber = 6;
    if (pageSize && pageSize > 0){
fzzy-igdss-web/src/main/resources/templates/security/eventInfo/eventInfo.html
@@ -6,8 +6,9 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="renderer" content="webkit">
    <th:block th:include="include :: header('AI事件管理')"/>
    <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui-ruoyi/css/layui.css}"/>
    <link rel="stylesheet" type="text/css" th:href="@{/ajax/libs/layui/css/layui.css}"/>
    <link rel="stylesheet" th:href="@{/security/eventInfo/eventInfo-style.css}">
    <th:block th:include="include :: select2-css" />
</head>
<body class="gray-bg">
<div class="container-div">
@@ -18,20 +19,24 @@
                <div class="select-list">
                    <ul>
                        <li>
                            收储公司:<select name="companyId">
                            <option value="all">所有</option>
                            收储公司:<select  class="form-control"  name="key">
                            <option value="">所有</option>
                            <option th:each="company : ${companyList}" th:value="${company.id}" th:text="${company.dwmc}">
                            </option>
                        </select>
                        </li>
                        <li>
                            所选库区:<select name="deptId">
                            所选库区:<select class="form-control"  name="deptId">
                            <option value="">所有</option>
                            <option th:each="dept : ${deptList}" th:value="${dept.id}" th:text="${dept.kqmc}">
                            </option>
                        </select>
                        </li>
                        <li class="select-time">
                            <label>事件时间: </label>
                            <input type="text" class="time-input" style="width: 120px;" id="start" placeholder="开始时间" name="params[begin]"/>
                            <input type="text" class="time-input" style="width: 120px;" id="start" placeholder="开始时间" name="start"/>
                            <span>-</span>
                            <input type="text" class="time-input" style="width: 120px;" id="end" placeholder="结束时间" name="params[end]"/>
                            <input type="text" class="time-input" style="width: 120px;" id="end" placeholder="结束时间" name="end"/>
                        </li>
                        <li>
                            <a class="btn btn-primary btn-rounded btn-sm" onclick="searchRecord()"><i
@@ -67,17 +72,9 @@
                        <div class="gallery-header">
                            <h3 class="gallery-title" th:text="${eventInfo.name}"></h3>
                            <div class="gallery-tags">
                                <span class="tag-person">
                                <span th:each="tag : ${#strings.arraySplit(eventInfo.tags, ',')}" class="tag-person">
                                    <i class="layui-icon layui-icon-note"></i>
                                    <span>汽车</span>
                                </span>
                                <span class="tag-person">
                                    <i class="layui-icon layui-icon-note"></i>
                                    <span>卡车</span>
                                </span>
                                <span class="tag-person">
                                    <i class="layui-icon layui-icon-note"></i>
                                    <span>翻斗车</span>
                                    <span th:text="${tag}"></span>
                                </span>
                            </div>
                        </div>
@@ -86,16 +83,34 @@
                            <div style="display: flex; align-items: center; gap: 15px;width: 100%">
                                <div class="meta-item" style="width: 50%">
                                    <i class="layui-icon layui-icon-video"></i>
                                    <span th:text="${eventInfo.serId}"></span>
                                    <th:block th:with="matchedCameras=${cameraList.?[id == #root.eventInfo.serId]}">
                                        <!-- 如果有匹配项,显示第一个匹配的摄像头名称 -->
                                        <th:block th:if="${!#lists.isEmpty(matchedCameras)}">
                                            <span th:text="${matchedCameras[0].name}"></span>
                                        </th:block>
                                        <!-- 如果没有匹配项,显示原始ID -->
                                        <th:block th:if="${#lists.isEmpty(matchedCameras)}">
                                            <span th:text="${eventInfo.serId}"></span>
                                        </th:block>
                                    </th:block>
                                </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')}"></span>
                                    <span th:text="${eventInfo.time != null ? #dates.format(eventInfo.time, 'yyyy-MM-dd HH:mm') : '无时间'}"></span>
                                </div>
                            </div>
                            <div class="meta-item">
                                <i class="layui-icon layui-icon-home"></i>
                                <span th:text="${eventInfo.deptId}"></span>
                                <i class="layui-icon layui-icon-component"></i>
                                <th:block th:with="matchedTypes=${bizTypeList.?[code == #root.eventInfo.bizType]}">
                                    <!-- 如果有匹配项,显示第一个匹配的摄像头名称 -->
                                    <th:block th:if="${!#lists.isEmpty(matchedTypes)}">
                                        <span th:text="${matchedTypes[0].msg}"></span>
                                    </th:block>
                                    <!-- 如果没有匹配项,显示原始ID -->
                                    <th:block th:if="${#lists.isEmpty(matchedTypes)}">
                                        <span th:text="${eventInfo.bizType}"></span>
                                    </th:block>
                                </th:block>
                            </div>
                        </div>
                    </div>
@@ -119,9 +134,15 @@
    </div>
</div>
<th:block th:include="include :: footer"/>
<script th:src="@{/ajax/libs/layui-ruoyi/layui.js}"></script>
<script th:src="@{/ajax/libs/layui/layui.js}"></script>
<th:block th:include="include :: select2-js" />
<script th:src="@{/security/eventInfo/eventInfo.js}"></script>
<script th:inline="javascript">
    var cameraList = [[${cameraList}]];
    var deptList = [[${deptList}]];
    var bizTypeList = [[${bizTypeList}]];
    var companyList = [[${companyList}]];
    var currentPage = [[${currentPage}]];
    var totalItems = [[${totalItems}]];
    var pageSize = [[${pageSize}]];