From 23ba8d87f56be44209687ee03c8bda3e351412d1 Mon Sep 17 00:00:00 2001
From: sgj <1442489573@qq.com>
Date: 星期三, 25 二月 2026 16:26:59 +0800
Subject: [PATCH] 添加地磅抓拍记录页面

---
 fzzy-igdss-web/src/main/java/com/fzzy/security/WeighbridgeSnapController.java               |  126 ++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/WeighbridgeSnap.java                     |   13 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/WeighbridgeSnapMapper.java               |    8 
 fzzy-igdss-web/src/main/java/com/fzzy/security/manager/WeighbridgeSnapManager.java          |   67 +++
 fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap.js        |  432 ++++++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java                   |   10 
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/WeighbridgeSnapService.java             |  135 +++++++
 fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap-style.css |  203 ++++++++++
 fzzy-igdss-web/src/main/resources/templates/security/weighbridgeSnap.html                   |  144 +++++++
 9 files changed, 1,124 insertions(+), 14 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/WeighbridgeSnap.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/WeighbridgeSnap.java
index 8fb55d7..40b2644 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/WeighbridgeSnap.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/domain/WeighbridgeSnap.java
@@ -1,13 +1,11 @@
 package com.fzzy.igds.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fzzy.igds.constant.WarnStatus;
-import com.ruoyi.common.annotation.Excel;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
-import javax.persistence.*;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -16,14 +14,13 @@
  *
  * @author sgj
  * @since 2026/02/25
-
  */
 @Data
 //@Entity
 //@Table(name = "d_weighbridge_snap")
 //@TableName("d_weighbridge_snap")
 //@EqualsAndHashCode(callSuper = false)
