3a5e49666af1da441633b0a9bae4c3c2b18974b3..e9a9dcebfb754d39270945261e43736c798f4c47
22 小时以前 sgj
清除微信相关测试代码
e9a9dc 对比 | 目录
23 小时以前 sgj
视频监管添加库区AI事件展示
ca18c1 对比 | 目录
昨天 sgj
字段注入修改
024dc3 对比 | 目录
昨天 sgj
添加微信消息推送工具类
4b2b0e 对比 | 目录
已添加3个文件
已修改5个文件
639 ■■■■■ 文件已修改
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/java/com/fzzy/appwx/controller/WeChatController.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/group/video.css 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/static/group/video.js 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-web/src/main/resources/templates/group/video.html 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.fzzy.igds.data;
import lombok.Data;
import java.util.Map;
/**
 * æ¨¡æ¿æ¶ˆæ¯ç±»
 *
 * @author chen
 */
@Data
public class Template {
    /**
     * æŽ¥æ”¶è€…openid
     */
    private String touser;
    /**
     * æ¨¡æ¿id
     */
    private String template_id;
    /**
     * è¯¦æƒ…路径
     */
    private String url;
    /**
     * æ ‡é¢˜é¢œè‰²
     */
    private String topcolor;
    /**
     * æ•°æ®
     */
    private Map<String, TemplateParam> data;
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.fzzy.igds.data;
import lombok.Data;
/**
 * æ¨¡æ¿æ¶ˆæ¯æ•°æ®ç±»
 * @author chen
 */
@Data
public class TemplateParam {
    private String value;
    private String color;
    public TemplateParam() {
    }
    public TemplateParam(String value, String color) {
        this.value = value;
        this.color = color;
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java
@@ -8,6 +8,7 @@
import com.fzzy.igds.domain.SnapReply;
import com.fzzy.igds.mapper.SnapReplyMapper;
import com.fzzy.igds.utils.ContextUtil;
import com.fzzy.igds.utils.WxUtil;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -22,6 +23,8 @@
    @Resource
    private SnapReplyMapper snapReplyMapper;
    @Resource
    private WxUtil wxUtil;
    /**
@@ -53,7 +56,7 @@
    }
    public void listPageByListDept(Page<SnapReply> page, IgdsBaseParam param, List<String> listDept) {
        if( listDept == null || listDept.isEmpty()){
        if (listDept == null || listDept.isEmpty()) {
            return;
        }
@@ -166,4 +169,55 @@
        return snapReplyMapper.deleteById(snapReply) > 0 ? BaseResp.success() : BaseResp.error("删除失败");
    }
    /**
     * å‘送警告到微信
     * @param deptId
     */
    public BaseResp sendNotice(String deptId){
        //todo æœªå®Œæˆ
        if(StringUtils.isEmpty(deptId)){
            return BaseResp.error("请选择库区");
        }
//        //需要推送的用户
//        List<SysUser> users= new ArrayList<>();
//        String res = "";
//        //遍历用户,发送微信消息
//        for (SysUser user : users) {
//            if(StringUtils.isNotEmpty(user.getOpenId())){
//                boolean b = weChatUtil.sendMessage(
//                        user.getOpenId(),
//                        snapReply.getId(),
//                        snapReply.getCompanyId(),
//                        "库区告警批复测试推送",
//                        snapReply.getDeptId(),
//                        snapReply.getContent(),
//                        DateFormatUtils.format(snapReply.getCreateTime(),"yyyy-MM-dd HH:mm:ss"),
//                        "",
//                        "",
//                        user.getUserName());
//                if(!b){
//                    res += user.getUserName() + "用户微信推送失败,";
//                    return BaseResp.error(res);
//
//                }
//            }else{
//                log.debug("------用户openid不存在,不进行推送------");
//                res += user.getUserName() + "用户未绑定,";
//                return BaseResp.error(res);
//
//            }
//        }
//        if(StringUtils.isEmpty(res)){
//            return BaseResp.success("微信:推送成功;");
//        }else{
//            return BaseResp.error("微信:"+res+";");
//        }
        return BaseResp.success("微信:推送成功;");
    }
}
fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,181 @@
package com.fzzy.igds.utils;
import com.alibaba.fastjson.JSONObject;
import com.fzzy.igds.data.ConfigData;
import com.fzzy.igds.data.Template;
import com.fzzy.igds.data.TemplateParam;
import com.ruoyi.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class WxUtil {
    /**
     * å…¬ä¼—号调用全局接口的标识ACCESS_TOKEN缓存key
     */
    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";
    /**
     * æ¨¡æ¿æ¶ˆæ¯å‘送url
     */
    public static final String TEMPLATE_URL =
            "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
    /**
     * èŽ·å–access_token的接口地址(GET , 2000次/天)
     */
    public static final String ACCESS_TOKEN_URL =
            "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private ConfigData configData;
    @Resource
    private RedisCache redisCache;
    /**
     * å‘送模板消息
     * @param openid    ç”¨æˆ·openid
     * @param warnId    è­¦å‘Šid
     * @param companyId ç»„织id
     * @param title     è­¦å‘Šæ ‡é¢˜
     * @param keyword1  è­¦å‘Šå¯¹è±¡
     * @param keyword2  è­¦å‘Šç±»åž‹
     * @param keyword3  è­¦å‘Šæ—¶é—´
     * @param keyword4  è­¦å‘Šå†…容
     * @param remark    è­¦å‘Šè¯¦æƒ…
     * @return
     */
    public boolean sendMessage(String openid, String warnId, String companyId, String title,
                               String keyword1, String keyword2, String keyword3,
                               String keyword4,String remark, String userName){
        Template tem = new Template();
        tem.setTemplate_id(configData.getWxTempId());
        tem.setTopcolor("#FF0000");
        tem.setTouser(openid);
        tem.setUrl(configData.getWxServeUrl() + "/wx/view-gateway?state=warn-detail1&id=" + warnId + "&companyId=" + companyId + "&userName=" + userName);
        Map<String, TemplateParam> params = new HashMap<>();
        params.put("first",new TemplateParam(title,"#173177"));
        //警告对象
        params.put("keyword1",new TemplateParam( keyword1, "#173177"));
        //警告类型
        params.put("keyword2",new TemplateParam( keyword2, "#173177"));
        //警告时间
        params.put("keyword3",new TemplateParam( keyword3, "#173177"));
        //警告内容
        params.put("keyword4",new TemplateParam( keyword4, "#173177"));
        params.put("remark",new TemplateParam( remark, "#173177"));
        tem.setData(params);
        log.debug("------微信通知开始推送------");
        //推送消息
        return sendTemplateMsg(tem);
    }
    /**
     * æŽ¨é€æ¨¡æ¿æ¶ˆæ¯
     *
     * @param template
     * @return
     */
    public boolean sendTemplateMsg(Template template) {
        //获取AccessToken
        String accessToken = getAccessToken();
        if(StringUtils.isEmpty(accessToken)){
            log.debug("------获取AccessToken失败------");
            return false;
        }
        boolean flag = false;
        String url = WxUtil.TEMPLATE_URL.replace("ACCESS_TOKEN",accessToken);
        String str = JSONObject.toJSONString(template);
        JSONObject jsonObject = doPost(url, str);
        if (jsonObject != null) {
            int errorCode = jsonObject.getIntValue("errcode");
            String errorMessage = jsonObject.getString("errmsg");
            if (errorCode == 0) {
                log.debug("推送微信消息成功:" + str);
                flag = true;
            } else {
                log.info("模板消息发送失败{},{}", errorCode, errorMessage);
                log.error("ACCESS_TOKEN:" + accessToken);
                flag = false;
            }
        }
        log.debug("推送微信消息失败!" );
        return flag;
    }
    /**
     * èŽ·å–å…¨å±€AccessToken
     *
     * @return
     */
    public String getAccessToken() {
        //先从缓存获取,若不存在则通过接口获取
        String accessToken = (String)redisCache.getCacheObject(WxUtil.ACCESS_TOKEN);
        if(StringUtils.isNotEmpty(accessToken)){
            return accessToken;
        }
        //请求获取AccessToken的微信接口
        String resp = doGet(WxUtil.ACCESS_TOKEN_URL.replace("APPID",
                configData.getWxAppId()).replace("APPSECRET", configData.getWxSecret()));
        JSONObject json = JSONObject.parseObject(resp);
        if (json != null) {
            //获取accessToken
            accessToken = json.getString("access_token");
            //获取accessToken有效时长,为7200s
            int expiresIn = json.getIntValue("expires_in");
            //将accessToken存入缓存,有效时长为expiresIn,即2小时
            redisCache.setCacheObject(WxUtil.ACCESS_TOKEN, accessToken,expiresIn, TimeUnit.SECONDS);
            return accessToken;
        }
        log.error("获取access_token失败");
        return null;
    }
    /**
     * post请求
     * @param url
     * @param data
     * @return
     */
    public JSONObject doPost(String url, String data){
        ResponseEntity<JSONObject> jsonObject = restTemplate.postForEntity(url, data, JSONObject.class);
        return jsonObject.getBody();
    }
    /**
     * get请求
     *
     * @param url
     * @return
     */
    public String doGet(String url) {
        return restTemplate.getForObject(url, String.class);
    }
}
fzzy-igdss-web/src/main/java/com/fzzy/appwx/controller/WeChatController.java
@@ -19,6 +19,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.util.List;
@Slf4j
@@ -51,13 +52,13 @@
            tag = "home";
        }
//        String newUrl = WeChatConst.USER_AUTH_UPR
//                .replace("APPID", configData.getWxAppId())
//                .replace("REDIRECT_URI", URLEncoder.encode(url, "UTF-8"))
//                .replace("STATE", tag);
//
//        return "redirect:" + newUrl;
        return "redirect:" + url + "?state=" + tag;
        String newUrl = WeChatConst.USER_AUTH_UPR
                .replace("APPID", configData.getWxAppId())
                .replace("REDIRECT_URI", URLEncoder.encode(url, "UTF-8"))
                .replace("STATE", tag);
        return "redirect:" + newUrl;
//        return "redirect:" + url + "?state=" + tag;
    }
