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,7 +14,6 @@ * * @author sgj * @since 2026/02/25 */ @Data //@Entity 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> { } 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; @@ -104,6 +101,7 @@ /** * æä¹ åä¿å * * @param info */ public void addData(EventInfo info) { 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); } } 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); } } 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; } } 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; } } 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; } /** * æ ¹æ®æå头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; } /** * æ ¼å¼åæ¥æ * @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); }); } 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> æç´¢</a> <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i> éç½®</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>