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}]];