@@ -116,20 +117,20 @@
        mv.addObject("deptList", deptList);
//        //测试代码开启
        String openid = "testOpenId";
        mv.addObject("openid", openid);
        SysUser user = weChatManager.getUser(openid);
        if (StringUtils.isEmpty(userName)) {
            if (user != null) {
                userName = user.getUserName();
            }
        }
        if (StringUtils.isNotEmpty(userName)) {
            mv.addObject("userName", userName);
        }
//        //测试代码结束
////        //测试代码开启
//        String openid = "testOpenId";
//        mv.addObject("openid", openid);
//        SysUser user = weChatManager.getUser(openid);
//        if (StringUtils.isEmpty(userName)) {
//            if (user != null) {
//                userName = user.getUserName();
//            }
//        }
//
//        if (StringUtils.isNotEmpty(userName)) {
//            mv.addObject("userName", userName);
//        }
////        //测试代码结束
        return mv;
    }
fzzy-igdss-web/src/main/resources/static/group/video.css
@@ -318,7 +318,7 @@
    height: 255px;
    background: url("../img/web/group/left-box1-monitor.png") no-repeat;
    background-size: 100% 100%;
    margin-bottom: 30px;
    margin-bottom: 18px;
    padding: 36px 20px 8px 20px;
    box-sizing: border-box;
}
@@ -362,13 +362,14 @@
}
.left-m2 {
    background: url("../img/web/group/left-box2.png") no-repeat;
    width: 100%;
    height: 362px;
    box-sizing: border-box;
    margin-bottom: 18px;
    position: relative;
    width: 430px;
    height: 610px;
    background: url("../img/web/group/left-box2-monitor.png") no-repeat;
    background-size: 100% 100%;
    padding: 56px 20px 20px 20px;
    box-sizing: border-box;
}
@@ -379,7 +380,7 @@
    background: url("../img/web/group/left-m2-bg.png") no-repeat;
    background-size: 100% 100%;
    display: flex;
    font-size: 14px;
    font-size: 3px;
    color: #91ceff;
    box-sizing: border-box;
}
@@ -392,7 +393,6 @@
.left-m2 .panel-content .panel-content-head .head-item {
    flex: 1;
}
.left-m2 .panel-content .panel-content-body {
    width: 100%;
@@ -418,18 +418,84 @@
    height: 30px;
    line-height: 30px;
    display: flex;
    margin-top: 6px;
}
.left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item {
    flex: 1;
    font-size: 3px;
    color: #ffffff;
}
.left-m3 {
    width: 100%;
    height: 242px;
    background: url("../img/web/group/left-box3.png") no-repeat;
    box-sizing: border-box;
    position: relative;
    background-size: 100% 100%;
    padding: 56px 20px 20px 20px;
}
.left-m3 .panel-content .panel-content-head {
    width: 100%;
    height: 31px;
    line-height: 31px;
    background: url("../img/web/group/left-m2-bg.png") no-repeat;
    background-size: 100% 100%;
    display: flex;
    font-size: 14px;
    color: #91ceff;
    box-sizing: border-box;
}
.left-m3 .head-item,
.left-m3 .body-item {
    text-align: center;
}
.left-m3 .panel-content .panel-content-head .head-item {
    flex: 1;
}
.left-m3 .panel-content .panel-content-body {
    width: 100%;
    height: calc(100% - 2vw);
    box-sizing: border-box;
    overflow: hidden;
    overflow-y: auto;
}
.left-m3 .panel-content .panel-content-body::-webkit-scrollbar {
    width: 6px;
    background-color: rgba(51, 238, 255, 0.2);
}
.left-m3 .panel-content .panel-content-body::-webkit-scrollbar-thumb {
    -webkit-box-shadow: inset 0 0 6px rgba(2, 160, 251, 0.3);
    background-color: rgba(2, 158, 249, 0.5);
    border-radius: 3px;
}
.left-m3 .panel-content .panel-content-body .panel-content-body-tr {
    width: 100%;
    height: 30px;
    line-height: 30px;
    display: flex;
    padding-top: 6px;
    padding-bottom: 5px;
    border-bottom: 1px solid #4c5354c7;
}
.left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item {
.left-m3 .panel-content .panel-content-body .panel-content-body-tr .body-item {
    flex: 1;
    font-size: 14px;
    color: #ffffff;
    user-select: none;
}
.panel-box1-item{
    width: 100%;
@@ -716,7 +782,7 @@
.data-top-btn:last-child{
    width: -webkit-calc(50% - 5px);
    width: calc(50% - 5px);
}
.data-top-btn:first-child{
@@ -768,7 +834,7 @@
    min-width: 100%;
    height: 448px;
    overflow: auto;
}
.data-tableBox::-webkit-scrollbar {
fzzy-igdss-web/src/main/resources/static/group/video.js
@@ -6,7 +6,11 @@
var cameraIndex = 0;  //监控下标
var cameraTimer;     // åº“区定时
var windowsNum = 1; //
var gundongTimer;     //监控列表滚动定时器
var gundongTimer;     //AI事件滚动其
var gundongTimer1;     //监控列表滚动定时器
var eventDeptList = null;
$(function () {
    // åˆå§‹åŒ–页面
@@ -24,10 +28,15 @@
    initDicSlogan();
    //监控点信息适应滚动
    initScrollbar(60);
    initScrollbar1(60);
    //库区信息
    renderDeptArea();
    //请求监管库区信息
    ajaxDeptList();
    initScrollbar(60);
}
// socket信息返回處理
@@ -38,6 +47,83 @@
        dicSlogan = data;
        initDicSlogan();
    }
}
/**
 * è¯·æ±‚获取库区相关信息
 */
function ajaxDeptList() {
    deptList = null;
    $.ajax({
        type: "POST",
        url: "/group/index-dept-list",
        dataType: "json",
        contentType: "application/json;charset=UTF-8",
        data: JSON.stringify({
            "companyId": companyId
        }),
        success: function (result) {
            if (result.code == "0000") {
                eventDeptList = result.data;
                renderMsg();
            }
        },
        error: function (error) {
        }
    });
}
/**
 * æ›´æ–°AI动态分析
 * @param data
 */
function renderMsg() {
    var html = '';
    var num1 = '';
    var num7 = '';
    var flag = false;
    if (eventDeptList != null && eventDeptList.length > 0) {
        $.each(eventDeptList, function (index, item) {
            if (item.dailyTotal === 0) {
                num1 = '当日一切正常';
            } else if (item.dailyTotal < 0) {
                num1 = '未检测到网关';
            } else {
                num1 = '当日数量' + item.dailyTotal + '个';
            }
            if (item.warnNum7 === 0) {
                num7 = '近七天一切正常';
            } else {
                num7 = '近七天数量' + item.warnNum7 + '个';
            }
            html += '<div class="panel-content-body-tr">';
            if (item.dailyTotal > 0) {
                flag = true;
            }
            // if (item.warnNum7 > 10) {
            //     flag = true;
            //     html += '<span class="body-item sp" style="color: #bc2032;flex: 1.5;">' + item.deptName + '</span>';
            //     html += '<span class="body-item sp" style="color: #bc2032;">' + num1 + '</span>';
            //     html += '<span class="body-item sp" style="color: #bc2032;">' + num7 + '</span>';
            // } else if (item.warnNum7 > 1 && item.warnNum7 < 10) {
            //     flag = true;
            //     html += '<span class="body-item sp" style="color: #f37b3d;flex: 1.5;">' + item.deptName + '</span>';
            //     html += '<span class="body-item sp" style="color: #f37b3d;">' + num1+ '</span>';
            //     html += '<span class="body-item sp" style="color: #f37b3d;">' + num7 + '</span>';
            // }else {
            html += '<span class="body-item sp" style="flex: 1.5;">' + item.deptName + '</span>';
            html += '<span class="body-item sp">' + num1 + '</span>';
            html += '<span class="body-item sp">' + num7 + '</span>';
            // }
            html += '</div>';
        })
    }
    if (flag) {
        $("#panel-title").html('库区AI事件信息  <i class="dot"></i>');
    }
    $("#inventoryInfo").html(html);
}
// æ¸²æŸ“库区信息
@@ -103,7 +189,7 @@
        html += '<span class="body-item" style="flex: 0.6"></span>';
        html += '</div>';
    }
    $("#inventoryInfo").html(html);
    $("#inventoryInfo1").html(html);
    cameraSwitch1();
}
@@ -337,6 +423,26 @@
    return document.getElementById('inventoryInfo').clientHeight > document.getElementById('inventoryInfoBox').clientHeight;
}
//监控点信息滚动
function initScrollbar1(num) {
    gundongTimer1 = setInterval(function () {
        if (!hasScrollbar1()) {
            document.getElementById('inventoryInfoBox1').scrollTop = 0;
        } else {
            if (document.getElementById('inventoryInfoBox1').scrollTop >= (document.getElementById('inventoryInfo1').clientHeight - document.getElementById('inventoryInfoBox1').clientHeight)) {
                document.getElementById('inventoryInfoBox1').scrollTop = 0;
            } else {
                document.getElementById('inventoryInfoBox1').scrollTop++;
            }
        }
    }, num);
}
//判断底部是否出现滚动条
function hasScrollbar1() {
    return document.getElementById('inventoryInfo1').clientHeight > document.getElementById('inventoryInfoBox1').clientHeight;
}
// å³ä¸‹è§’提醒信息
function showTip(msg) {
    layer.msg(msg);
fzzy-igdss-web/src/main/resources/templates/group/video.html
@@ -108,26 +108,73 @@
            width: unset;
        }
        .right-videoWrap {
             height: unset;
            height: unset;
        }
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr {
             padding-top: unset;
            height: 40px;
        /* ========== AI事件列表核心样式 ========== */
        .left-m2 .panel-content .panel-content-head {
            line-height: 40px;
            font-size: 18px;
            display: flex; /* è¡¨å¤´flex布局,精准分配列宽 */
            width: 100%;
        }
        /* è¡¨å¤´åˆ—宽精准分配:所属库点占比最高,近七天数量预留足够宽度防换行 */
        .left-m2 .panel-content .panel-content-head .head-item:nth-child(1) {
            flex: 2; /* æ‰€å±žåº“点:宽列,适配长名称 */
            white-space: nowrap; /* å¼ºåˆ¶ä¸æ¢è¡Œ */
            text-align: center;
        }
        .left-m2 .panel-content .panel-content-head .head-item:nth-child(2) {
            flex: 1.2; /* å½“日分析:中等宽度 */
            white-space: nowrap; /* å¼ºåˆ¶ä¸æ¢è¡Œ */
            text-align: center;
        }
        .left-m2 .panel-content .panel-content-head .head-item:nth-child(3) {
            flex: 1.2; /* è¿‘七天数量:加宽列宽,强制不换行 */
            white-space: nowrap; /* æ ¸å¿ƒï¼šç¦æ­¢è¡¨å¤´æ¢è¡Œ */
            text-align: center;
        }
        /* åˆ—表项样式:完整展示文字,自适应行高 */
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr {
            padding-top: unset;
            height: auto; /* è‡ªé€‚应行高 */
            line-height: 22px; /* é€‚配换行后的行间距 */
            padding: 8px 2px;
            display: flex; /* å’Œè¡¨å¤´åˆ—宽对齐 */
            width: 100%;
            box-sizing: border-box;
        }
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item {
            font-size: 18px;
            font-size: 16px;
            padding: 0 8px;
            white-space: normal; /* åˆ—表项允许换行,完整展示内容 */
            word-wrap: break-word; /* é•¿æ–‡æœ¬å¼ºåˆ¶æ¢è¡Œ */
            text-align: center;
            box-sizing: border-box;
        }
        .left-m2 .panel-content .panel-content-head {
            line-height: unset;
            font-size: 18px;
        /* åˆ—表项列宽和表头严格对齐 */
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item:nth-child(1) {
            flex: 2;
        }
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item:nth-child(2) {
            flex: 1.2;
        }
        .left-m2 .panel-content .panel-content-body .panel-content-body-tr .body-item:nth-child(3) {
            flex: 1.2;
        }
        /* ========== æ ¸å¿ƒæ ·å¼ç»“束 ========== */
        .text_select_play {
            font-size: 16px;
        }
        .video {
            width: 100%;
            height: 100%;
        }
        /* åˆ—表容器:内容过多时滚动,不挤压布局 */
        #inventoryInfoBox {
            width: 100%;
            box-sizing: border-box;
            overflow-y: auto;
            max-height: 300px;
        }
    </style>
</head>
@@ -192,7 +239,29 @@
            </div><!-- i-m1 end -->
            <div class="left-m2">
                <div>
                    <div class="panel-title" id="panel-title">监控点信息</div>
                    <div class="panel-title" id="panel-title">库区AI事件信息</div>
                </div>
                <div class="panel-content">
                    <div class="panel-content-head">
                        <span class="head-item">所属库点</span>
                        <span class="head-item">当日分析</span>
                        <span class="head-item">近七天数量</span> <!-- ä¿®æ­£è¡¨å¤´æ–‡å­—,取消换行 -->
                    </div>
                    <div class="panel-content-body" id="inventoryInfoBox">
                        <div id="inventoryInfo">
                            <!--                            <div class="panel-content-body-tr">-->
                            <!--                                <span class="body-item">安防-北围墙1</span>-->
                            <!--                                <span class="body-item">枪机</span>-->
                            <!--                                <span class="body-item">12</span>-->
                            <!--                            </div>-->
                        </div>
                    </div>
                </div>
            </div>
            <div class="left-m3">
                <div>
                    <div class="panel-title" id="panel-title1">监控点信息</div>
                </div>
                <div class="panel-content">
                    <div class="panel-content-head">
@@ -200,8 +269,8 @@
                        <span class="head-item" style="flex: 0.6">监控类型</span>
                    </div>
                    <div class="panel-content-body" id="inventoryInfoBox">
                        <div id="inventoryInfo">
                    <div class="panel-content-body" id="inventoryInfoBox1">
                        <div id="inventoryInfo1">
                            <div class="panel-content-body-tr">
                                <span class="body-item" style="flex: 1.4">安防-北围墙1</span>
                                <span class="body-item" style="flex: 0.6">枪机</span>
@@ -409,6 +478,7 @@
    var dicSlogan = [[${dicSlogan}]];
    var deptList = [[${deptList}]];
    //设置定时刷新页面,主要为了防止掉线
    var timer2;
    window.onload = function () {
@@ -421,4 +491,4 @@
    };
</script>
</body>
</html>
</html>