liuhairui 22 hours ago
parent
commit
56a5cfc821
2 changed files with 296 additions and 177 deletions
  1. 66 86
      public/assets/js/LodopFuncs.js
  2. 230 91
      public/assets/js/backend/qcode_bach.js

+ 66 - 86
public/assets/js/LodopFuncs.js

@@ -1,12 +1,10 @@
-//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例,可直接使用,建议理解后融入自己程序==
-
-//用双端口加载主JS文件Lodop.js(或CLodopfuncs.js兼容老版本)以防其中某端口被占:
-var MainJS ="CLodopfuncs.js",
-    URL_WS1   = "ws://localhost:8000/"+MainJS,                //ws用8000/18000
-    URL_WS2   = "ws://localhost:18000/"+MainJS,
-    URL_HTTP1 = "http://localhost:8000/"+MainJS,              //http用8000/18000
-    URL_HTTP2 = "http://localhost:18000/"+MainJS,
-    URL_HTTP3 = "https://localhost.lodop.net:8443/"+MainJS;   //https用8000/8443
+//==本JS是加载Lodop插件或Web打印服务CLodop/Lodop7的综合示例==
+//用双端口加载主JS文件LodopFuncs.js,以防其中某端口被占:
+var MainJS = "CLodopfuncs.js",
+    URL_WS1 = "http://127.0.0.1:8000/" + MainJS,
+    URL_WS2 = "http://127.0.0.1:18000/" + MainJS,
+    URL_HTTP1 = "http://127.0.0.1:8000/" + MainJS,
+    URL_HTTP2 = "http://127.0.0.1:18000/" + MainJS;
 
 var CreatedOKLodopObject, CLodopIsLocal, LoadJsState;
 
@@ -45,50 +43,51 @@ function needCLodop() {
 }
 
 //==检查加载成功与否,如没成功则用http(s)再试==
-//==低版本CLODOP6.561/Lodop7.043及前)用本方法==
 function checkOrTryHttp() {
-  if (window.getCLodop) {
-     LoadJsState = "complete";
-     return true;
-  }
-  if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
-  LoadJsState = "loadingB";
-  var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
-  var JS1 = document.createElement("script")
-     ,JS2 = document.createElement("script")
-     ,JS3 = document.createElement("script");
-  JS1.src = URL_HTTP1;
-  JS2.src = URL_HTTP2;
-  JS3.src = URL_HTTP3;
-  JS1.onload = JS2.onload = JS3.onload = JS2.onerror = JS3.onerror=function(){LoadJsState = "complete";}
-  JS1.onerror = function(e) {
-      if (window.location.protocol !== 'https:')
-          head.insertBefore(JS2, head.firstChild); else
-          head.insertBefore(JS3, head.firstChild);
-  }
-  head.insertBefore(JS1,head.firstChild);
+    if (window.getCLodop) {
+        LoadJsState = "complete";
+        return true;
+    }
+    if (LoadJsState == "loadingB" || LoadJsState == "complete") return;
+    LoadJsState = "loadingB";
+    var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
+    var JS1 = document.createElement("script")
+        ,JS2 = document.createElement("script");
+    JS1.src = URL_HTTP1;
+    JS2.src = URL_HTTP2;
+
+    // 添加 CORS 错误处理
+    JS1.onerror = function(e) {
+        console.warn("加载 CLodopfuncs.js (端口8000) 失败:", e);
+        // 尝试备用端口
+        head.insertBefore(JS2, head.firstChild);
+    };
+
+    JS2.onerror = function(e) {
+        console.warn("加载 CLodopfuncs.js (端口18000) 失败:", e);
+        LoadJsState = "complete";
+        // 显示 CORS 错误提示
+        if (window.location.protocol === 'http:') {
+            console.warn("CORS 错误: 公共 HTTP 网站无法访问本地资源,请使用 HTTPS 或修改浏览器设置");
+        }
+    };
+
+    JS1.onload = JS2.onload = function() {
+        LoadJsState = "complete";
+    };
+
+    head.insertBefore(JS1,head.firstChild);
 }
 
 //==加载Lodop对象的主过程:==
 (function loadCLodop(){
-  if (!needCLodop()) return;
-  CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
-  LoadJsState = "loadingA";
-  if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
-  //ws方式速度快(小于200ms)且可避免CORS错误,但要求Lodop版本足够新:
-  try {
-    var WSK1=new WebSocket(URL_WS1);
-    WSK1.onopen = function(e) { setTimeout("checkOrTryHttp()",200); }
-    WSK1.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
-    WSK1.onerror = function(e) {
-         var WSK2=new WebSocket(URL_WS2);
-         WSK2.onopen = function(e) {setTimeout("checkOrTryHttp()",200);}
-         WSK2.onmessage = function(e) {if (!window.getCLodop) eval(e.data);}
-         WSK2.onerror= function(e) {checkOrTryHttp();}
-    }
-  } catch(e){
+    if (!needCLodop()) return;
+    CLodopIsLocal = !!((URL_WS1 + URL_WS2).match(/\/\/localho|\/\/127.0.0./i));
+    LoadJsState = "loadingA";
+    if (!window.WebSocket && window.MozWebSocket) window.WebSocket=window.MozWebSocket;
+
+    // 直接走 HTTP 方式,不再尝试 WebSocket(HTTP 环境下 WS 必然被拦截)
     checkOrTryHttp();
-  }
 })();
 
 //==获取LODOP对象主过程,判断是否安装、需否升级:==
