|
|
<template> <div class="print-service"> <!-- 打印方式选择对话框 --> <el-dialog title="选择打印方式" :visible.sync="printDialogVisible" width="480px" :close-on-click-modal="false" class="print-dialog" > <div class="print-options"> <div class="option-description"> <i class="el-icon-info"></i> <span>请选择适合您环境的打印方式</span> </div>
<div class="print-methods"> <div class="print-method recommended" @click="selectPrintMethod('server')"> <div class="method-icon"> <i class="el-icon-s-platform"></i> </div> <div class="method-content"> <h4>服务器打印</h4> <p>通过WMS系统管理打印任务,支持打印机配置和权限控制</p> <div class="method-badge">推荐</div> </div> <div class="method-arrow"> <i class="el-icon-arrow-right"></i> </div> </div>
<div class="print-method" @click="selectPrintMethod('network')"> <div class="method-icon"> <i class="el-icon-connection"></i> </div> <div class="method-content"> <h4>直接网络打印</h4> <p>直接连接网络打印机,适合简单的网络环境</p> </div> <div class="method-arrow"> <i class="el-icon-arrow-right"></i> </div> </div> </div> </div>
<div slot="footer" class="dialog-footer"> <el-button @click="printDialogVisible = false">取消</el-button> </div> </el-dialog>
<!-- 打印机选择对话框 --> <el-dialog title="服务器打印设置" :visible.sync="printerSelectionVisible" width="350px" :close-on-click-modal="false" class="printer-selection-dialog" > <div class="printer-selection-content"> <div class="form-item"> <label class="form-label">选择打印机:</label> <el-select v-model="selectedPrinter" placeholder="请选择打印机" style="width: 100%;" > <el-option v-for="printer in availablePrinters" :key="printer.printerName" :label="`${printer.printerName} (${printer.ipAddress})`" :value="printer.printerName" /> </el-select> </div>
<div class="form-item"> <label class="form-label">打印份数:</label> <el-input v-model.number="printCopies" :min="1" :max="1" size="mini" style="width: 100%;" /> </div> </div>
<div slot="footer" class="dialog-footer"> <el-button @click="printerSelectionVisible = false">取消</el-button> <el-button type="primary" @click="confirmPrint" :disabled="!selectedPrinter">开始打印</el-button> </div> </el-dialog> </div></template>
<script>import { getUserLabelPrinters, printLabel } from '@/api/labelSetting/label_setting.js'
export default { name: 'PrintService', props: { // 是否显示打印对话框
visible: { type: Boolean, default: false }, // ZPL代码
zplCode: { type: String, required: true }, // 报告ID(可选)
reportId: { type: String, default: '' }, // 纸张尺寸(可选)
paperSize: { type: String, default: '' }, // 打印方向(可选)
orientation: { type: String, default: 'portrait' }, // DPI(可选)
dpi: { type: Number, default: 203 } }, data() { return { printLoading: false, printerSelectionVisible: false, availablePrinters: [], selectedPrinter: '', printCopies: 1 } }, computed: { printDialogVisible: { get() { return this.visible }, set(value) { this.$emit('update:visible', value) } } }, methods: { /** * 开始打印流程 */ async startPrint() { if (!this.zplCode || this.zplCode.trim() === '') { this.$message.warning('没有可打印的内容') return }
this.printDialogVisible = true },
/** * 选择打印方式 */ selectPrintMethod(method) { this.printDialogVisible = false
switch (method) { case 'server': this.showServerPrintDialog() break case 'network': this.showNetworkPrinterDialog() break default: console.warn('未知的打印方式:', method) } },
/** * 显示服务器打印对话框 */ async showServerPrintDialog() { try { // 获取用户可用的打印机列表
const { data } = await getUserLabelPrinters({ userId: localStorage.getItem('userName'), username: localStorage.getItem('userName'), site: this.$store.state.user.site })
if (!data.rows || data.rows.length === 0) { this.$confirm( '您还没有配置打印机,是否前往配置?', '未找到打印机', { confirmButtonText: '去配置', cancelButtonText: '取消', type: 'warning' } ).then(() => { this.$message.info('请联系管理员配置打印机') }) return }
// 显示打印机选择和份数设置对话框
this.showPrinterSelectionDialog(data.rows)
} catch (error) { console.error('获取打印机列表失败:', error) this.$message.error('获取打印机列表失败,请稍后重试') } },
/** * 显示打印机选择对话框 */ showPrinterSelectionDialog(printers) { this.availablePrinters = printers this.selectedPrinter = printers.length > 0 ? printers[0].printerName : '' this.printCopies = 1 this.printerSelectionVisible = true },
/** * 确认打印 */ confirmPrint() { if (!this.selectedPrinter) { this.$message.warning('请选择打印机') return }
this.printerSelectionVisible = false this.printViaServer(this.selectedPrinter, this.printCopies) },
/** * 通过服务器打印 */ async printViaServer(printerName, copies) { this.printLoading = true this.$emit('print-start')
try { const printRequest = { reportId: this.reportId, zplCode: this.zplCode, printerName: printerName, copies: copies, paperSize: this.paperSize, orientation: this.orientation, dpi: this.dpi, userId: localStorage.getItem('userName'), username: localStorage.getItem('userName'), site: this.$store.state.user.site }
const { data } = await printLabel(printRequest)
if (data.code === 200) { this.$message.success(`打印任务已发送!打印机: ${printerName}, 份数: ${copies}`) this.$emit('print-success', { printerName, copies }) } else { throw new Error(data.msg || '打印失败') }
} catch (error) { console.error('服务器打印失败:', error) this.$message.error(`打印失败: ${error.message || error}`) this.$emit('print-error', error) } finally { this.printLoading = false this.$emit('print-end') } },
/** * 显示网络打印机对话框 */ showNetworkPrinterDialog() { this.$prompt('请输入打印机IP地址', '直接网络打印', { confirmButtonText: '打印', cancelButtonText: '取消', inputPattern: /^(\d{1,3}\.){3}\d{1,3}$/, inputErrorMessage: '请输入正确的IP地址格式', inputPlaceholder: '例如: 192.168.1.100', inputValue: localStorage.getItem('localPrinterIP') || '' }).then(({ value }) => { localStorage.setItem('localPrinterIP', value) this.printToNetworkPrinter(value) }).catch(() => { this.$message.info('已取消打印') }) },
/** * 直接网络打印 */ async printToNetworkPrinter(printerIP) { /*this.printLoading = true this.$emit('print-start')
try {
} catch (error) { console.error('网络打印失败:', error) this.$message.error(`网络打印失败: ${error.message}`) this.$emit('print-error', error) } finally { this.printLoading = false this.$emit('print-end') }*/ // 直接发送到网络打印机
//this.$emit('print-start')
await fetch(`http://${printerIP}:9100`, { method: 'POST', headers: { 'Content-Type': 'text/plain', }, body: this.zplCode, mode: 'no-cors' }) this.$message.success(`打印任务已发送到 ${printerIP}`) //this.$emit('print-success', { printerIP })
console.log('网络打印成功:', { printerIP, zplCode: this.zplCode, paperSize: this.paperSize, orientation: this.orientation, dpi: this.dpi }) //this.$emit('print-end')
} }}</script>
<style scoped>/* 打印对话框样式 */.print-options { padding: 10px 0;}
.option-description { display: flex; align-items: center; gap: 8px; margin-bottom: 20px; padding: 12px; background: #f0f9ff; border: 1px solid #e0f2fe; border-radius: 8px; color: #0369a1; font-size: 14px;}
.option-description i { font-size: 16px; color: #0284c7;}
.print-methods { display: flex; flex-direction: column; gap: 12px;}
.print-method { display: flex; align-items: center; padding: 16px; border: 2px solid #e5e7eb; border-radius: 12px; cursor: pointer; transition: all 0.3s ease; background: #ffffff; position: relative; overflow: hidden;}
.print-method:hover { border-color: #3b82f6; box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15); transform: translateY(-2px);}
.print-method.recommended { border-color: #10b981; background: linear-gradient(135deg, #f0fdf4 0%, #ffffff 100%);}
.print-method.recommended:hover { border-color: #059669; box-shadow: 0 4px 12px rgba(16, 185, 129, 0.2);}
.method-icon { flex-shrink: 0; width: 48px; height: 48px; display: flex; align-items: center; justify-content: center; border-radius: 12px; margin-right: 16px; background: #f3f4f6; color: #6b7280; font-size: 20px; transition: all 0.3s ease;}
.print-method:hover .method-icon { background: #3b82f6; color: white; transform: scale(1.1);}
.print-method.recommended .method-icon { background: #10b981; color: white;}
.print-method.recommended:hover .method-icon { background: #059669;}
.method-content { flex: 1; position: relative;}
.method-content h4 { margin: 0 0 6px 0; font-size: 16px; font-weight: 600; color: #1f2937; line-height: 1.2;}
.method-content p { margin: 0; font-size: 13px; color: #6b7280; line-height: 1.4;}
.method-badge { position: absolute; top: -2px; right: 0; background: #10b981; color: white; font-size: 11px; font-weight: 600; padding: 2px 8px; border-radius: 12px; text-transform: uppercase; letter-spacing: 0.5px;}
.method-arrow { flex-shrink: 0; margin-left: 12px; color: #9ca3af; font-size: 16px; transition: all 0.3s ease;}
.print-method:hover .method-arrow { color: #3b82f6; transform: translateX(4px);}
.print-method.recommended:hover .method-arrow { color: #10b981;}
.dialog-footer { text-align: center; padding-top: 10px;}
/* 打印机选择对话框样式 */.printer-selection-content { padding: 10px 0;}
.form-item { margin-bottom: 20px;}
.form-label { display: block; margin-bottom: 8px; font-weight: 600; color: #303133; font-size: 14px;}
.form-hint { margin-top: 6px; font-size: 12px; color: #909399; line-height: 1.4;}
/* 响应式设计 */@media (max-width: 600px) { .print-method { padding: 12px; }
.method-icon { width: 40px; height: 40px; margin-right: 12px; font-size: 18px; }
.method-content h4 { font-size: 15px; }
.method-content p { font-size: 12px; }
.printer-selection-content { padding: 5px 0; }
.form-label { font-size: 13px; }}</style>
|