// ==UserScript== // @name 广东省资产管理系统 - 璞趣TQ80标签打印 v3.5 // @namespace https://zc.czt.gd.gov.cn/ // @version 3.5.0 // @description 单位名称标题, 全选/反选, 本地条码, Blob打印(格式修复), TQ80标签 // @author Autos AI // @match https://zc.czt.gd.gov.cn/sys/basemodules/asset/assetprint/listAssetPrint.html* // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @run-at document-idle // ==/UserScript== (function() { 'use strict'; // 42列表头 → 字段映射 var FIELD_MAP = [ null,null,null, 'barcode','printStatus','cardNumber','classCode','industryCode', 'name','originalValue','isBooked','registrant','registerDate', 'unit','acquisitionDate','bookingDate','voucherNo','financialPerson', 'department','acquisitionMethod','status','projectCode', 'quantity','unitOfMeasure','netValue','accumulatedDepreciation', 'isDepreciated','purpose','user','userAccount','custodian', 'location','manufacturer','specification','brand', 'warrantyEndDate','expectedEndDate','remark','campus', 'unifiedCode','lastModifier','lastModified' ]; var DEFAULTS = {labelWidth:50,labelHeight:30,copies:1,fontSize:7.5,showQR:true,showBarcode:true,dpi:203}; var SK = 'puqu_label_v3_settings'; var settings = GM_getValue(SK, null); if (!settings || typeof settings !== 'object') settings = {}; for (var k in DEFAULTS) { if (!(k in settings)) settings[k] = DEFAULTS[k]; } GM_addStyle( '.puqu-float-btn{position:fixed;bottom:100px;right:24px;z-index:2147483647;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:none;border-radius:12px;padding:14px 28px;font-size:15px;font-weight:bold;cursor:pointer;box-shadow:0 4px 24px rgba(102,126,234,0.45);transition:all 0.25s;font-family:"Microsoft YaHei",sans-serif;display:flex;align-items:center;gap:8px;}' +'.puqu-float-btn:hover{transform:translateY(-2px);box-shadow:0 8px 32px rgba(102,126,234,0.6);}' +'.puqu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:2147483646;background:rgba(0,0,0,0.45);display:flex;align-items:center;justify-content:center;}' +'.puqu-dialog{background:#fff;border-radius:16px;padding:28px 28px 20px;max-width:680px;width:92%;max-height:85vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,0.3);font-family:"Microsoft YaHei",sans-serif;}' +'.puqu-dialog h3{margin:0 0 16px;font-size:18px;color:#333;}' +'.puqu-dialog .pd-row{display:flex;gap:12px;margin-bottom:10px;align-items:center;flex-wrap:wrap;}' +'.puqu-dialog .pd-row label{font-size:13px;color:#555;white-space:nowrap;min-width:70px;}' +'.puqu-dialog .pd-row input[type="number"]{width:80px;padding:6px 10px;border:1px solid #ccc;border-radius:6px;font-size:13px;}' +'.puqu-dialog .pd-row input[type="checkbox"]{width:16px;height:16px;cursor:pointer;}' +'.puqu-dialog .pd-asset-list{max-height:260px;overflow-y:auto;border:1px solid #eee;border-radius:8px;margin:12px 0;padding:6px 0;}' +'.puqu-dialog .puqu-asset-item{display:flex;align-items:center;gap:8px;padding:6px 12px;font-size:13px;cursor:pointer;border-bottom:1px solid #f5f5f5;}' +'.puqu-dialog .puqu-asset-item:hover{background:#f8f8ff;}' +'.puqu-dialog .puqu-asset-item .cbox{flex-shrink:0;width:16px;height:16px;cursor:pointer;}' +'.puqu-dialog .puqu-asset-item .aname{flex:1;word-break:break-all;}' +'.puqu-dialog .puqu-asset-item .acode{color:#888;font-size:11px;white-space:nowrap;}' +'.puqu-dialog .pd-btns{display:flex;gap:10px;justify-content:flex-end;margin-top:16px;}' +'.puqu-dialog .pd-btns button{padding:9px 24px;border:none;border-radius:8px;cursor:pointer;font-size:14px;font-weight:500;}' +'.puqu-dialog .pd-btns .btn-cancel{background:#e8e8e8;color:#444;}' +'.puqu-dialog .pd-btns .btn-print{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;}' +'.puqu-dialog .sel-tools{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-wrap:wrap;}' +'.puqu-dialog .sel-tools button{font-size:11px;padding:3px 14px;border:1px solid #ccc;border-radius:4px;background:#f5f5f5;cursor:pointer;}' +'.puqu-dialog .sel-tools button:hover{background:#e8e8ff;border-color:#667eea;}' +'.puqu-toast{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.82);color:#fff;padding:10px 22px;border-radius:8px;font-size:14px;z-index:2147483647;pointer-events:none;animation:puquFadeIn 0.25s ease;}' +'@keyframes puquFadeIn{from{opacity:0;transform:translate(-50%,-50%) scale(0.9);}}' ); function escHtml(s) { return s ? s.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"') : ''; } function toast(msg) { var t=document.createElement('div');t.className='puqu-toast';t.textContent=msg;document.body.appendChild(t);setTimeout(function(){t.remove();},2500); } function extractAssets() { var assets=[], rows=document.querySelectorAll('.datagrid-body tr.datagrid-row'); for(var i=0;i=32&&c<=126?c:63);} if(!s)s='-'; var codes=[104]; for(var i=0;i'); parts.push(''); var x=quiet*modW, barH=h*0.78, textY=h*0.95, textSize=Math.max(5,Math.round(h*0.14)); for(var i=0;i');x+=modW;} parts.push(''+escHtml(data)+''); parts.push(''); return 'data:image/svg+xml,'+encodeURIComponent(parts.join('')); } // ========== QR 码 ========== function genQRSVG(data, size) { if(!data) data='-'; // 优先用 api.qrserver.com return 'https://api.qrserver.com/v1/create-qr-code/?size='+Math.round(size*2)+'x'+Math.round(size*2)+'&data='+encodeURIComponent(data); } // ========== 对话框 ========== function showPrintDialog(assets) { if(document.querySelector('.puqu-overlay')) return; var rowsHTML=''; for(var i=0;i'+escHtml(a.name||'')+''+escHtml(a.cardNumber||'')+''; } var overlay=document.createElement('div'); overlay.className='puqu-overlay'; overlay.innerHTML='
\