@@ -98,17 +97,13 @@ function getLodop(oOBJECT, oEMBED) {
     var strLodopUpdate = strFontTag + "需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>";
     var strLodop64Install = strFontTag + "未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>";
     var strLodop64Update = strFontTag + "需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>";
-    var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>下载执行安装</a>";
+    var strLodop7Install_X86 = strFontTag + "未安装!点击这里<a href='http://www.c-lodop.com/download.html' target='_blank'>执行安装</a>";
+    var strLodop7Install_ARM = strFontTag + "未安装!点击这里<a href='http://www.c-lodop.com/download.html' target='_blank'>执行安装</a>";
+    var strCLodopInstallA = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='http://www.c-lodop.com/download.html' target='_blank'>下载执行安装</a>";
     var strCLodopInstallB = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)";
-    var strCLodopUpdate = "";
-    var strLodop7FontTag = "<br><font color='#FF00FF'>Web打印服务Lodop7";
-    var strLodop7HrefX86 = "点击这里<a href='Lodop7_Linux_X86_64.tar.gz' target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
-    var strLodop7HrefARM = "点击这里<a href='Lodop7_Linux_ARM64.tar.gz'  target='_self'>下载安装</a>(下载后解压,点击lodop文件开始执行)";
-    var strLodop7Install_X86 = strLodop7FontTag + "未安装启动," + strLodop7HrefX86;
-    var strLodop7Install_ARM = strLodop7FontTag + "未安装启动," + strLodop7HrefARM;
-    var strLodop7Update_X86 = strLodop7FontTag + "需升级," + strLodop7HrefX86;
-    var strLodop7Update_ARM = strLodop7FontTag + "需升级," + strLodop7HrefARM;
-    var strInstallOK = ",成功后请刷新本页面或重启浏览器。</font>";
+    var strCorsError = "<br><font color='#FF0000'>成功后请刷新本页面或重启浏览器</font>";
+    var strCorsSolution = "<br><font color='#0066CC'></font>";
+    var strInstallOK = "</font>";
     var LODOP;
     try {
         var isWinIE = (/MSIE/i.test(navigator.userAgent)) || (/Trident/i.test(navigator.userAgent));
@@ -132,28 +127,19 @@ function getLodop(oOBJECT, oEMBED) {
                     strAlertMessage = strLodop7Install_X86;
                 else if (isLinuxARM)
                     strAlertMessage = strLodop7Install_ARM;
-                else
+                else {
                     strAlertMessage = strCLodopInstallA + (CLodopIsLocal ? strCLodopInstallB : "");
+                    // 添加 CORS 错误提示
+                    if (window.location.protocol === 'http:') {
+                        strAlertMessage += strCorsError + strCorsSolution;
+                    }
+                }
                 document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
                 return;
-            } else {
-                if (isLinuxX86 && LODOP.CVERSION < "7.0.4.3")
-                    strAlertMessage = strLodop7Update_X86;
-                else if (isLinuxARM && LODOP.CVERSION < "7.0.4.3")
-                    strAlertMessage = strLodop7Update_ARM;
-                else if (CLODOP && CLODOP.CVERSION < "6.5.7.2")
-                    strAlertMessage = strCLodopUpdate;
-
-                if (strAlertMessage)
-                    document.body.innerHTML = strAlertMessage + strInstallOK + document.body.innerHTML;
             }
         } else {
-            //==如果页面有Lodop插件就直接使用,否则新建:==
             if (oOBJECT || oEMBED) {
-                if (isWinIE)
-                    LODOP = oOBJECT;
-                else
-                    LODOP = oEMBED;
+                LODOP = isWinIE ? oOBJECT : oEMBED;
             } else if (!CreatedOKLodopObject) {
                 LODOP = document.createElement("object");
                 LODOP.setAttribute("width", 0);
@@ -167,7 +153,7 @@ function getLodop(oOBJECT, oEMBED) {
                 CreatedOKLodopObject = LODOP;
             } else
                 LODOP = CreatedOKLodopObject;
-            //==Lodop插件未安装时提示下载地址:==
+
             if ((!LODOP) || (!LODOP.VERSION)) {
                 document.body.innerHTML = (isWinIE64 ? strLodop64Install : strLodopInstall) + strInstallOK + document.body.innerHTML;
                 return LODOP;
@@ -176,23 +162,17 @@ function getLodop(oOBJECT, oEMBED) {
                 document.body.innerHTML = (isWinIE64 ? strLodop64Update : strLodopUpdate) + strInstallOK + document.body.innerHTML;
             }
         }
-        //===如下空白位置适合调用统一功能(如注册语句、语言选择等):=======================
-
-
-        //===============================================================================
         return LODOP;
     } catch (err) {
         console.error("getLodop出错:", err);
-        // 返回一个空对象以避免后续调用出错
         return {
-            SET_LICENSES: function(){}, 
-            PRINT_INIT: function(){}, 
-            SET_PRINT_STYLE: function(){}, 
-            SET_PRINT_PAGESIZE: function(){}, 
-            ADD_PRINT_HTM: function(){}, 
-            PREVIEW: function(){}, 
+            SET_LICENSES: function(){},
+            PRINT_INIT: function(){},
+            SET_PRINT_STYLE: function(){},
+            SET_PRINT_PAGESIZE: function(){},
+            ADD_PRINT_HTM: function(){},
+            PREVIEW: function(){},
             PRINT: function(){}
         };
     }
 }