-public class WeighbridgeSnap  extends BizBaseEntity implements Serializable {
+public class WeighbridgeSnap extends BizBaseEntity implements Serializable {
 
 
     /**
@@ -84,7 +81,7 @@
 
     @Column(name = "tags", columnDefinition = "varchar(100) COMMENT '鏍囩锛堝寘鍚溅鐗屽拰杞﹁締绫诲瀷锛�'")
     @TableField("tags")
-    private String tags ;
+    private String tags;
 
     @Column(name = "food_variety", columnDefinition = "varchar(7) COMMENT '绮鍝佺'")
     @TableField("food_variety")
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/WeighbridgeSnapMapper.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/WeighbridgeSnapMapper.java
new file mode 100644
index 0000000..9ae60ee
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/mapper/WeighbridgeSnapMapper.java
@@ -0,0 +1,8 @@
+package com.fzzy.igds.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fzzy.igds.domain.WeighbridgeSnap;
+
+public interface WeighbridgeSnapMapper extends BaseMapper<WeighbridgeSnap> {
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java
index a5f6be8..e0cf3c9 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/EventInfoService.java
@@ -2,14 +2,11 @@
 
 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.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;
-import com.fzzy.work.domain.WorkOrder;
 import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -81,7 +78,7 @@
      * @return
      */
     public List<EventInfo> getListByParam(IgdsBaseParam param) {
-        if (null == param){
+        if (null == param) {
             param = new IgdsBaseParam();
         }
 
@@ -104,13 +101,14 @@
 
     /**
      * 鎸佷箙鍖栦繚瀛�
+     *
      * @param info
      */
     public void addData(EventInfo info) {
-        if(StringUtils.isBlank(info.getId())){
+        if (StringUtils.isBlank(info.getId())) {
             info.setId(ContextUtil.generateId());
         }
-        if(StringUtils.isBlank(info.getCompanyId())){
+        if (StringUtils.isBlank(info.getCompanyId())) {
             info.setCompanyId(ContextUtil.getCompanyId());
         }
 
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/WeighbridgeSnapService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/WeighbridgeSnapService.java
new file mode 100644
index 0000000..12a04e8
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/WeighbridgeSnapService.java
@@ -0,0 +1,135 @@
+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.IgdsBaseParam;
+import com.fzzy.igds.domain.WeighbridgeSnap;
+import com.fzzy.igds.mapper.WeighbridgeSnapMapper;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.DateUtil;
+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;
+
+
+/**
+ * 鍦扮鎶撴媿鏈嶅姟绫�
+ *
+ * @author sgj
+ * @since 2026/02/25
+ */
+@Slf4j
+@Service
+public class WeighbridgeSnapService {
+
+    @Resource
+    private WeighbridgeSnapMapper weighbridgeSnapMapper;
+
+
+    /**
+     * 鍒嗛〉鑾峰彇鍦扮鎶撴媿鏁版嵁
+     *
+     * @param page  鍒嗛〉瀵硅薄
+     * @param param 鏌ヨ鍙傛暟
+     * @author sgj
+     * @since 2026/02/25
+     */
+    public void listPage(Page<WeighbridgeSnap> page, IgdsBaseParam param) {
+        QueryWrapper<WeighbridgeSnap> queryWrapper = getQueryWrapper(param);
+        weighbridgeSnapMapper.selectPage(page, queryWrapper);
+    }
+
+
+    /**
+     *
+     *
+     * @author sgj
+     * @since 2026/02/25
+     */
+    public QueryWrapper<WeighbridgeSnap> getQueryWrapper(IgdsBaseParam param) {
+        QueryWrapper<WeighbridgeSnap> queryWrapper = new QueryWrapper<>();
+
+        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.likeRight("dept_id", param.getKey());
+        }
+        //鎶撴媿鏃堕棿妫�绱�
+        if (null != param.getStart()) {
+            queryWrapper.ge("time", param.getStart());
+        }
+        if (null != param.getEnd()) {
+            queryWrapper.le("time", param.getEnd());
+        }
+        //鎶撴媿鍚嶇О
+        if (StringUtils.isNotBlank(param.getName())) {
+            queryWrapper.like("name", param.getName());
+        }
+
+        queryWrapper.orderByDesc("create_time");
+
+        return queryWrapper;
+    }
+
+    /**
+     *
+     * @param param
+     * @return
+     */
+    public List<WeighbridgeSnap> getListByParam(IgdsBaseParam param) {
+        if (null == param) {
+            param = new IgdsBaseParam();
+        }
+
+        QueryWrapper<WeighbridgeSnap> queryWrapper = new QueryWrapper<>();
+        if (StringUtils.isNotBlank(param.getCompanyId())) {
+            queryWrapper.eq("company_id", param.getCompanyId());
+        }
+        if (StringUtils.isNotBlank(param.getDeptId())) {
+            queryWrapper.likeRight("dept_id", param.getDeptId());
+        }
+        if (null != param.getStart()) {
+            queryWrapper.ge("time", DateUtil.getCurZero(param.getStart()));
+        }
+        if (null != param.getEnd()) {
+            queryWrapper.le("time", DateUtil.getNextZero(param.getEnd()));
+        }
+
+        return weighbridgeSnapMapper.selectList(queryWrapper);
+    }
+
+    /**
+     * 鎸佷箙鍖栦繚瀛�
+     *
+     * @param info
+     */
+    public void addData(WeighbridgeSnap 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());
+        weighbridgeSnapMapper.insert(info);
+    }
+
+
+}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/security/WeighbridgeSnapController.java b/fzzy-igdss-web/src/main/java/com/fzzy/security/WeighbridgeSnapController.java
new file mode 100644
index 0000000..caf9519
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/security/WeighbridgeSnapController.java
@@ -0,0 +1,126 @@
+package com.fzzy.security;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fzzy.common.manager.CommonManager;
+import com.fzzy.igds.constant.Constant;
+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.Company;
+import com.fzzy.igds.domain.Dept;
+import com.fzzy.igds.domain.WeighbridgeSnap;
+import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.security.manager.WeighbridgeSnapManager;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.StringUtils;
+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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Controller
+@RequestMapping("/security/weighbridgeSnap")
+public class WeighbridgeSnapController {
+
+
+    private static final String prefix = "security";
+
+    @Resource
+    private WeighbridgeSnapManager weighbridgeSnapManager;
+
+    @Resource
+    private CommonManager commonManager;
+
+
+    /**
+     * 鑾峰彇鍦扮鎶撴媿椤甸潰
+     *
+     * @param viewType
+     * @param model
+     * @author sgj
+     * @since 2026/02/25
+     */
+    @GetMapping
+    public String getWeighbridgeSnap(@RequestParam(value = "viewType", required = false) String viewType, Model model) {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        SysUser user = ContextUtil.getLoginUser();
+        //鑾峰彇鍏徃鏁版嵁
+        List<Company> companies = commonManager.listCompanyData();
+        String defaultCompany = "";
+        if (companies != null && !companies.isEmpty()) {
+            defaultCompany = companies.get(0).getId();
+        }
+        //鑾峰彇搴撳尯鏁版嵁
+        List<Dept> depts = new ArrayList<>();
+        String defaultDeptId = "";
+        if (Constant.USER_TYPE_30.equals(user.getUserType())) {
+            depts = commonManager.listDeptData(null);
+            defaultDeptId = user.getDeptId() + "";
+        } else {
+            depts = commonManager.listDeptData(defaultCompany);
+            //鍦ㄩ浣嶆坊鍔犳墍鏈夐�夐」
+            Dept all = new Dept();
+            all.setId("");
+            all.setKqmc("鎵�鏈�");
+            depts.add(0, all);
+        }
+        IgdsBaseParam param = new IgdsBaseParam();
+        param.setPage(1);
+        param.setLimit(8);
+        param.setKey(defaultCompany);
+        param.setDeptId(defaultDeptId);
+        Page<WeighbridgeSnap> events = weighbridgeSnapManager.pageData(param);
+        model.addAttribute("weighbridgeSnapList", events.getRecords());
+        model.addAttribute("currentPage", events.getCurrent());
+        model.addAttribute("totalItems", events.getTotal());
+        model.addAttribute("pageSize", events.getSize());
+        if (StringUtils.isEmpty(viewType)) {
+            // 1 瀹夐槻椤甸潰  2 鐩戠椤甸潰
+            viewType = "1";
+        }
+        //椤甸潰灞曠ず绫诲瀷
+        model.addAttribute("viewType", viewType);
+        //璁惧鏁版嵁
+        model.addAttribute("cameraList", commonManager.listCameraData());
+        //搴撳尯鏁版嵁
+        model.addAttribute("deptList", depts);
+        model.addAttribute("defaultDeptId", defaultDeptId);
+
+        //涓氬姟绫诲瀷鏁版嵁
+        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", companies);
+        model.addAttribute("defaultCompany", defaultCompany);
+        return prefix + "/weighbridgeSnap";
+    }
+
+    /**
+     * 鍒嗛〉鑾峰彇鏁版嵁
+     *
+     * @param param
+     * @return
+     */
+    @RequestMapping("/pageData")
+    @ResponseBody
+    public PageResponse<Page<WeighbridgeSnap>> pageData(@RequestBody IgdsBaseParam param) {
+        Page<WeighbridgeSnap> weighbridgeSnapPage = weighbridgeSnapManager.pageData(param);
+        return new PageResponse<>(RespCodeEnum.CODE_0000, weighbridgeSnapPage);
+    }
+
+}
diff --git a/fzzy-igdss-web/src/main/java/com/fzzy/security/manager/WeighbridgeSnapManager.java b/fzzy-igdss-web/src/main/java/com/fzzy/security/manager/WeighbridgeSnapManager.java
new file mode 100644
index 0000000..a5bbe44
--- /dev/null
+++ b/fzzy-igdss-web/src/main/java/com/fzzy/security/manager/WeighbridgeSnapManager.java
@@ -0,0 +1,67 @@
+package com.fzzy.security.manager;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fzzy.common.manager.CommonManager;
+import com.fzzy.igds.data.IgdsBaseParam;
+import com.fzzy.igds.domain.Camera;
+import com.fzzy.igds.domain.WeighbridgeSnap;
+import com.fzzy.igds.service.SecCameraService;
+import com.fzzy.igds.service.WeighbridgeSnapService;
+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;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class WeighbridgeSnapManager {
+
+    @Resource
+    private WeighbridgeSnapService weighbridgeSnapService;
+    @Resource
+    private CommonManager commonManager;
+    @Resource
+    private SecCameraService secCameraService;
+
+
+    /**
+     * 鍒嗛〉鑾峰彇鍦扮鎶撴媿鏁版嵁
+     *
+     * @param param
+     * @author sgj
+     * @since 2026/02/25
+     */
+    public Page<WeighbridgeSnap> pageData(IgdsBaseParam param) {
+        if (StringUtils.isEmpty(param.getCompanyId())) {
+            param.setCompanyId(ContextUtil.getCompanyId());
+        }
+
+        Page<WeighbridgeSnap> corePage = new Page<>(param.getPage(), param.getLimit());
+        weighbridgeSnapService.listPage(corePage, param);
+
+        if (null == corePage.getRecords() || corePage.getRecords().isEmpty()) {
+            return corePage.setRecords(new ArrayList<>());
+        }
+        //鑾峰彇鐩戞帶璁惧
+        List<Camera> cameras = secCameraService.listCamera(ContextUtil.getCompanyId(), null);
+
+        //鍒ゆ柇鏂囦欢鏄惁瀛樺湪
+        for (WeighbridgeSnap record : corePage.getRecords()) {
+            record.setImgName(commonManager.isImgExit(record.getImgName(), null));
+
+            //鏄犲皠鐩戞帶璁惧鍚嶇О
+            List<Camera> collect = cameras.stream().filter(camera -> camera.getId().equals(record.getSerId())).collect(Collectors.toList());
+            if (!collect.isEmpty()) {
+                record.setSerId(collect.get(0).getName());
+            }
+        }
+
+        return corePage;
+    }
+}
diff --git a/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap-style.css b/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap-style.css
new file mode 100644
index 0000000..f661cb2
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap-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: 229px;
+    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;
+    }
+
+}
\ No newline at end of file
diff --git a/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap.js b/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap.js
new file mode 100644
index 0000000..f6c4a42
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/static/security/weighbridgeSnap/weighbridgeSnap.js
@@ -0,0 +1,432 @@
+var layer;
+var laypage;
+
+// 鐩戝惉鏀跺偍鍏徃 Select2 鍙樺寲
+$(document).ready(function() {
+    // 鐩戝惉鏀跺偍鍏徃涓嬫媺妗嗗彉鍖�
+    $('select[name="key"]').on('change', function() {
+        var selectedParentId = $(this).val();
+        if(selectedParentId) {
+            getSelectData(selectedParentId);
+        } else {
+            // 濡傛灉娓呯┖浜嗘敹鍌ㄥ叕鍙搁�夋嫨锛屼篃娓呯┖搴撳尯閫夐」
+            var $deptSelect = $('select[name="deptId"]');
+            $deptSelect.empty()
+                .append('<option value="">鎵�鏈�</option>')
+                .select2({
+                    placeholder: "璇烽�夋嫨搴撳尯",
+                    allowClear: true,
+                    width: 'resolve'
+                });
+        }
+    });
+
+    // 鍦ㄧ偣鍑诲簱鍖轰笅鎷夋鏃讹紝浠呴獙璇佽�屼笉鍙戣捣鏂拌姹�
+    $('select[name="deptId"]').on('select2:opening', function(e) {
+        var selectedParentId = $('select[name="key"]').val();
+        if(!selectedParentId) {
+            e.preventDefault();
+            layer.msg('璇峰厛閫夋嫨鏀跺偍鍏徃');
+            return false;
+        }
+
+        // 涓嶅湪姝ゅ鍙戣捣璇锋眰锛屼緷璧� change 浜嬩欢鏃剁殑棰勫姞杞�
+        return true;
+    });
+});
+
+
+$(function () {
+    // 鍒濆鍖栧垎椤�
+    layui.use(['laypage', 'layer'], function () {
+        layer = layui.layer;
+        laypage = layui.laypage;
+
+        // 鍒濆鍖栧垎椤电粍浠�
+        initPagination();
+    });
+
+    // 鍒濆鍖栧浘鐗囬瑙堝姛鑳�
+    initImagePreview();
+});
+
+
+
+
+// 淇敼 getSelectData 鍑芥暟锛屾敮鎸� Select2 鐨勬暟鎹牸寮�
+function getSelectData(parentId) {
+    if(!parentId) {
+        return layer.msg('璇烽�夋嫨鏀跺偍鍏徃');
+    }
+
+    $.ajax({
+        url: "../../system/dept-new/getDeptByUserType",
+        type: 'POST',
+        dataType: "json",
+        contentType: "application/json;charset=UTF-8",
+        data: parentId,
+        success: function (response) {
+            if (response) {
+                deptList = response;
+                // 閲嶆柊鍒濆鍖� Select2 鎴栨洿鏂伴�夐」
+                updateDeptSelect2Options(deptList);
+            } else {
+                layer.msg(response.msg || '鏁版嵁鍔犺浇澶辫触');
+            }
+        },
+        error: function (xhr, status, error) {
+            layer.msg('鏁版嵁鍔犺浇澶辫触');
+        }
+    });
+}
+
+// 鏇存柊 Select2 涓嬫媺妗嗛�夐」
+function updateDeptSelect2Options(deptList) {
+    var $deptSelect = $('select[name="deptId"]');
+
+    // 淇濆瓨褰撳墠閫変腑鐨勫��
+    var currentVal = $deptSelect.val();
+
+    // 娓呯┖鐜版湁閫夐」
+    $deptSelect.empty();
+
+    // 娣诲姞"鎵�鏈�"閫夐」
+    $deptSelect.append('<option value="">鎵�鏈�</option>');
+
+    // 娣诲姞鍔ㄦ�佹暟鎹�夐」
+    if(deptList && deptList.length > 0) {
+        deptList.forEach(function(dept) {
+            $deptSelect.append('<option value="' + dept.id + '">' + dept.kqmc + '</option>');
+        });
+    }
+
+    // 閲嶆柊鍒濆鍖� Select2
+    $deptSelect.select2({
+        placeholder: "璇烽�夋嫨搴撳尯",
+        allowClear: true,
+        width: 'resolve'
+    });
+
+    // 鎭㈠涔嬪墠鐨勯�夋嫨
+    if(currentVal) {
+        $deptSelect.val(currentVal).trigger('change');
+    }
+}
+
+
+
+
+/**
+ * 鍒濆鍖栧垎椤电粍浠�
+ */
+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'],
+        // 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)
+            }
+        }
+    });
+}
+
+/**
+ * 閲嶆柊鍒濆鍖栧垎椤电粍浠�
+ * @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'],
+        // 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)
+            }
+        }
+    });
+}
+
+/**
+ * 鑾峰彇浜嬩欢璁板綍鏁版嵁
+ * @param {Object} params - 鏌ヨ鍙傛暟瀵硅薄
+ * @param {Function} callback - 鍥炶皟鍑芥暟
+ */
+function fetchWeighbridgeSnapData(params, callback) {
+    $.ajax({
+        url: '../../security/weighbridgeSnap/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
+    };
+
+    // 娣诲姞琛ㄥ崟鏌ヨ鏉′欢
+    var form = document.getElementById('weighbridgeSnap-form');
+    if (form) {
+        // 澶勭悊鏅�氳緭鍏ユ鍜岄�夋嫨妗嗭紝鎺掗櫎闅愯棌鍩�
+        var inputs = form.querySelectorAll('input[name]:not([type="hidden"]), 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-bell-slash"></i>
+                <h3>鏆傛棤鎶撴媿璁板綍</h3>
+                <p>褰撳墠娌℃湁鍙睍绀虹殑鍦扮鎶撴媿鏁版嵁</p>
+            </div>
+        `;
+        // 闅愯棌鍒嗛〉
+        $('.pagination-container').hide();
+        return;
+    }
+
+    // 鏄剧ず鍒嗛〉
+    $('.pagination-container').show();
+
+    // 鐢熸垚浜嬩欢鍗$墖
+    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="showWeighbridgeSnapPreview(this.getAttribute('data-url'))">
+                <div class="gallery-info">
+                    <div class="gallery-header">
+                        <h3 class="gallery-title">${record.name || record.id}</h3>
+                        <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.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-component"></i>
+                            <span>${getTypeName(record.bizType) || record.bizType || ''}</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        `;
+    });
+
+    container.innerHTML = html;
+}
+
+/**
+ * 鏍规嵁鎽勫儚澶碔D鑾峰彇鎽勫儚澶村悕绉�
+ * @param {string} serId - 鎽勫儚澶碔D
+ * @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} 涓氬姟绫诲瀷鍚嶇О鎴杗ull
+ */
+function getTypeName(bizType) {
+    if (typeof bizTypeList !== 'undefined' && Array.isArray(bizTypeList) && bizType) {
+        // 鏌ユ壘鍖归厤鐨勪笟鍔$被鍨嬪璞�
+        var type = bizTypeList.find(function(item) {
+            return item.code === bizType;
+        });
+        // 杩斿洖涓氬姟绫诲瀷鍚嶇О锛屽鏋滄壘涓嶅埌鍒欒繑鍥瀗ull
+        return type ? type.msg : null;
+    }
+    return null;
+}
+
+
+/**
+ * 鏍煎紡鍖栨棩鏈�
+ * @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 showWeighbridgeSnapPreview(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']});
+    // 璋冪敤鏁版嵁璇锋眰鏂规硶
+    fetchWeighbridgeSnapData(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);
+    });
+}
diff --git a/fzzy-igdss-web/src/main/resources/templates/security/weighbridgeSnap.html b/fzzy-igdss-web/src/main/resources/templates/security/weighbridgeSnap.html
new file mode 100644
index 0000000..da9c86a
--- /dev/null
+++ b/fzzy-igdss-web/src/main/resources/templates/security/weighbridgeSnap.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<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">
+    <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/css/layui.css}"/>
+    <link rel="stylesheet" th:href="@{/security/weighbridgeSnap/weighbridgeSnap-style.css}">
+    <th:block th:include="include :: select2-css"/>
+    <style>
+        .select-list .select2-container--bootstrap {
+            width: 280px !important;
+            display: inline-block;
+        }
+    </style>
+</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="weighbridgeSnap-form">
+                <div class="select-list">
+                    <ul>
+                        <li>
+                            鏀跺偍鍏徃锛�<select class="form-control" name="key">
+                            <option th:each="company : ${companyList}" th:value="${company.id}"
+                                    th:text="${company.dwmc}"
+                                    th:selected="${company.id == defaultCompany}">
+                            </option>
+                        </select>
+                        </li>
+                        <li>
+                            鎵�閫夊簱鍖猴細<select class="form-control" name="deptId" >
+                            <option th:each="dept : ${deptList}" th:value="${dept.id}" th:text="${dept.kqmc}"
+                                    th:selected="${dept.id == defaultDeptId}">
+                            </option>
+                        </select>
+                        </li>
+                        <li class="select-time">
+                            <label style="width: 100px">鎶撴媿鏃堕棿锛� </label>
+                            <input type="text" class="time-input" style="width: 140px;" id="start"
+                                   placeholder="寮�濮嬫椂闂�" name="start"/>
+                            <span>-</span>
+                            <input type="text" class="time-input" style="width: 140px;" id="end" placeholder="缁撴潫鏃堕棿"
+                                   name="end"/>
+                        </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>
+
+        <div class="col-sm-12 " style="padding-top: 10px;background: #FFFFFF;margin-top: 10px;">
+            <!-- 浜嬩欢缃戞牸 -->
+            <div class="gallery-grid" id="gallery-container">
+                <!-- 浜嬩欢涓虹┖鏃舵樉绀� -->
+                <div th:if="${#lists.isEmpty(weighbridgeSnapList)}" class="empty-state">
+                    <i class="fa-solid fa-bell-slash"></i>
+                    <h3>鏆傛棤鎶撴媿璁板綍</h3>
+                    <p>褰撳墠娌℃湁鍙睍绀虹殑鍦扮鎶撴媿鏁版嵁</p>
+                </div>
+                <!-- 浜嬩欢鍗$墖 -->
+                <div th:each="weighbridgeSnap : ${weighbridgeSnapList}" class="gallery-item">
+                    <img th:src="${weighbridgeSnap.imgName ?: '/logo-sm.png'}" th:alt="${weighbridgeSnap.id}"
+                         th:data-url="${weighbridgeSnap.imgName ?: '/logo-sm.png'}" th:data-id="${weighbridgeSnap.id}"
+                         class="gallery-img" onclick="showWeighbridgeSnapPreview(this.getAttribute('data-url'))">
+                    <div class="gallery-info">
+                        <div class="gallery-header">
+                            <h3 class="gallery-title" th:text="${weighbridgeSnap.name}"></h3>
+                            <div class="gallery-tags">
+                                <span th:each="tag : ${#strings.arraySplit(weighbridgeSnap.tags, ',')}" class="tag-person">
+                                    <i class="layui-icon layui-icon-note"></i>
+                                    <span th:text="${tag}"></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 th:text="${weighbridgeSnap.serId}"></span>
+                                </div>
+                                <div class="meta-item" style="width: 50%">
+                                    <i class="layui-icon layui-icon-date"></i>
+                                    <span th:text="${weighbridgeSnap.time != null ? #dates.format(weighbridgeSnap.time, 'yyyy-MM-dd HH:mm') : '鏃犳椂闂�'}"></span>
+                                </div>
+                            </div>
+                            <div class="meta-item">
+                                <i class="layui-icon layui-icon-component"></i>
+                                <th:block th:with="matchedTypes=${bizTypeList.?[code == #root.weighbridgeSnap.bizType]}">
+                                    <th:block th:if="${!#lists.isEmpty(matchedTypes)}">
+                                        <span th:text="${matchedTypes[0].msg}"></span>
+                                    </th:block>
+                                    <th:block th:if="${#lists.isEmpty(matchedTypes)}">
+                                        <span th:text="${weighbridgeSnap.bizType}"></span>
+                                    </th:block>
+                                </th:block>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+            <!-- 鍒嗛〉鎺т欢 -->
+            <div class="pagination-container" th:if="${not #lists.isEmpty(weighbridgeSnapList)}">
+                <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/layui.js}"></script>
+<th:block th:include="include :: select2-js"/>
+<script th:src="@{/security/weighbridgeSnap/weighbridgeSnap.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}]];
+</script>
+
+</body>
+</html>

--
Gitblit v1.9.3