🏷️ 璞趣TQ80标签打印

\
✅ 已检测到 '+assets.length+' 条资产
\
mm mm
\
\
选择资产:
\
'+rowsHTML+'
\
\
'; document.body.appendChild(overlay); overlay.querySelector('#puqu-cancel').onclick=function(){overlay.remove();}; overlay.querySelector('#puqu-go').onclick=function(){ settings.labelWidth=parseInt(document.getElementById('puqu-w').value)||50; settings.labelHeight=parseInt(document.getElementById('puqu-h').value)||30; settings.fontSize=parseFloat(document.getElementById('puqu-fs').value)||7.5; settings.dpi=parseInt(document.getElementById('puqu-dpi').value)||203; settings.showQR=document.getElementById('puqu-showqr').checked; settings.showBarcode=document.getElementById('puqu-showbc').checked; GM_setValue(SK,settings); var sel=[]; overlay.querySelectorAll('.puqu-asset-item .cbox:checked').forEach(function(cb){var idx=parseInt(cb.dataset.index);if(idx>=0&&idx'; rows += '
编号' + escHtml(code) + '
'; if (dept) rows += '
部门' + escHtml(dept) + '
'; if (loc) rows += '
地点' + escHtml(loc) + '
'; if (spec) rows += '
规格' + escHtml(spec) + '
'; var codes = ''; if (cfg.showBarcode && bcSvg) codes += 'barcode'; if (cfg.showQR && qrUrl) codes += 'qr'; labelsHTML += '
' + '
' + escHtml(unitTitle) + '
' + '
' + rows + '
' + (codes ? '
' + codes + '
' : '') + '
'; } // 构建完整 HTML 文档 var fullHtml = '\n标签打印\n\n' // 工具栏 + '
\n' + ' 🏷️ 标签预览\n' + ' ' + assets.length + '条 | ' + cfg.labelWidth + '×' + cfg.labelHeight + 'mm | ' + cfg.dpi + 'DPI\n' + ' ⚠ 打印时请设置:纸张=' + cfg.labelWidth + '×' + cfg.labelHeight + 'mm,边距=无,缩放=100%\n' + ' \n' + ' \n' + ' \n' + '
\n' + labelsHTML + '\n'; // 使用 Blob URL 创建独立文档 (比 document.write 渲染更可靠) var blob = new Blob([fullHtml], {type: 'text/html;charset=UTF-8'}); var url = URL.createObjectURL(blob); var pw = window.open(url, 'puqu_print_' + Date.now(), 'width=860,height=700'); if (!pw) { toast('⚠️ 弹窗被拦截,请允许本站弹窗后重试'); URL.revokeObjectURL(url); return; } // 窗口加载后自动触发打印 pw.addEventListener('load', function() { // 不再自动打印,等用户确认设置后手动点击按钮 }); // 清理 blob URL(延迟,确保窗口已加载) setTimeout(function() { URL.revokeObjectURL(url); }, 3000); } function addButton() { if(document.getElementById('puqu-float-btn'))return; // 工具栏按钮(放在"标签打印(斑马)"旁边) var zb=document.getElementById('id_btn_bm_print'); if(zb&&zb.parentNode){ var tb=document.createElement('button'); tb.textContent='璞趣打印'; tb.style.cssText='padding:5px 16px;margin-left:8px;border:none;border-radius:4px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;cursor:pointer;font-size:13px;font-weight:500;'; tb.onclick=function(){var a=extractAssets();if(!a.length){toast('⚠️ 未检测到资产数据');return;}showPrintDialog(a);}; zb.parentNode.insertBefore(tb,zb.nextSibling); } // 右下角浮动按钮 var btn=document.createElement('button'); btn.id='puqu-float-btn';btn.className='puqu-float-btn'; btn.innerHTML='🖨️ 璞趣打印'; btn.title='TQ80标签打印 (Ctrl+Shift+P)'; btn.onclick=function(){var a=extractAssets();if(!a.length){toast('⚠️ 未检测到资产数据');return;}showPrintDialog(a);}; document.body.appendChild(btn); // 快捷键 document.addEventListener('keydown',function(e){ if(e.ctrlKey&&e.shiftKey&&e.key==='P'){e.preventDefault();btn.click();} }); } function init(){ var a=0; function tryAdd(){ if(document.querySelectorAll('.datagrid-body tr.datagrid-row').length>0){addButton();return;} if(++a<15)setTimeout(tryAdd,1000);else addButton(); } if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',function(){setTimeout(tryAdd,800);}); else setTimeout(tryAdd,800); } init(); })();