-

+ 230 - 91
public/assets/js/backend/qcode_bach.js

@@ -8,13 +8,58 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
             this.table.second();
 
             //大件码打印
+            // function print_l(data,qrcode){
+            //     //打印二维码
+            //     var html = '<style type="text/css">' +
+            //         '.tg  {border-collapse:collapse;border-spacing:0;font-weight:500;}' +
+            //         '.tg td{font-family:Arial, sans-serif;font-size:14px;padding:5px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}' +
+            //         '.tg .tg-s6z2{text-align:center;}</style>' +
+            //         '<div width="340px"><table class="tg" width="340px">' +
+            //         '<caption style="width: 300px;">'+data.company_name+'</caption>' +
+            //         '<tr><td style="width: 70px;">规格:</td><td colspan="5" style="word-break:break-all;border-color:black;">'+data.product_name+'</td>' +
+            //         '<tr><td>配盘数:</td><td colspan="2">'+data.sqrcd+'</td><td>辅单位:</td><td colspan="2">'+data.sec_unit+'</td></tr>' +
+            //         '<tr><td>数量:</td><td colspan="2">'+data.num+'</td><td>主单位:</td><td colspan="2">'+data.main_unit+'</td></tr>' +
+            //         '<tr><td>生产日期:</td><td colspan="5">'+data.date+'</td></tr>' +
+            //         '<tr><td>生产批号:</td><td colspan="5">'+data.batch+'</td></tr>' +
+            //         '<tr><td colspan="6" style="word-break:break-all; border-color:black; font-size: 13px;">'+data.qrcode+'</td></table>' +
+            //         '<div style="position:absolute;top: 260px;left: 30px"><img src="'+data.pCode+'" > </td></div>' +
+            //         '<div style="position:absolute;top: 365px;left: 300px;width: 50px;text-align: center;"><span style="font-weight: 500;word-break:normal;font-size: 16px">大件号'+data.l_flow+'</span></div>\n' +
+            //         '</div>';
+            //     var printPdf = (html,qrcode) => {
+            //         var LODOP=getLodop();
+            //         console.log("LODOP 对象:", LODOP);
+
+            //         LODOP.SET_LICENSES("","152A06E8F6CBD6AC1F213ABFCB0D8604","C94CEE276DB2187AE6B65D56B3FC2848","");
+
+            //         LODOP.PRINT_INIT("河南中烟大件二维码打码");
+            //         LODOP.SET_PRINT_STYLE("FontSize",16);
+            //         LODOP.SET_PRINT_STYLE("Bold",1);
+
+            //         LODOP.SET_PRINT_PAGESIZE(1, 1000, 1500, "CreateCustomPage");
+            //         LODOP.ADD_PRINT_HTM(5,8,516,590,html);
+
+            //         // LODOP.SET_PRINT_STYLEA(0,"QRCodeVersion",14);
+            //         // LODOP.SET_PRINT_STYLEA(0,"QRCodeErrorLevel","M");
+            //         // LODOP.ADD_PRINT_BARCODE(18,715,'27mm','27mm',"QRCode",qrcode);
+            //         // LODOP.PRINT() // 直接打印
+            //         // LODOP.PRINT_DESIGN() // 设计模式
+            //         if (qrcode){
+            //             LODOP.PREVIEW();//打印预览
+            //         }else{
+            //             LODOP.PRINT();// 直接打印
+            //         }
+            //     };
+            //     printPdf(html,qrcode);
+            // }
+
+
             function print_l(data,qrcode){
                 //打印二维码
                 var html = '<style type="text/css">' +
                     '.tg  {border-collapse:collapse;border-spacing:0;font-weight:500;}' +
-                    '.tg td{font-family:Arial, sans-serif;font-size:14px;padding:5px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}' +
+                    '.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}' +
                     '.tg .tg-s6z2{text-align:center;}</style>' +
-                    '<div width="270px"><table class="tg" width="314px">' +
+                    '<div width="340px"><table class="tg" width="340px">' +
                     '<caption style="width: 300px;">'+data.company_name+'</caption>' +
                     '<tr><td style="width: 70px;">规格:</td><td colspan="5" style="word-break:break-all;border-color:black;">'+data.product_name+'</td>' +
                     '<tr><td>配盘数:</td><td colspan="2">'+data.sqrcd+'</td><td>辅单位:</td><td colspan="2">'+data.sec_unit+'</td></tr>' +
@@ -22,8 +67,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                     '<tr><td>生产日期:</td><td colspan="5">'+data.date+'</td></tr>' +
                     '<tr><td>生产批号:</td><td colspan="5">'+data.batch+'</td></tr>' +
                     '<tr><td colspan="6" style="word-break:break-all; border-color:black; font-size: 13px;">'+data.qrcode+'</td></table>' +
-                    '<div style="position:absolute;top: 240px;left: 16px"><img src="'+data.pCode+'" > </td></div>' +
-                    '<div style="position:absolute;top: 355px;left: 283px;width: 50px;text-align: center;"><span style="font-weight: 500;word-break:normal;font-size: 16px">大件号'+data.l_flow+'</span></div>\n' +
+                    '<div style="position:absolute;top: 287px;left: 30px"><img src="'+data.pCode+'" > </td></div>' +
+                    '<div style="position:absolute;top: 365px;left: 300px;width: 50px;text-align: center;"><span style="font-weight: 500;word-break:normal;font-size: 16px">大件号'+data.l_flow+'</span></div>\n' +
                     '</div>';
                 var printPdf = (html,qrcode) => {
                     var LODOP=getLodop();
@@ -35,7 +80,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
 
                     LODOP.SET_PRINT_PAGESIZE(1, 1000, 1500, "CreateCustomPage");
                     // LODOP.ADD_PRINT_HTM(15,20,350,545,html);
-                    LODOP.ADD_PRINT_HTM(10,20,346,511,html);
+                    LODOP.ADD_PRINT_HTM(10,20,350,590,html);
 
                     // LODOP.SET_PRINT_STYLEA(0,"QRCodeVersion",14);
                     // LODOP.SET_PRINT_STYLEA(0,"QRCodeErrorLevel","M");
@@ -47,52 +92,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                     }else{
                         LODOP.PRINT() // 直接打印
                     }
+
                 }
                 printPdf(html,qrcode)
             }
