与打印插件获取的打印机做交互
This commit is contained in:
@@ -212,6 +212,7 @@
|
|||||||
} from './utils/printDotBridge';
|
} from './utils/printDotBridge';
|
||||||
import { normalizeImportedNativeSchema } from './native/core/nativeSchemaNormalize';
|
import { normalizeImportedNativeSchema } from './native/core/nativeSchemaNormalize';
|
||||||
import { renderNativePrintHtml } from './native/core/printRenderer';
|
import { renderNativePrintHtml } from './native/core/printRenderer';
|
||||||
|
import { PRINT_TEMPLATE_SELECTED_PRINTER_KEY } from './utils/printNativeViaPrintDot';
|
||||||
|
|
||||||
defineOptions({ name: 'PrintTemplateList' });
|
defineOptions({ name: 'PrintTemplateList' });
|
||||||
|
|
||||||
@@ -304,7 +305,6 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
let hiprint: any = null;
|
let hiprint: any = null;
|
||||||
const PRINTER_STORAGE_KEY = 'print_template_selected_printer';
|
|
||||||
function resolveHiprint(module: any) {
|
function resolveHiprint(module: any) {
|
||||||
const defaultExport = module?.default || {};
|
const defaultExport = module?.default || {};
|
||||||
hiprint = module?.hiprint || defaultExport?.hiprint || (window as any)?.hiprint;
|
hiprint = module?.hiprint || defaultExport?.hiprint || (window as any)?.hiprint;
|
||||||
@@ -1637,10 +1637,10 @@
|
|||||||
selectedPrinterName,
|
selectedPrinterName,
|
||||||
(value) => {
|
(value) => {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
localStorage.removeItem(PRINTER_STORAGE_KEY);
|
localStorage.removeItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
localStorage.setItem(PRINTER_STORAGE_KEY, value);
|
localStorage.setItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY, value);
|
||||||
},
|
},
|
||||||
{ immediate: false },
|
{ immediate: false },
|
||||||
);
|
);
|
||||||
@@ -1651,7 +1651,7 @@
|
|||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
selectedPrinterName.value = localStorage.getItem(PRINTER_STORAGE_KEY) || '__system_default__';
|
selectedPrinterName.value = localStorage.getItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY) || '__system_default__';
|
||||||
await refreshPrinterOptions(false);
|
await refreshPrinterOptions(false);
|
||||||
if (!selectedPrinterName.value) {
|
if (!selectedPrinterName.value) {
|
||||||
selectedPrinterName.value = '__system_default__';
|
selectedPrinterName.value = '__system_default__';
|
||||||
|
|||||||
@@ -13,6 +13,19 @@
|
|||||||
<a-button @click="sendBackward">下移图层</a-button>
|
<a-button @click="sendBackward">下移图层</a-button>
|
||||||
<a-button @click="previewTemplate">即时预览</a-button>
|
<a-button @click="previewTemplate">即时预览</a-button>
|
||||||
<a-button @click="printTemplate">打印</a-button>
|
<a-button @click="printTemplate">打印</a-button>
|
||||||
|
<a-select
|
||||||
|
v-model:value="designerPrintDotPrinter"
|
||||||
|
:options="printDotPrinterSelectOptions"
|
||||||
|
:loading="printDotPrintersLoading"
|
||||||
|
placeholder="PrintDot 打印机"
|
||||||
|
show-search
|
||||||
|
option-filter-prop="label"
|
||||||
|
class="toolbar-printdot-printer"
|
||||||
|
:dropdown-match-select-width="false"
|
||||||
|
/>
|
||||||
|
<a-button size="small" :loading="printDotPrintersLoading" @click="refreshDesignerPrintDotPrinters(true)">
|
||||||
|
刷新打印机
|
||||||
|
</a-button>
|
||||||
<a-button :loading="printDotLoading" @click="printTemplateViaPrintDot">PrintDot 打印</a-button>
|
<a-button :loading="printDotLoading" @click="printTemplateViaPrintDot">PrintDot 打印</a-button>
|
||||||
<a-button type="primary" :loading="saving" @click="saveTemplate">保存模板</a-button>
|
<a-button type="primary" :loading="saving" @click="saveTemplate">保存模板</a-button>
|
||||||
</a-space>
|
</a-space>
|
||||||
@@ -307,7 +320,8 @@
|
|||||||
import PropertiesPanel from './components/PropertiesPanel.vue';
|
import PropertiesPanel from './components/PropertiesPanel.vue';
|
||||||
import ToolbarPalette from './components/ToolbarPalette.vue';
|
import ToolbarPalette from './components/ToolbarPalette.vue';
|
||||||
import { printHtml } from './core/printService';
|
import { printHtml } from './core/printService';
|
||||||
import { printNativeSchemaViaPrintDot } from '../utils/printNativeViaPrintDot';
|
import { fetchPrintDotPrinters, type PrintDotPrinter } from '../utils/printDotBridge';
|
||||||
|
import { printNativeSchemaViaPrintDot, PRINT_TEMPLATE_SELECTED_PRINTER_KEY } from '../utils/printNativeViaPrintDot';
|
||||||
import { renderNativePrintHtml, resolvePrintPageCount } from './core/printRenderer';
|
import { renderNativePrintHtml, resolvePrintPageCount } from './core/printRenderer';
|
||||||
import { generateNativeMockDataObject } from './core/nativeMockData';
|
import { generateNativeMockDataObject } from './core/nativeMockData';
|
||||||
import { buildNativeTemplateStylePayload } from './core/nativeTemplateStyleSerialize';
|
import { buildNativeTemplateStylePayload } from './core/nativeTemplateStyleSerialize';
|
||||||
@@ -344,6 +358,56 @@
|
|||||||
const templateId = ref('');
|
const templateId = ref('');
|
||||||
const saving = ref(false);
|
const saving = ref(false);
|
||||||
const printDotLoading = ref(false);
|
const printDotLoading = ref(false);
|
||||||
|
/** PrintDot 桥接返回的打印机列表(设计器内下拉) */
|
||||||
|
const printDotPrintersLoading = ref(false);
|
||||||
|
const printDotPrinterList = ref<PrintDotPrinter[]>([]);
|
||||||
|
/** 与模板列表共用 localStorage,保证列表与设计器选同一台机 */
|
||||||
|
const designerPrintDotPrinter = ref(
|
||||||
|
localStorage.getItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY) || '__system_default__',
|
||||||
|
);
|
||||||
|
|
||||||
|
const printDotPrinterSelectOptions = computed(() => {
|
||||||
|
const opts: Array<{ label: string; value: string }> = [
|
||||||
|
{ label: '系统默认打印机', value: '__system_default__' },
|
||||||
|
];
|
||||||
|
const seen = new Set<string>(['__system_default__']);
|
||||||
|
printDotPrinterList.value.forEach((p) => {
|
||||||
|
const name = String(p.name || '').trim();
|
||||||
|
if (!name || seen.has(name)) return;
|
||||||
|
seen.add(name);
|
||||||
|
opts.push({
|
||||||
|
label: p.isDefault ? `${name}(PrintDot 默认)` : name,
|
||||||
|
value: name,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return opts;
|
||||||
|
});
|
||||||
|
|
||||||
|
watch(designerPrintDotPrinter, (v) => {
|
||||||
|
if (!v) {
|
||||||
|
localStorage.removeItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
localStorage.setItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY, v);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function refreshDesignerPrintDotPrinters(showTip = true) {
|
||||||
|
printDotPrintersLoading.value = true;
|
||||||
|
try {
|
||||||
|
const list = await fetchPrintDotPrinters();
|
||||||
|
printDotPrinterList.value = list;
|
||||||
|
if (showTip) {
|
||||||
|
createMessage.success(`PrintDot 已连接,共 ${list.length} 台打印机`);
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
printDotPrinterList.value = [];
|
||||||
|
if (showTip) {
|
||||||
|
createMessage.warning(e?.message || '无法连接 PrintDot,请确认本机客户端已启动');
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
printDotPrintersLoading.value = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
const previewVisible = ref(false);
|
const previewVisible = ref(false);
|
||||||
const previewHtml = ref('');
|
const previewHtml = ref('');
|
||||||
const selectedTableColumn = ref<{ elementId: string; columnKey: string } | null>(null);
|
const selectedTableColumn = ref<{ elementId: string; columnKey: string } | null>(null);
|
||||||
@@ -1333,6 +1397,7 @@
|
|||||||
schema: state.schema,
|
schema: state.schema,
|
||||||
data: previewData.value,
|
data: previewData.value,
|
||||||
jobName: String(meta.templateCode || '').trim() || 'native-print',
|
jobName: String(meta.templateCode || '').trim() || 'native-print',
|
||||||
|
printerSelection: designerPrintDotPrinter.value || '__system_default__',
|
||||||
});
|
});
|
||||||
createMessage.success('已通过 PrintDot 提交打印');
|
createMessage.success('已通过 PrintDot 提交打印');
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@@ -1707,6 +1772,7 @@
|
|||||||
await loadTemplate();
|
await loadTemplate();
|
||||||
generateCanvasJson();
|
generateCanvasJson();
|
||||||
generateMockData({ syncManual: true, showMessage: false });
|
generateMockData({ syncManual: true, showMessage: false });
|
||||||
|
void refreshDesignerPrintDotPrinters(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
|||||||
@@ -3,7 +3,8 @@ import { renderNativePrintHtml } from '../native/core/printRenderer';
|
|||||||
import { buildPdfBase64FromHtmlFragment, extractBodyInnerHtmlFromFullDocument } from './printHtmlToPdfBase64';
|
import { buildPdfBase64FromHtmlFragment, extractBodyInnerHtmlFromFullDocument } from './printHtmlToPdfBase64';
|
||||||
import { fetchPrintDotPrinters, printDotSendPdf, resolvePrintDotPrinterName } from './printDotBridge';
|
import { fetchPrintDotPrinters, printDotSendPdf, resolvePrintDotPrinterName } from './printDotBridge';
|
||||||
|
|
||||||
const PRINTER_STORAGE_KEY = 'print_template_selected_printer';
|
/** 与模板列表页共用,便于设计器与列表选择同一台 PrintDot 打印机 */
|
||||||
|
export const PRINT_TEMPLATE_SELECTED_PRINTER_KEY = 'print_template_selected_printer';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 原生模板:渲染 HTML → 转 PDF → 经 PrintDot 本地桥接器送打印机
|
* 原生模板:渲染 HTML → 转 PDF → 经 PrintDot 本地桥接器送打印机
|
||||||
@@ -21,7 +22,8 @@ export async function printNativeSchemaViaPrintDot(params: {
|
|||||||
paginate: true,
|
paginate: true,
|
||||||
});
|
});
|
||||||
const printers = await fetchPrintDotPrinters();
|
const printers = await fetchPrintDotPrinters();
|
||||||
const fromStore = params.printerSelection ?? localStorage.getItem(PRINTER_STORAGE_KEY) ?? '__system_default__';
|
const fromStore =
|
||||||
|
params.printerSelection ?? localStorage.getItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY) ?? '__system_default__';
|
||||||
const resolved = resolvePrintDotPrinterName(fromStore, printers);
|
const resolved = resolvePrintDotPrinterName(fromStore, printers);
|
||||||
if (!resolved) {
|
if (!resolved) {
|
||||||
throw new Error('未解析到可用打印机:请在模板列表选择打印机,或启动 PrintDot 后刷新打印机列表');
|
throw new Error('未解析到可用打印机:请在模板列表选择打印机,或启动 PrintDot 后刷新打印机列表');
|
||||||
|
|||||||
Reference in New Issue
Block a user