| | |
| | | modelBody: '', |
| | | modelFooter: '' |
| | | }, |
| | | tableAction: '', //æå®æå¼ 表çæé(è¿éå¡«å表å,é»è®¤ä¸ç¨å¡«å) |
| | | tableAction: '', |
| | | buttons: { view: [{ |
| | | name: 'çæäºç»´ç ', |
| | | name: 'çæäºç»´ç ', |
| | | type: 'success', |
| | | value: 'çæäºç»´ç ', |
| | | onClick: async function () { |
| | |
| | | return; |
| | | } |
| | | |
| | | // 2. è·ååæ®ç¼å· |
| | | const newMaterialBarCode = selectedRows[0].newMaterialBarCode; |
| | | if (!newMaterialBarCode) { |
| | | ElMessage.error('éä¸çæ°æ®ä¸æªæ¾å°åæ®ç¼å·'); |
| | | // 2. è·åæ ¸å¿ç©æåæ®µï¼æå·ãååãè§æ ¼çï¼ |
| | | const { materielCode, materialName, specification, lotNo, batchNo, date } = selectedRows[0]; |
| | | if (!materielCode) { |
| | | ElMessage.error('é䏿°æ®ç¼ºå°æå·ä¿¡æ¯'); |
| | | return; |
| | | } |
| | | |
| | | // 3. è·ååæ®æç»æ°æ®ï¼æ°å¢ï¼éè¿åæ®ç¼å·è·åQtyTransãMaterialCodeãMaterialNameï¼ |
| | | // let detailList = []; |
| | | // const loading = ElLoading.service({ text: 'è·ååæ®æç»ä¸...' }); |
| | | // try { |
| | | // const res = await http.post('/api/DocumentDetail/details', { transNo: transNo }); |
| | | // // æ ¡éªè¿åæ ¼å¼ï¼å¿
é¡»æ¯æ°ç»ä¸è³å°æä¸æ¡æ°æ®ï¼ |
| | | // if (!res.status || !Array.isArray(res.data) || res.data.length === 0) { |
| | | // throw new Error('æªæ¥è¯¢å°åæ®æç»æ°æ®'); |
| | | // } |
| | | // detailList = res.data; |
| | | |
| | | // // æ ¡éªæ¯æ¡æç»çå¿
å¡«åæ®µ |
| | | // detailList.forEach((item, index) => { |
| | | // if (!item.qtyTrans || !item.materialCode || !item.materialName) { |
| | | // throw new Error(`第${index + 1}æ¡æç»æ°æ®ä¸å®æ´`); |
| | | // } |
| | | // }); |
| | | // } catch (err) { |
| | | // ElMessage.error(err.message || 'è·ååæ®æç»å¤±è´¥'); |
| | | // loading.close(); |
| | | // return; |
| | | // } finally { |
| | | // loading.close(); |
| | | // } |
| | | |
| | | // 4. çæäºç»´ç |
| | | // 3. çæäºç»´ç ï¼å
容为æå·ï¼å¯æ ¹æ®éæ±æ¼æ¥æ´å¤ä¿¡æ¯ï¼ |
| | | let qrCodeUrl = ''; |
| | | try { |
| | | qrCodeUrl = await QRCode.toDataURL(newMaterialBarCode, { |
| | | width: 200, // äºç»´ç 大å°éé
å¸å± |
| | | qrCodeUrl = await QRCode.toDataURL(materielCode, { |
| | | width: 150, // éé
æ è¯å¡å°ºå¯¸ |
| | | margin: 1 |
| | | }); |
| | | } catch (err) { |
| | |
| | | return; |
| | | } |
| | | |
| | | // 5. åå»ºå¼¹çª |
| | | // 4. åå»ºå¼¹çªæè½½èç¹ |
| | | const mountNode = document.createElement('div'); |
| | | document.body.appendChild(mountNode); |
| | | |
| | | // æ·»å æå°ä¸ç¨æ ·å¼ |
| | | // æå°ä¸ç¨æ ·å¼ |
| | | const addPrintStyle = () => { |
| | | const style = document.createElement('style'); |
| | | style.id = 'qr-print-style'; |
| | |
| | | @media print { |
| | | body > *:not(.print-container) { display: none !important; } |
| | | .print-container { |
| | | position: fixed !important; |
| | | top: 50px !important; |
| | | left: 50px !important; |
| | | width: 90% !important; |
| | | height: auto !important; |
| | | position: fixed !important; |
| | | top: 0 !important; |
| | | left: 0 !important; |
| | | width: 100% !important; |
| | | height: 100% !important; |
| | | display: flex !important; |
| | | align-items: center !important; |
| | | justify-content: center !important; |
| | | padding: 0 !important; |
| | | margin: 0 !important; |
| | | } |
| | | /* æå°å
容å¸å± */ |
| | | .print-content { |
| | | display: flex !important; |
| | | flex-direction: column !important; |
| | | gap: 20px !important; |
| | | |
| | | .material-card { |
| | | padding: 5mm; /* ä½¿ç¨æ¯«ç±³å使´éé
æå°å°ºå¯¸ */ |
| | | font-size: 2mm; /* ææ¯ä¾ç¼©å°åä½ */ |
| | | position: relative; |
| | | width: 80mm; /* ç¥å°äºçº¸å¼ 宽度ï¼çè¾¹è· */ |
| | | height: 60mm; /* ç¥å°äºçº¸å¼ é«åº¦ï¼çè¾¹è· */ |
| | | box-sizing: border-box; /* ç¡®ä¿paddingä¸å½±åæ´ä½å°ºå¯¸ */ |
| | | } |
| | | .qr-wrapper { |
| | | align-self: flex-start !important; /* äºç»´ç é å·¦ */ |
| | | |
| | | .card-title { |
| | | text-align: center; |
| | | font-size: 2mm; /* æ é¢ç¥å¤§ */ |
| | | font-weight: bold; |
| | | margin-top: 5mm; /* åå°é¡¶é¨é´è· */ |
| | | margin-right: 20mm; /* éé
缩å°çäºç»´ç ä½ç½® */ |
| | | } |
| | | .detail-fields { |
| | | display: flex !important; |
| | | justify-content: space-around !important; /* åæ®µåååå¸ */ |
| | | width: 100% !important; |
| | | margin-top: 20px !important; |
| | | font-size: 16px !important; |
| | | |
| | | .card-fields { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | justify-content: space-between; |
| | | gap:1.5mm; /* 缩å°é´è· */ |
| | | margin-top: 8mm; /* è°æ´å段容å¨ä½ç½® */ |
| | | } |
| | | |
| | | .field-item { |
| | | text-align: center !important; |
| | | padding: 10px !important; |
| | | border: 1px solid #eee !important; |
| | | border-radius: 4px !important; |
| | | width: 30% !important; /* æ¯ä¸ªå段å 1/3宽度 */ |
| | | width: 48%; /* ä¿æä¸¤åå¸å± */ |
| | | line-height: 1.3; /* ç´§åè¡é« */ |
| | | } |
| | | .field-label { |
| | | font-weight: bold !important; |
| | | margin-bottom: 5px !important; |
| | | display: block !important; |
| | | |
| | | .qr-wrapper { |
| | | position: absolute; |
| | | top: 5mm; /* è°æ´äºç»´ç é¡¶é¨ä½ç½® */ |
| | | right: 3mm; /* è°æ´äºç»´ç å³ä¾§ä½ç½® */ |
| | | width: 15mm; /* äºç»´ç 尺寸éé
å°å¡ç */ |
| | | height: 15mm; |
| | | } |
| | | |
| | | .qr-wrapper img { |
| | | width: 100% !important; /* ç¡®ä¿äºç»´ç å¡«å
æ»¡å®¹å¨ */ |
| | | height: 100% !important; |
| | | object-fit: contain; |
| | | } |
| | | } |
| | | `; |
| | |
| | | |
| | | // æå°å½æ° |
| | | const printQrCode = () => { |
| | | // å建æå°å®¹å¨ |
| | | const printContainer = document.createElement('div'); |
| | | printContainer.className = 'print-container'; |
| | | printContainer.style = 'position:fixed; top:-9999px; left:-9999px;'; |
| | | document.body.appendChild(printContainer); |
| | | |
| | | // å¡«å
æå°å
容ï¼å¸å±ï¼äºç»´ç å·¦ä¸è§ + ä¸ä¸ªå段åååå¸ï¼ |
| | | // æå»ºç©ææ è¯å¡HTMLç»æ |
| | | printContainer.innerHTML = ` |
| | | <div class="print-content"> |
| | | <!-- äºç»´ç ï¼å·¦ä¸è§ï¼ --> |
| | | <div class="qr-wrapper"> |
| | | <img src="${qrCodeUrl}" style="width: 200px; height: 200px;" /> |
| | | <p style="margin-top: 10px; font-size: 16px;">åæ®ç¼å·ï¼${newMaterialBarCode}</p> |
| | | <div class="material-card"> |
| | | <div class="card-title">ååè½ç©ææ è¯å¡ï¼å°å
ï¼</div> |
| | | <div class="card-fields"> |
| | | <div class="field-item">æå·ï¼${materielCode}</div> |
| | | <div class="field-item">ä¾åºåç¼ç ï¼</div> |
| | | <div class="field-item">ååï¼${materialName || 'æ '}</div> |
| | | <div class="field-item">éè´åå·ï¼</div> |
| | | <div class="field-item">è§æ ¼ï¼${specification || 'æ '}</div> |
| | | <div class="field-item">æ°é/æ»æ°ï¼0PCS/0PCS</div> |
| | | <div class="field-item">æ¹å·ï¼${lotNo || 'æ '}</div> |
| | | <div class="field-item">æ¹æ¬¡ï¼${batchNo || 'æ '}</div> |
| | | <div class="field-item">ååºï¼ååè½ä¸å</div> |
| | | <div class="field-item">æ¥æï¼${date || 'æ '}</div> |
| | | </div> |
| | | |
| | | <!-- æç»å段ï¼åååå¸ï¼ --> |
| | | <div class="detail-fields"> |
| | | <div class="field-item"> |
| | | <span class="field-label">äº¤ææ°é</span> |
| | | <span>${detailList[0].qtyTrans}</span> |
| | | </div> |
| | | <div class="field-item"> |
| | | <span class="field-label">ç©æç¼ç </span> |
| | | <span>${detailList[0].materialCode}</span> |
| | | </div> |
| | | <div class="field-item"> |
| | | <span class="field-label">ç©æåç§°</span> |
| | | <span>${detailList[0].materialName}</span> |
| | | </div> |
| | | <div class="qr-wrapper"> |
| | | <img src="${qrCodeUrl}" alt="ç©æäºç»´ç " /> |
| | | </div> |
| | | </div> |
| | | `; |
| | | |
| | | // æ·»å æå°æ ·å¼ |
| | | const printStyle = addPrintStyle(); |
| | | |
| | | // æ¸
ç彿°ï¼é²æ¢éå¤ç§»é¤ï¼ |
| | | const cleanUp = () => { |
| | | if (printContainer.parentNode === document.body) { |
| | | document.body.removeChild(printContainer); |
| | | } |
| | | if (printStyle && printStyle.parentNode === document.head) { |
| | | document.head.removeChild(printStyle); |
| | | } |
| | | document.body.removeChild(printContainer); |
| | | document.head.removeChild(printStyle); |
| | | window.removeEventListener('afterprint', cleanUp); |
| | | }; |
| | | |
| | | // ç嬿å°å®æ |
| | | window.addEventListener('afterprint', cleanUp, { once: true }); |
| | | |
| | | // 触åæå° |
| | | window.print(); |
| | | }; |
| | | |
| | | // å¼¹çªç»ä»¶ï¼é¢è§å¸å±ï¼ |
| | | // å¼¹çªé¢è§ç»ä»¶ |
| | | const vnode = createVNode(ElDialog, { |
| | | title: 'åæ®äºç»´ç åæç»', |
| | | width: '600px', |
| | | title: 'ç©ææ è¯å¡åäºç»´ç ', |
| | | width: '500px', |
| | | modelValue: true, |
| | | style: { maxHeight: '500px', overflowY: 'auto' }, |
| | | appendToBody: true, |
| | | 'onUpdate:modelValue': (isVisible) => { |
| | | if (!isVisible) { |
| | | const printStyle = document.getElementById('qr-print-style'); |
| | | if (printStyle && printStyle.parentNode === document.head) { |
| | | document.head.removeChild(printStyle); |
| | | } |
| | | printStyle && document.head.removeChild(printStyle); |
| | | render(null, mountNode); |
| | | if (mountNode.parentNode === document.body) { |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | } |
| | | }, { |
| | | default: () => [ |
| | | // é¢è§åºå¸å±ï¼åæå°å¸å±ä¸è´ï¼ |
| | | h('div', { style: { padding: '20px' } }, [ |
| | | // äºç»´ç é¢è§ï¼å·¦ä¸è§ï¼ |
| | | h('div', { style: { marginBottom: '20px' } }, [ |
| | | h(ElImage, { |
| | | src: qrCodeUrl, |
| | | alt: 'åæ®äºç»´ç ', |
| | | style: { width: '200px', height: '200px' } |
| | | }), |
| | | h('p', { style: { marginTop: '10px', fontSize: '16px' } }, `åæ®ç¼å·ï¼${newMaterialBarCode}`) |
| | | ]), |
| | | // æç»å段é¢è§ï¼åååå¸ï¼ |
| | | // h('div', { style: { display: 'flex', justifyContent: 'space-around', gap: '10px' } }, [ |
| | | // h('div', { style: { textAlign: 'center', padding: '10px', border: '1px solid #eee', width: '30%' } }, [ |
| | | // h('div', { style: { fontWeight: 'bold', marginBottom: '5px' } }, 'äº¤ææ°é'), |
| | | // h('div', null, detailList[0].qtyTrans) |
| | | // ]), |
| | | // h('div', { style: { textAlign: 'center', padding: '10px', border: '1px solid #eee', width: '30%' } }, [ |
| | | // h('div', { style: { fontWeight: 'bold', marginBottom: '5px' } }, 'ç©æç¼ç '), |
| | | // h('div', null, detailList[0].materialCode) |
| | | // ]), |
| | | // h('div', { style: { textAlign: 'center', padding: '10px', border: '1px solid #eee', width: '30%' } }, [ |
| | | // h('div', { style: { fontWeight: 'bold', marginBottom: '5px' } }, 'ç©æåç§°'), |
| | | // h('div', null, detailList[0].materialName) |
| | | // ]) |
| | | // ]) |
| | | h('div', { style: { border: '1px solid #000', padding: '15px' ,position:'relative',height:'280px'} }, [ |
| | | h('div', { style: { textAlign: 'center', fontSize: '18px', fontWeight: 'bold', marginTop: '20px' ,marginRight:'100px'} }, 'ååè½ç©ææ è¯å¡ï¼å°å
ï¼'), |
| | | h('div', { style: { display: 'flex', flexWrap: 'wrap', justifyContent: 'space-between', gap: '10px',marginTop:'60px'} }, [ |
| | | h('div', { style: { width: '48%' } }, `æå·ï¼${materielCode}`), |
| | | h('div', { style: { width: '48%' } }, 'ä¾åºåç¼ç ï¼'), |
| | | h('div', { style: { width: '48%' } }, `ååï¼${materialName || 'æ '}`), |
| | | h('div', { style: { width: '48%' } }, 'éè´åå·ï¼'), |
| | | h('div', { style: { width: '48%' } }, `è§æ ¼ï¼${specification || 'æ '}`), |
| | | h('div', { style: { width: '48%' } }, 'æ°é/æ»æ°ï¼0PCS/0PCS'), |
| | | h('div', { style: { width: '48%' } }, `æ¹å·ï¼${lotNo || 'æ '}`), |
| | | h('div', { style: { width: '48%' } }, `æ¹æ¬¡ï¼${batchNo || 'æ '}`), |
| | | h('div', { style: { width: '48%' } }, 'ååºï¼ååè½ä¸å'), |
| | | h('div', { style: { width: '48%' } }, `æ¥æï¼${date || 'æ '}`), |
| | | ]), |
| | | h('div', { style: { position:'absolute',top:'1px',right:'15px',width:'100px',heigth:'100px' } }, [ |
| | | h(ElImage, { |
| | | src: qrCodeUrl, |
| | | alt: 'ç©æäºç»´ç ', |
| | | style: { width: '100px', height: '100px' } |
| | | }) |
| | | ]) |
| | | ]) |
| | | ]) |
| | | ], |
| | | footer: () => h('div', null, [ |
| | |
| | | type: 'default', |
| | | onClick: () => { |
| | | const printStyle = document.getElementById('qr-print-style'); |
| | | if (printStyle) document.head.removeChild(printStyle); |
| | | printStyle && document.head.removeChild(printStyle); |
| | | render(null, mountNode); |
| | | if (mountNode.parentNode === document.body) { |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | }, 'å
³é'), |
| | | h(ElButton, { |
| | | type: 'primary', |
| | | onClick: () => { |
| | | ElMessageBox.confirm( |
| | | 'æ¯å¦æå°è¯¥å
容ï¼', |
| | | 'æ¯å¦æå°è¯¥ç©ææ è¯å¡ï¼', |
| | | 'æå°ç¡®è®¤', |
| | | { |
| | | confirmButtonText: '确认æå°', |
| | |
| | | } |
| | | ).then(async () => { |
| | | try { |
| | | // æ§è¡æå°å¹¶çå¾
å®æï¼æè·å¯è½çé误 |
| | | await printQrCode(); |
| | | setTimeout(() => { |
| | | render(null, mountNode); |
| | | if (mountNode.parentNode === document.body) { |
| | | document.body.removeChild(mountNode); |
| | | } |
| | | document.body.removeChild(mountNode); |
| | | }, 500); |
| | | } catch (printErr) { |
| | | // æ¾ç¤ºçå®é误ï¼èéâ已忶âï¼ |
| | | ElMessage.error(`æå°å¤±è´¥ï¼${printErr.message || 'æªç¥é误'}`); |
| | | console.error('æå°é误ï¼', printErr); |
| | | } |
| | | }).catch((err) => { |
| | | // ä»
ç¨æ·ä¸»å¨åæ¶æ¶ææ¾ç¤ºâ已忶â |
| | | if (err === 'cancel' || err.name === 'CanceledError') { |
| | | ElMessage.info('已忶æå°'); |
| | | } |