-            // function print_l(data,qrcode){
-            //     //打印二维码
-            //     var html = '<style type="text/css">' +
-            //         '.tg  {border-collapse:collapse;border-spacing:0;font-weight:500;}' +
-            //         '.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:black;}' +
-            //         '.tg .tg-s6z2{text-align:center;}</style>' +
-            //         '<div width="340px"><table class="tg" width="340px">' +
-            //         '<caption style="width: 300px;">'+data.company_name+'</caption>' +
-            //         '<tr><td style="width: 70px;">规格:</td><td colspan="5" style="word-break:break-all;border-color:black;">'+data.product_name+'</td>' +
-            //         '<tr><td>配盘数:</td><td colspan="2">'+data.sqrcd+'</td><td>辅单位:</td><td colspan="2">'+data.sec_unit+'</td></tr>' +
-            //         '<tr><td>数量:</td><td colspan="2">'+data.num+'</td><td>主单位:</td><td colspan="2">'+data.main_unit+'</td></tr>' +
-            //         '<tr><td>生产日期:</td><td colspan="5">'+data.date+'</td></tr>' +
-            //         '<tr><td>生产批号:</td><td colspan="5">'+data.batch+'</td></tr>' +
-            //         '<tr><td colspan="6" style="word-break:break-all; border-color:black; font-size: 13px;">'+data.qrcode+'</td></table>' +
-            //         '<div style="position:absolute;top: 287px;left: 30px"><img src="'+data.pCode+'" > </td></div>' +
-            //         '<div style="position:absolute;top: 370px;left: 300px;width: 50px;text-align: center;"><span style="font-weight: 500;word-break:normal;font-size: 16px">大件号'+data.l_flow+'</span></div>\n' +
-            //         '</div>';
-            //     var printPdf = (html,qrcode) => {
-            //         var LODOP=getLodop();
-            //         LODOP.SET_LICENSES("","152A06E8F6CBD6AC1F213ABFCB0D8604","C94CEE276DB2187AE6B65D56B3FC2848","");
-            //
-            //         LODOP.PRINT_INIT("河南中烟大件二维码打码");
-            //         LODOP.SET_PRINT_STYLE("FontSize",16);
-            //         LODOP.SET_PRINT_STYLE("Bold",1);
-            //
-            //         LODOP.SET_PRINT_PAGESIZE(1, 1000, 1500, "CreateCustomPage");
-            //         // LODOP.ADD_PRINT_HTM(15,20,350,545,html);
-            //         LODOP.ADD_PRINT_HTM(10,20,350,590,html);
-            //
-            //         // LODOP.SET_PRINT_STYLEA(0,"QRCodeVersion",14);
-            //         // LODOP.SET_PRINT_STYLEA(0,"QRCodeErrorLevel","M");
-            //         // LODOP.ADD_PRINT_BARCODE(18,715,'27mm','27mm',"QRCode",qrcode);
-            //         // LODOP.PRINT() // 直接打印
-            //         // LODOP.PRINT_DESIGN() // 设计模式
-            //         if (qrcode){
-            //             LODOP.PREVIEW()	//打印预览
-            //         }else{
-            //             LODOP.PRINT() // 直接打印
-            //         }
-            //
-            //     }
-            //     printPdf(html,qrcode)
-            // }
 
             //小件码打印(10mmx2.5mm)
             function print1(data,qrcode){
@@ -283,28 +286,76 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                 var html = '<div style="margin-top: 20px">' +
                     '<label class="col-xs-5 col-sm-3" style="text-align: right;">标签类型:</label>' +
                     '<select class="selectpicker" style="height: 30px;" name="row[type]" id="type">' +
-                    '<option value="v010" >v010大件盒包装(10cmx15cm)</option>' +
+                    '<option value="v010" >v010 大件盒包装 (10cmx15cm)</option>' +
                     '</select>' +
                     '</div>' +
                     '<div>' +
                     '<label class="col-xs-5 col-sm-3" style="text-align: right;">打印数量:</label>' +
                     '<input id="numn" style="width: 200px;margin-bottom: 2px;" name="row[numn]" type="text" value="4">' +
                     '</div>' +
-                    '<div class="form-group layer-footer" style="margin-top: 10px">' +
+                    '<div class="form-group layer-footer" style="margin-top: 15px;margin-bottom: 10px">' +
                     '<div style="text-align: center">' +
-                    '<button type="submit" id="btn" class="btn btn-primary btn-embossed">确认</button>' +
-                    '<button type="reset" id="reset" class="btn btn-defaults btn-embossed">取消</button>' +
+                    '<button type="button" id="btn" class="btn btn-primary btn-embossed" style="position: relative; z-index: 10;">确认</button>' +
+                    '<button type="button" id="reset" class="btn btn-default btn-embossed" style="margin-left: 10px; position: relative; z-index: 10; cursor: pointer;" onclick="layer.closeAll();">取消</button>' +
                     '</div>' +
                     '</div>';
 
                 var layero_l = layer.open({
                     type: 1,
                     title: '自动打码(大件)',
-                    area: ['400px','200px'],
+                    area: ['400px','260px'],
                     content: html,
+                    cancel: function(index, layero) {
+                        // 点击右上角 X 关闭时也清理 LODOP
+                        if(typeof LODOP !== 'undefined' && LODOP) {
+                            try {
+                                LODOP.On_Return = null;
+                            } catch(e) {}
+                        }
+                        return true;
+                    },
                     success: function(layero) {
-                        // 在弹窗中绑定事件处理程序
-                        $(layero).find('#btn').click(function(e) {
+                        // 先检查 LODOP 是否可用
+                        var lodopAvailable = false;
+                        try {
+                            if(typeof getLodop === 'function') {
+                                var checkLODOP = getLodop();
+                                if(checkLODOP) {
+                                    lodopAvailable = true;
+                                }
+                            }
+                        } catch(e) {
+                            lodopAvailable = false;
+                        }
+
+                        if(!lodopAvailable) {
+                            Toastr.warning('LODOP 打印控件未加载成功,请检查打印服务是否已启动');
+                        }
+
+                        // 在弹窗中绑定事件处理程序 - 确保取消按钮事件优先绑定
+                        console.log('开始绑定取消按钮事件,layero:', layero);
+                        var $resetBtn = $(layero).find('#reset');
+                        console.log('找到取消按钮:', $resetBtn.length, '个');
+
+                        $resetBtn.on('click', function(e) {
+                            console.log('取消按钮被点击!');
+                            e.preventDefault();
+                            e.stopPropagation();
+                            try {
+                                if(typeof LODOP !== 'undefined' && LODOP) {
+                                    LODOP.On_Return = null;
+                                }
+                            } catch(e) {
+                                console.error('清理 LODOP 出错:', e);
+                            }
+                            console.log('准备关闭弹窗,layero_l:', layero_l);
+                            layer.close(layero_l);
+                            console.log('弹窗已关闭');
+                        });
+
+                        console.log('取消按钮事件绑定完成');
+
+                        $(layero).find('#btn').on('click', function(e) {
                             e.preventDefault();
                             var type = $('#type').val();
                             var numn = $('#numn').val();
@@ -312,6 +363,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                 Toastr.error('请填写打印数量');
                                 return false;
                             }
+
+                            // 检查 LODOP 是否可用
+                            if(typeof LODOP === 'undefined' || !LODOP) {
+                                Toastr.error('LODOP 打印控件未加载,请检查打印服务是否已启动');
+                                return false;
+                            }
+
                             $.post('qcode_bach/print_l', {'ids':ids, 'type':type, 'numn':numn}, function (res) {
                                 if(res.code==1){
                                     var p = 0;
@@ -360,13 +418,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                 }else{
                                     Toastr.error(res.msg);
                                 }
+                            }).fail(function() {
+                                Toastr.error('网络请求失败,请检查网络连接');
                             })
                         });
-
-                        $(layero).find('#reset').click(function(e) {
-                            e.preventDefault();
-                            layer.close(layero_l);
-                        });
                     }
                 });
 
@@ -396,21 +451,58 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                     '<label class="col-xs-5 col-sm-3" style="text-align: right;">打印数量:</label>' +
                     '<input id="numn" style="width: 200px;margin-bottom: 2px;" name="row[numn]" type="text" value="1">' +
                     '</div>' +
-                    '<div class="form-group layer-footer" style="margin-top: 10px">' +
+                    '<div class="form-group layer-footer" style="margin-top: 15px;margin-bottom: 10px">' +
                     '<div style="text-align: center">' +
-                    '<button type="submit" id="btn" class="btn btn-primary btn-embossed">确认</button>' +
-                    '<button type="reset" id="reset" class="btn btn-defaults btn-embossed">取消</button>' +
+                    '<button type="button" id="btn" class="btn btn-primary btn-embossed">确认</button>' +
+                    '<button type="button" id="reset" class="btn btn-default btn-embossed" style="margin-left: 10px;" onclick="layer.closeAll();">取消</button>' +
                     '</div>' +
                     '</div>';
 
                 var layero_s = layer.open({
                     type: 1,
                     title: '自动打码(小件)',
-                    area: ['400px','200px'],
+                    area: ['400px','260px'],
                     content: html,
+                    cancel: function(index, layero) {
+                        // 点击右上角 X 关闭时也清理 LODOP
+                        if(typeof LODOP !== 'undefined' && LODOP) {
+                            try {
+                                LODOP.On_Return = null;
+                            } catch(e) {}
+                        }
+                        return true;
+                    },
                     success: function(layero) {
-                        // 在弹窗中绑定事件处理程序
-                        $(layero).find('#btn').click(function(e) {
+                        // 先检查 LODOP 是否可用
+                        var lodopAvailable = false;
+                        try {
+                            if(typeof getLodop === 'function') {
+                                var checkLODOP = getLodop();
+                                if(checkLODOP) {
+                                    lodopAvailable = true;
+                                }
+                            }
+                        } catch(e) {
+                            lodopAvailable = false;
+                        }
+
+                        if(!lodopAvailable) {
+                            Toastr.warning('LODOP 打印控件未加载成功,请检查打印服务是否已启动');
+                        }
+
+                        // 在弹窗中绑定事件处理程序 - 确保取消按钮事件优先绑定
+                        $(layero).find('#reset').on('click', function(e) {
+                            e.preventDefault();
+                            e.stopPropagation();
+                            try {
+                                if(typeof LODOP !== 'undefined' && LODOP) {
+                                    LODOP.On_Return = null;
+                                }
+                            } catch(e) {}
+                            layer.close(layero_s);
+                        });
+
+                        $(layero).find('#btn').on('click', function(e) {
                             e.preventDefault();
                             var type = $('#type').val();
                             var numn = $('#numn').val();
@@ -419,6 +511,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                 Toastr.error('请填写打印数量');
                                 return false;
                             }
+
+                            // 检查 LODOP 是否可用
+                            if(typeof LODOP === 'undefined' || !LODOP) {
+                                Toastr.error('LODOP 打印控件未加载,请检查打印服务是否已启动');
+                                return false;
+                            }
+
                             $.post('qcode_bach/print_s', {'ids':ids, 'type':type, 'numn':numn}, function (res) {
                                 if(res.code==1){
                                     var p = 0;
@@ -483,12 +582,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                 }else{
                                     Toastr.error(res.msg);
                                 }
+                            }).fail(function() {
+                                Toastr.error('网络请求失败,请检查网络连接');
                             })
                         });
-                        $(layero).find('#reset').click(function(e) {
-                            e.preventDefault();
-                            layer.close(layero_s);
-                        });
                     }
                 });
 
@@ -923,10 +1020,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                             '<label class="col-xs-5 col-sm-3" style="text-align: right;">打印数量:</label>' +
                                             '<input id="numn" style="width: 200px;margin-bottom: 2px;" name="row[numn]" type="text" value="1">' +
                                             '</div>' +
-                                            '<div class="form-group" style="margin-top: 10px">' +
+                                            '<div class="form-group" style="margin-top: 15px;margin-bottom: 10px">' +
                                             '<div style="text-align: center">' +
-                                            '<button type="submit" id="btn" class="btn btn-primary btn-embossed">确认</button>' +
-                                            '<button type="reset" id="reset" class="btn btn-defaults btn-embossed">取消</button>' +
+                                            '<button type="button" id="btn" class="btn btn-primary btn-embossed">确认</button>' +
+                                            '<button type="button" id="reset" class="btn btn-default btn-embossed" style="margin-left: 10px;" onclick="layer.closeAll();">取消</button>' +
                                             '</div>' +
                                             '</div>';
 
@@ -935,9 +1032,46 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                             title: '打码(小件)',
                                             area: ['400px','200px'],
                                             content: html,
+                                            cancel: function(index, layero) {
+                                                // 点击右上角 X 关闭时也清理 LODOP
+                                                if(typeof LODOP !== 'undefined' && LODOP) {
+                                                    try {
+                                                        LODOP.On_Return = null;
+                                                    } catch(e) {}
+                                                }
+                                                return true;
+                                            },
                                             success: function(layero) {
-                                                // 在弹窗中绑定事件处理程序
-                                                $(layero).find('#btn').click(function(e) {
+                                                // 先检查 LODOP 是否可用
+                                                var lodopAvailable = false;
+                                                try {
+                                                    if(typeof getLodop === 'function') {
+                                                        var checkLODOP = getLodop();
+                                                        if(checkLODOP) {
+                                                            lodopAvailable = true;
+                                                        }
+                                                    }
+                                                } catch(e) {
+                                                    lodopAvailable = false;
+                                                }
+
+                                                if(!lodopAvailable) {
+                                                    Toastr.warning('LODOP 打印控件未加载成功,请检查打印服务是否已启动');
+                                                }
+
+                                                // 在弹窗中绑定事件处理程序 - 确保取消按钮事件优先绑定
+                                                $(layero).find('#reset').on('click', function(e) {
+                                                    e.preventDefault();
+                                                    e.stopPropagation();
+                                                    try {
+                                                        if(typeof LODOP !== 'undefined' && LODOP) {
+                                                            LODOP.On_Return = null;
+                                                        }
+                                                    } catch(e) {}
+                                                    layer.close(layero_ls);
+                                                });
+
+                                                $(layero).find('#btn').on('click', function(e) {
                                                     e.preventDefault();
                                                     var type = $('#type').val();
                                                     var numn = $('#numn').val();
@@ -946,6 +1080,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                                         Toastr.error('请填写打印数量');
                                                         return false;
                                                     }
+
+                                                    // 检查 LODOP 是否可用
+                                                    if(typeof LODOP === 'undefined' || !LODOP) {
+                                                        Toastr.error('LODOP 打印控件未加载,请检查打印服务是否已启动');
+                                                        return false;
+                                                    }
+
                                                     $.post('qcode_bach/print_ls', {'ids':ids, 'type':type, 'numn':numn}, function (res) {
                                                         if(res.code==1){
                                                             var p = 0;
@@ -1010,12 +1151,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                                                         }else{
                                                             Toastr.error(res.msg);
                                                         }
+                                                    }).fail(function() {
+                                                        Toastr.error('网络请求失败,请检查网络连接');
                                                     })
                                                 });
-                                                $(layero).find('#reset').click(function(e) {
-                                                    e.preventDefault();
-                                                    layer.close(layero_ls);
-                                                });
                                             }
                                         });
 
@@ -1777,24 +1916,24 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'LodopFuncs'], functi
                             '<table class="tg" width="340px">\n' +
                             '<caption style="width: 300px;">'+res.data.company_name+'</caption>\n' +
                             '<tr>\n' +
-                                '<td style="width: 70px;">规格:</td>\n' +
-                                '<td colspan="5" style="word-break:break-all;border-color:black;">'+res.data.product_name+'</td>\n' +
+                            '<td style="width: 70px;">规格:</td>\n' +
+                            '<td colspan="5" style="word-break:break-all;border-color:black;">'+res.data.product_name+'</td>\n' +
                             '</tr>\n' +
                             '<tr>\n' +
-                                '<td>配盘数:</td>\n' +
-                                '<td colspan="2">'+res.data.sqrcd+'</td>\n' +
-                                '<td>辅单位:</td>\n' +
-                                '<td colspan="2">'+res.data.sec_unit+'</td>\n' +
+                            '<td>配盘数:</td>\n' +
+                            '<td colspan="2">'+res.data.sqrcd+'</td>\n' +
+                            '<td>辅单位:</td>\n' +
+                            '<td colspan="2">'+res.data.sec_unit+'</td>\n' +
                             '</tr>\n' +
                             '<tr>\n' +
-                                '<td>数量:</td>\n' +
-                                '<td colspan="2">'+res.data.num+'</td>\n' +
-                                '<td>主单位:</td>\n' +
-                                '<td colspan="2">'+res.data.main_unit+'</td>\n' +
+                            '<td>数量:</td>\n' +
+                            '<td colspan="2">'+res.data.num+'</td>\n' +
+                            '<td>主单位:</td>\n' +
+                            '<td colspan="2">'+res.data.main_unit+'</td>\n' +
                             '</tr>\n' +
                             '<tr>\n' +
-                                '<td>生产日期:</td>\n' +
-                                '<td colspan="5">'+res.data.date+'</td>\n' +
+                            '<td>生产日期:</td>\n' +
+                            '<td colspan="5">'+res.data.date+'</td>\n' +
                             '</tr>\n' +
                             '<tr>\n' +
                             '<td>生产批号:</td>\n' +