chenhaozhe
9 天以前 cfa35ff1f39c2a7b69d624d45f8e05591f3375d4
调整 报工平台,添加定时刷新功能。模块添加定时器管理模块
3个文件已修改
1个文件已添加
275 ■■■■ 已修改文件
WebTM/layuiadmin/Scripts/webConfig.js 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/layuiadmin/modules/timerManager.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/IpadIndex.html 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/views/仓存管理/生产入库单/Kf_ProductInBillList.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebTM/layuiadmin/Scripts/webConfig.js
@@ -42,15 +42,15 @@
    return GetWEBURL()
}
layui.use(['jquery', 'layer'], function () {
    var $ = layui.jquery,
        layer = layui.layer;
    // å…¨å±€é…ç½®
    layer.config({
        scrollbar: false
    });
    var pendingRequests = [];
    // å…¨å±€é…ç½® é»˜è®¤ä¸æ˜¾ç¤ºçˆ¶çº§æ»šåŠ¨æ¡†
    var _open = layer.open;
@@ -70,6 +70,7 @@
            if (oldSuccess) oldSuccess.call(this, layero, index);
        };
        // å…³é—­å¼¹çª—æ—¶
        options.end = function () {
            if (needHideScroll) {
@@ -84,12 +85,16 @@
        return _open.call(this, options);
    };
    // å…¨å±€æ‹¦æˆªæ‰€æœ‰ layui ajax è¯·æ±‚
    $(document).ajaxSend(function (event, jqxhr, settings) {
        var token = localStorage.getItem('token');
        if (token) {
        pendingRequests.push(jqxhr);
        if (typeof token != 'undefined') {
            // è‡ªåŠ¨å¸¦ä¸Š token
            jqxhr.setRequestHeader('Authorization', 'Bearer ' + token);
        }
    });
@@ -99,25 +104,31 @@
    $(document).ajaxComplete(function (event, jqxhr, settings) {
        // HTTP çŠ¶æ€ç 
        var status = jqxhr.status;
        console.log(jqxhr)
        if (status === 401) {
            abortAllPendingRequests(pendingRequests);
            // æœªç™»å½• / token è¿‡æœŸ
            layer.confirm('登录已过期,请重新登录', { icon: 7, title: '提示' }, function () {
            layer.confirm(jqxhr.responseJSON.Message, { icon: 7, title: '提示' }, function () {
                localStorage.removeItem('token');
                window.top.location.href = '../../views/user/login.html'; // è·³åˆ°ç™»å½•页
                window.top.location.href = '/views/user/login.html'; // è·³åˆ°ç™»å½•页
            });
        } else if (status === 403) {
            abortAllPendingRequests(pendingRequests);
            // æ— æƒé™
            layer.msg('您没有该模块的操作权限', { icon: 2, time: 2000 });
            layer.confirm(jqxhr.responseJSON.Message, {
                icon: 4, skin: 'layui-layer-lan', title: "温馨提示", closeBtn: 0, btn: ['确定']
            });
        }
    });
});
var pendingRequests2 = []
if (typeof $ != 'undefined') {
    $(document).ajaxSend(function (event, jqxhr, settings) {
        var token = localStorage.getItem('token');
        if (token) {
        pendingRequests2.push(jqxhr)
        if (typeof token != 'undefined') {
            // è‡ªåŠ¨å¸¦ä¸Š token
            jqxhr.setRequestHeader('Authorization', 'Bearer ' + token);
        }
@@ -132,14 +143,32 @@
        if (status === 401) {
            // æœªç™»å½• / token è¿‡æœŸ
            layer.confirm('登录已过期,请重新登录', { icon: 7, title: '提示' }, function () {
            abortAllPendingRequests(pendingRequests2)
            layer.confirm(jqxhr.responseJSON.Message, { icon: 7, title: '提示' }, function () {
                localStorage.removeItem('token');
                window.top.location.href = '../../views/user/login.html'; // è·³åˆ°ç™»å½•页
                window.top.location.href = '/views/user/login.html'; // è·³åˆ°ç™»å½•页
            });
        } else if (status === 403) {
            // æ— æƒé™
            layui.layer.msg('您没有该模块的操作权限', { icon: 2, time: 2000 });
            abortAllPendingRequests(pendingRequests2)
            layer.confirm(jqxhr.responseJSON.Message, {
                icon: 4, skin: 'layui-layer-lan', title: "温馨提示", closeBtn: 0, btn: ['确定']
            });
        }
    });
}
function abortAllPendingRequests(pendingRequests) {
    if (pendingRequests.length === 0) return;
    // éåŽ†å–æ¶ˆæ‰€æœ‰è¯·æ±‚
    $.each(pendingRequests, function (i, req) {
        try {
            req.abort(); // ä¸­æ–­è¯·æ±‚
        } catch (e) { }
    });
    // æ¸…空请求池
    pendingRequests = [];
}
WebTM/layuiadmin/modules/timerManager.js
New file
@@ -0,0 +1,113 @@
/**
 * Layui æ‰©å±•模块:定时器管理器
 * åŠŸèƒ½ï¼šç»Ÿä¸€ç®¡ç†å®šæ—¶å™¨ï¼Œæ”¯æŒæš‚åœ/恢复/清除,防止内存泄漏
 */
layui.define([], function(exports) {
    "use strict";
    // åŽŸå®šæ—¶å™¨æ ¸å¿ƒç±»
    class TimerManager {
        constructor() {
            this.timers = new Map();
        }
        /**
         * åˆ›å»ºå®šæ—¶å™¨
         * @param {String} key å®šæ—¶å™¨å”¯ä¸€æ ‡è¯†ï¼ˆå¦‚:'countdown')
         * @param {Function} callback æ‰§è¡Œçš„业务函数
         * @param {Number} interval æ‰§è¡Œé—´éš”(ms)
         * @param {String} type ç±»åž‹ï¼šinterval(重复)/ timeout(单次)
         * @returns {void}
         */
        createTimer(key, callback, interval = 1000, type = 'interval') {
            // å…ˆæ¸…除同名定时器,避免重复创建
            this.clearTimer(key);
            let timerId = null;
            const timerConfig = {
                id: null,
                type,
                callback,
                interval,
                isPaused: false
            };
            if (type === 'interval') {
                timerId = setInterval(() => {
                    // æš‚停状态不执行
                    if (!timerConfig.isPaused) {
                        callback();
                    }
                }, interval);
            } else if (type === 'timeout') {
                timerId = setTimeout(() => {
                    if (!timerConfig.isPaused) {
                        callback();
                        this.clearTimer(key); // å•次执行后自动清除
                    }
                }, interval);
            }
            timerConfig.id = timerId;
            this.timers.set(key, timerConfig);
        }
        /**
         * æš‚停定时器
         * @param {String} key å®šæ—¶å™¨æ ‡è¯†
         */
        pauseTimer(key) {
            const timer = this.timers.get(key);
            if (timer) {
                timer.isPaused = true;
            }
        }
        /**
         * æ¢å¤å®šæ—¶å™¨
         * @param {String} key å®šæ—¶å™¨æ ‡è¯†
         */
        resumeTimer(key) {
            const timer = this.timers.get(key);
            if (timer) {
                timer.isPaused = false;
            }
        }
        /**
         * æ¸…除单个定时器
         * @param {String} key å®šæ—¶å™¨æ ‡è¯†
         */
        clearTimer(key) {
            const timer = this.timers.get(key);
            if (timer) {
                if (timer.type === 'interval') {
                    clearInterval(timer.id);
                } else if (timer.type === 'timeout') {
                    clearTimeout(timer.id);
                }
                this.timers.delete(key);
            }
        }
        /**
         * æ¸…除所有定时器(页面销毁时调用)
         */
        clearAllTimers() {
            this.timers.forEach((timer) => {
                if (timer.type === 'interval') {
                    clearInterval(timer.id);
                } else if (timer.type === 'timeout') {
                    clearTimeout(timer.id);
                }
            });
            this.timers.clear();
        }
    }
    // åˆ›å»ºå•例
    const timerManager = new TimerManager();
    // å¯¼å‡ºæ¨¡å—
    exports('timerManager', timerManager);
});
WebTM/views/IpadIndex.html
@@ -56,7 +56,7 @@
            base: '../layuiadmin/' //静态资源所在路径
        }).extend({
            index: 'lib/index' //主入口模块
        }).use(['index', 'form', 'laydate', 'table', 'element'], function () {
        }).use(['index', 'form', 'laydate', 'table', 'element', "timerManager"], function () {
            var $ = layui.$
                , admin = layui.admin
                , layer = layui.layer
@@ -64,6 +64,7 @@
                , form = layui.form
                , laydate = layui.laydate
                , element = layui.element
                , timerManager = layui.timerManager
                ;
            //window å…¨å±€å˜é‡
            window.mychart1 = echarts.init(document.getElementById('mychart1'));
@@ -75,9 +76,67 @@
                mychart2.resize();
            })
            // é…ç½® å¼¹å‡ºå±‚ æ‰“å¼€/关闭处理函数
            InitLayerConfig()
            TSLoad();
            fetchButtonsData();
            timerManager.createTimer(
                'Timer',  // å”¯ä¸€æ ‡è¯†
                function () {
                    TSLoad();
                },
                10000,       // é—´éš”3分钟
                'interval'  // å¾ªçŽ¯ç±»åž‹
            );
            $(window).on('beforeunload', function () {
                timerManager.clearAllTimers();
        });
        });
        function InitLayerConfig() {
            var _open = layer.open
                , _timerManager = layui.timerManager
            layer.open = function (opts) {
                // åˆå¹¶é»˜è®¤é…ç½®
                var options = $.extend({}, layer.config, opts);
                var oldSuccess = options.success;
                var oldEnd = options.end;
                var needHideScroll = options.scrollbar === false;
                // æ‰“开弹窗时
                options.success = function (layero, index) {
                    if (needHideScroll) {
                        $('body').css('overflow', 'hidden');
                    }
                    console.log("暂停定时器")
                    _timerManager.pauseTimer('Timer')
                    if (oldSuccess) oldSuccess.call(this, layero, index);
                };
                // å…³é—­å¼¹çª—æ—¶
                options.end = function () {
                    if (needHideScroll) {
                        // åªæœ‰æœ€åŽä¸€ä¸ªå¼¹çª—关闭才恢复
                        if ($('.layui-layer:visible').length <= 1) {
                            $('body').css('overflow', '');
                        }
                    }
                    if ($('.layui-layer:visible').length <= 1) {
                        console.log("恢复定时器")
                        _timerManager.resumeTimer('Timer')
                    }
                    if (oldEnd) oldEnd.call(this);
                };
                return _open.call(this, options);
            };
        }
        function TSLoad() {
            $("#topleft").html("");
            var HUserName = sessionStorage["HUserName"];  //sessionStorage["HUserName"];     //默认当前登录人员
@@ -118,14 +177,14 @@
                                        case "生产":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修进行中":
                                        case "待机":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "故障":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border5"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修结束":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修终止":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                        case "维修完成":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        default:
                                    }
@@ -195,14 +254,14 @@
                                        case "生产":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修进行中":
                                        case "待机":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "故障":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border5"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修结束":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        case "维修终止":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border1"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                        case "维修完成":
                                            html1 += '<h1><span>当前状态:</span><span class="gj_icon color_border2"></span><span>' + LoadData[i - 1].HStatus + '</span></h1>';
                                            break;
                                        default:
                                    }
@@ -239,6 +298,7 @@
                        if (sessionStorage["Organization"] == "宁波市华舟包装有限公司") {
                            // åŽèˆŸ ä½¿ç”¨åˆ†ç»„标签
                            console.log("分组标签", LoadingTabsContact)
                            var divParent = document.createElement("div")
                            divParent.classList.add("layui-tab")
                            divParent.classList.add("layui-tab-card")
@@ -1531,13 +1591,6 @@
                layer.alert("请选择工单列表", { icon: 5 });
                return false;
            }
            //当前工单(汇报)按钮点击事件
            function CodingReport(event, obj) {
                if (wktag == 0) {
                    layer.alert("请选择工单列表", { icon: 5 });
                    return false;
                }
                // åˆ¤æ–­æ˜¯å¦ä¸ºåŽèˆŸç»„织              
                if (sessionStorage["Organization"] == "宁波市华舟包装有限公司") {
                    // åŽèˆŸç»„织:若汇报总数不为0则跳过状态检查,否则执行检查
@@ -1557,8 +1610,6 @@
                        return false;
                    }
                }
                // æ‰“å¼€ iframe å¼¹çª—(原有代码不变)
                layer.open({
                    type: 2,
                    skin: 'layui-layer-rim', //加上边框
@@ -1570,10 +1621,11 @@
                    scrollbar: false,
                    content: '车间管理/工序出站汇报单/Cj_StationOutBill_CurrentWork.html?OperationType=2&linterid=&HSouceBillType=',
                    end: function () {
                        // å¯é€‰çš„关闭回调
                    },
                    success: function (dom, index) {
                        var data = [{
                    var data = [];
                    data.push({
                            "HEquipName": $("#HEquipName1").text(),
                            "HEquipCode": $("#HEquipCode1").text(),
                            "HICMOBillNo": workcode,
@@ -1591,15 +1643,16 @@
                            "HSourceEntryID": HSourceEntryID,
                            "HSourceBillNo": HSourceBillNo,
                            "HSourceBillType": HSourceBillType
                        }];
                    });
                        //通过索引获取到当前iframe弹出层
                        var iframe = window['layui-layer-iframe' + index];
                        //调用iframe弹出层内的方法
                        iframe.edit(data);
                    }
                },
                });            
            }
        }
        //设备启动点检按钮点击事件
WebTM/views/²Ö´æ¹ÜÀí/Éú²úÈë¿âµ¥/Kf_ProductInBillList.html
@@ -323,7 +323,7 @@
            if (sessionStorage.login != "login") {
                layer.confirm("登录失效,请重新登录!", {
                    icon: 4, skin: 'layui-layer-lan', title: "温馨提示", closeBtn: 0, btn: ['重新登录']
                }, function () { window.location.href = "../../user/login.html"; });
                }, function () { window.location.href = "/views/user/login.html"; });
            }
            //#region   èŽ·å–ç»„ç»‡