fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/SnapRecord.java
@@ -43,6 +43,10 @@ @TableField("result") private String result = "SUCCESS"; @Column(name = "tags", columnDefinition = "varchar(100) COMMENT '标签'") @TableField("tags") private String tags ; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(name = "snap_time", columnDefinition = "datetime COMMENT '抓拍时间'") @TableField("snap_time") fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapRecordService.java
@@ -47,6 +47,19 @@ 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.like("tags", param.getKey()); } //抓拍时间检索 if (param.getStart() != null && param.getEnd() != null) { queryWrapper.between("snap_time", param.getStart(), param.getEnd()); } queryWrapper.orderByDesc("create_time"); return queryWrapper; fzzy-igdss-web/src/main/java/com/fzzy/sys/controller/security/SnapRecordController.java
@@ -5,6 +5,7 @@ import com.fzzy.igds.data.IgdsBaseParam; import com.fzzy.igds.data.PageResponse; import com.fzzy.igds.domain.SnapRecord; import com.fzzy.sys.manager.common.CommonManager; import com.fzzy.sys.manager.security.SnapRecordManager; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; @@ -27,6 +28,9 @@ @Resource private SnapRecordManager snapRecordManager; @Resource private CommonManager commonManager; /** * 获取智能抓拍页面 */ @@ -42,6 +46,7 @@ model.addAttribute("currentPage", images.getCurrent()); model.addAttribute("totalItems", images.getTotal()); model.addAttribute("pageSize", images.getSize()); model.addAttribute("cameraList", commonManager.listCameraData()); return prefix + "/snapRecord"; } @@ -55,9 +60,7 @@ @ResponseBody public PageResponse<Page<SnapRecord>> pageData(@RequestBody IgdsBaseParam param) { Page<SnapRecord> snapRecordPage = snapRecordManager.pageData(param); if (null == snapRecordPage.getRecords() || snapRecordPage.getRecords().isEmpty()) { return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "获取到数据信息为空"); } // return new PageResponse<>(RespCodeEnum.CODE_2000.getCode(), "获取到数据信息为空"); return new PageResponse<>(RespCodeEnum.CODE_0000, snapRecordPage); } } fzzy-igdss-web/src/main/java/com/fzzy/sys/manager/common/CommonManager.java
@@ -1,11 +1,13 @@ package com.fzzy.sys.manager.common; import com.fzzy.igds.constant.DepotType; import com.fzzy.igds.domain.Camera; 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.utils.ContextUtil; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysUser; @@ -33,6 +35,9 @@ private DicService dicService; @Resource private CoreDeptService coreDeptService; @Autowired private SecCameraService secCameraService; @Autowired private ISysUserService userService; @@ -110,4 +115,15 @@ user.setDeptId(Long.valueOf(ContextUtil.subDeptId(null))); return userService.selectUserList(user); } /** * 获取设备列表 * * @author sgj * @date 2025/12/12 */ public List<Camera> listCameraData() { return secCameraService.listCamera(ContextUtil.getCompanyId(),ContextUtil.subDeptId(null)); } } fzzy-igdss-web/src/main/resources/static/security/snap/snapRecord.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('snapRecord-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,53 +141,79 @@ // 生成图片卡片 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}" data-url="${record.imgName || '/logo-sm.png'}" data-id="${record.id}" class="gallery-img" onclick="showSnapRecordPreview(this.getAttribute('data-url'))"> <div class="gallery-info"> <div class="gallery-header"> <!-- <h3 class="gallery-title">${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> </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.cameraId || ''}</span> </div> <div class="meta-item" style="width: 50%"> <i class="layui-icon layui-icon-date"></i> <span>${formatDate(record.snapTime)}</span> </div> </div> <div class="meta-item"> <i class="layui-icon layui-icon-home"></i> <span>${record.deptId || ''}</span> </div> </div> <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="showSnapRecordPreview(this.getAttribute('data-url'))"> <div class="gallery-info"> <div class="gallery-header"> <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>${getCameraName(record.cameraId) || record.cameraId || ''}</span> </div> <div class="meta-item" style="width: 50%"> <i class="layui-icon layui-icon-date"></i> <span>${formatDate(record.snapTime)}</span> </div> </div> <!-- <div class="meta-item"> <i class="layui-icon layui-icon-home"></i> <span>${record.deptId || ''}</span> </div> --> </div> </div> </div> `; }); container.innerHTML = html; } /** * 根据摄像头ID获取摄像头名称 * @param {string} cameraId - 摄像头ID * @returns {string|null} 摄像头名称或null */ function getCameraName(cameraId) { // 确保cameraList存在且为数组 if (typeof cameraList !== 'undefined' && Array.isArray(cameraList) && cameraId) { // 查找匹配的摄像头对象 var camera = cameraList.find(function(item) { return item.id === cameraId; }); // 返回摄像头名称,如果找不到则返回null return camera ? camera.name : null; } return null; } /** * 格式化日期 * @param {string|number} date - 日期字符串或时间戳 fzzy-igdss-web/src/main/resources/templates/security/snap/snapRecord/snapRecord.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> <html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro"> <html lang="zh" 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"> @@ -17,8 +17,14 @@ <form id="snapRecord-form"> <div class="select-list"> <ul> <li class="select-time"> <label style="width: 100px">抓拍时间: </label> <input type="text" class="time-input" id="start" placeholder="开始时间" name="start"/> <span>-</span> <input type="text" class="time-input" id="end" placeholder="结束时间" name="end"/> </li> <li> 所属库区:<input type="text" name="deptId"/> 标签:<input type="text" name="key"/> </li> <li> <a class="btn btn-primary btn-rounded btn-sm" onclick="searchRecord()"><i @@ -56,17 +62,9 @@ <!-- <h3 class="gallery-title" th:text="${snapRecord.id}"></h3>--> <!-- 标签列表 --> <div class="gallery-tags"> <span class="tag-person"> <span th:each="tag : ${#strings.arraySplit(snapRecord.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> @@ -75,17 +73,30 @@ <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="${snapRecord.cameraId}"></span> <!-- 使用标志变量记录是否已匹配 --> <th:block th:with="matchedCameras=${cameraList.?[id == #root.snapRecord.cameraId]}"> <!-- 如果有匹配项,显示第一个匹配的摄像头名称 --> <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="${snapRecord.cameraId}"></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(snapRecord.snapTime, 'yyyy-MM-dd HH:mm')}"></span> </div> <span th:text="${snapRecord.snapTime != null ? #dates.format(snapRecord.snapTime, 'yyyy-MM-dd HH:mm') : '无时间'}"></span> </div> </div> <div class="meta-item"> <i class="layui-icon layui-icon-home"></i> <span th:text="${snapRecord.deptId}"></span> </div> <!-- <div class="meta-item">--> <!-- <i class="layui-icon layui-icon-home"></i>--> <!-- <span th:text="${snapRecord.deptId}"></span>--> <!-- </div>--> </div> </div> </div> @@ -112,9 +123,11 @@ <script th:src="@{/ajax/libs/layui-ruoyi/layui.js}"></script> <script th:src="@{/security/snap/snapRecord.js}"></script> <script th:inline="javascript"> var cameraList = [[${cameraList}]]; var currentPage = [[${currentPage}]]; var totalItems = [[${totalItems}]]; var pageSize = [[${pageSize}]]; </script> </body>