+
-
diff --git a/jeecgboot-vue3/src/views/print/template/components/NativeTemplateListPreviewModal.vue b/jeecgboot-vue3/src/views/print/template/components/NativeTemplateListPreviewModal.vue
new file mode 100644
index 0000000..4e42c93
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/components/NativeTemplateListPreviewModal.vue
@@ -0,0 +1,724 @@
+
+
+
+ {{ errorText }}
+
+
+
+
+
+
画布实际 JSONï¼ˆæ¨¡æ¿æ ·å¼ï¼‰
+
+
+
+
+
+
+
+
+
+
+
+ æ ¹æ®ç”»å¸ƒç”Ÿæˆ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/components/PrintTemplateModal.vue b/jeecgboot-vue3/src/views/print/template/components/PrintTemplateModal.vue
index f0675a8..d74afed 100644
--- a/jeecgboot-vue3/src/views/print/template/components/PrintTemplateModal.vue
+++ b/jeecgboot-vue3/src/views/print/template/components/PrintTemplateModal.vue
@@ -8,15 +8,30 @@
import { computed, ref, unref } from 'vue';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form';
- import { formSchema } from '../printTemplate.data';
+ import { formSchema, PAPER_PRESET_MAP } from '../printTemplate.data';
import { add, edit } from '../printTemplate.api';
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(false);
+ const isNativeMode = ref(false);
const title = computed(() => (!unref(isUpdate) ? 'æ–°å¢žæ‰“å°æ¨¡æ¿' : 'ç¼–è¾‘æ‰“å°æ¨¡æ¿'));
+ function inferPresetBySize(record: Recordable) {
+ const width = Number(record?.paperWidthMm || 0);
+ const height = Number(record?.paperHeightMm || 0);
+ const orientation = String(record?.paperOrientation || 'portrait') as 'portrait' | 'landscape';
+ if (!width || !height) {
+ return undefined;
+ }
+ const key = Object.keys(PAPER_PRESET_MAP).find((presetKey) => {
+ const item = PAPER_PRESET_MAP[presetKey];
+ return item.width === width && item.height === height && item.orientation === orientation;
+ });
+ return key || 'CUSTOM';
+ }
+
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 110,
schemas: formSchema,
@@ -28,30 +43,94 @@
resetFields();
setModalProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
+ isNativeMode.value = data?.isNative === true;
if (unref(isUpdate) && data?.record) {
+ const paperPreset = inferPresetBySize(data.record);
setFieldsValue({
...data.record,
+ paperPreset: paperPreset || 'CUSTOM',
});
+ return;
}
+ setFieldsValue({
+ paperPreset: 'A4',
+ });
});
+ /** ç¼–è¾‘æ—¶åœ¨åˆ—è¡¨é‡Œæ”¹äº†çº¸å¼ ï¼Œéœ€åŒæ¥å†™å›ž templateJson.page,å¦åˆ™åŽŸç”Ÿè®¾è®¡å™¨ä»è¯»æ—§å°ºå¯¸ */
+ function mergeNativePaperIntoTemplateJson(templateJson: string, paperWidthMm: number, paperHeightMm: number): string {
+ const width = Math.max(10, Number(paperWidthMm) || 210);
+ const height = Math.max(10, Number(paperHeightMm) || 297);
+ try {
+ const parsed = JSON.parse(templateJson || '{}');
+ if (parsed?.engine === 'native') {
+ if (!parsed.page || typeof parsed.page !== 'object') {
+ parsed.page = { unit: 'mm', margin: [10, 10, 10, 10], gridSize: 2 };
+ }
+ parsed.page.width = width;
+ parsed.page.height = height;
+ return JSON.stringify(parsed);
+ }
+ } catch {
+ /* éž JSON 或æŸååˆ™åŽŸæ ·è¿”å›ž */
+ }
+ return templateJson;
+ }
+
+ function buildNativeTemplateJson(values: Recordable) {
+ const width = Math.max(10, Number(values?.paperWidthMm || 210));
+ const height = Math.max(10, Number(values?.paperHeightMm || 297));
+ return JSON.stringify({
+ engine: 'native',
+ version: '1.0.0',
+ page: {
+ width,
+ height,
+ unit: 'mm',
+ margin: [10, 10, 10, 10],
+ gridSize: 2,
+ },
+ elements: [],
+ dataBinding: {
+ fieldMap: {},
+ tableSources: ['mainTable', 'detailList'],
+ },
+ });
+ }
+
async function handleSubmit() {
try {
const values = await validate();
+ delete values.paperPreset;
+ if (unref(isUpdate) && values.templateJson) {
+ values.templateJson = mergeNativePaperIntoTemplateJson(
+ String(values.templateJson),
+ Number(values.paperWidthMm),
+ Number(values.paperHeightMm),
+ );
+ }
if (!unref(isUpdate)) {
delete values.id;
- if (!values.templateJson) {
+ if (isNativeMode.value) {
+ values.templateJson = buildNativeTemplateJson(values);
+ } else if (!values.templateJson) {
values.templateJson = '{}';
}
}
setModalProps({ confirmLoading: true });
+ let savedResult: any = null;
if (unref(isUpdate)) {
- await edit(values);
+ savedResult = await edit(values);
} else {
- await add(values);
+ savedResult = await add(values);
}
closeModal();
- emit('success');
+ emit('success', {
+ isNative: isNativeMode.value,
+ isUpdate: unref(isUpdate),
+ values,
+ savedResult,
+ });
} finally {
setModalProps({ confirmLoading: false });
}
diff --git a/jeecgboot-vue3/src/views/print/template/hiprint/qhmesProvider.ts b/jeecgboot-vue3/src/views/print/template/hiprint/qhmesProvider.ts
index 35a977f..5fb6a54 100644
--- a/jeecgboot-vue3/src/views/print/template/hiprint/qhmesProvider.ts
+++ b/jeecgboot-vue3/src/views/print/template/hiprint/qhmesProvider.ts
@@ -1,215 +1,252 @@
-import { hiprint } from 'vue-plugin-hiprint';
-
-/**
- * QH-MES 自定义 provider(å‚考 vue-plugin-hiprint åŠ¨æ€ provider 机制)
- * - 新增一组“报表/套打â€å¸¸ç”¨ç»„ä»¶
- * - æä¾›ä¸€ä¸ªé»˜è®¤çš„“普通明细表â€ï¼ˆå•行表头)
- *
- * 注æ„ï¼šæ¤ provider 䏿›¿æ¢ defaultElementTypeProvider,åªåšè¡¥å……。
- */
-export function createQhmesProvider() {
- const key = 'qhmesModule';
-
- const addElementTypes = function (context: any) {
- // é¿å…é‡å¤æ³¨å†Œ
- context.removePrintElementTypes(key);
-
- const commonText = (tid: string, title: string, extraOptions: Record
= {}) => {
- return {
- tid,
- title,
- type: 'text',
- options: {
- title,
- field: '',
- testData: title,
- ...extraOptions,
- },
- };
- };
-
- const elements: any[] = [
- commonText(`${key}.reportTitle`, 'æŠ¥è¡¨æ ‡é¢˜', { fontSize: 18, fontWeight: 'bold', textAlign: 'center' }),
- commonText(`${key}.subTitle`, 'å‰¯æ ‡é¢˜', { fontSize: 12, textAlign: 'center' }),
- commonText(`${key}.labelValue`, 'æ ‡ç¾:值', { fontSize: 10 }),
- commonText(`${key}.pageNo`, '页ç ', { field: 'pageNumber', testData: '1/1' }),
-
- // 二维ç /æ¡ç (用 text + textType)
- {
- tid: `${key}.qrcode`,
- title: '二维ç ',
- type: 'text',
- options: {
- title: '二维ç ',
- field: 'qrcode',
- testData: 'QRCODE_DEMO',
- textType: 'qrcode',
- width: 35,
- height: 35,
- },
- },
- {
- tid: `${key}.barcode`,
- title: 'æ¡å½¢ç ',
- type: 'text',
- options: {
- title: 'æ¡å½¢ç ',
- field: 'barcode',
- testData: '1234567890',
- textType: 'barcode',
- width: 80,
- height: 25,
- },
- },
-
- // 普通明细表(å•行表头,支æŒå¤šçº§åˆ†ç»„åˆå¹¶ï¼‰
- {
- tid: `${key}.tableSimple`,
- title: '普通明细表',
- type: 'html',
- options: {
- title: '普通明细表',
- field: 'table',
- testData: '',
- width: 180,
- height: 60,
- __qhmesManaged: true,
- columns: [
- { title: '物料', order: 0, field: 'name', width: 90, align: 'left' },
- { title: 'æ•°é‡', order: 1, field: 'qty', width: 45, align: 'right' },
- { title: '金é¢', order: 2, field: 'amount', width: 45, align: 'right' },
- ],
- groupFields: [],
- formatter: `
-function(t,e,printData){
- var opts = (t && t.options) ? t.options : {};
- var list = printData && Array.isArray(printData[opts.field || 'table']) ? printData[opts.field || 'table'] : [];
- var globalCols = printData && Array.isArray(printData.__qhmesTableColumns) ? printData.__qhmesTableColumns : [];
- var columns = Array.isArray(opts.columns) && opts.columns.length ? opts.columns : (globalCols.length ? globalCols : [
- { title: '物料', order: 0, field: 'name', width: 90, align: 'left' },
- { title: 'æ•°é‡', order: 1, field: 'qty', width: 45, align: 'right' },
- { title: '金é¢', order: 2, field: 'amount', width: 45, align: 'right' }
- ]);
- columns = columns.slice().sort(function(a,b){
- var ao = Number(a && a.order);
- var bo = Number(b && b.order);
- var av = isFinite(ao) ? ao : 9999;
- var bv = isFinite(bo) ? bo : 9999;
- return av - bv;
- });
- var globalGroups = printData && Array.isArray(printData.__qhmesGroupFields) ? printData.__qhmesGroupFields : [];
- var groupFields = Array.isArray(opts.groupFields) && opts.groupFields.length ? opts.groupFields : globalGroups;
- var style = opts.__qhmesStyle || {};
- var fontSize = style.fontSize || 10;
- var borderColor = style.borderColor || '#000';
- var borderWidth = style.borderWidth || 1;
- var cellPadding = style.cellPadding || '2pt 4pt';
- var headerBg = style.headerBg || '';
- var tableWidth = style.tableWidth || '100%';
-
- function esc(v){
- if (v === null || v === undefined) return '';
- return String(v).replace(/&/g,'&').replace(//g,'>');
- }
- function isGroupCol(field){
- return groupFields.indexOf(field) > -1;
- }
-
- // 计算æ¯ä¸ªåˆ†ç»„列在æ¯è¡Œçš„ rowspanï¼ˆå¤šçº§ï¼šä¸Šå±‚ä¸€è‡´å‰æä¸‹å†åˆ¤æ–下层)
- var rowspanMap = {};
- for (var c=0;c';
- html += '';
- for (var h=0;h'+esc(hc.title || hc.field || '')+'';
- }
- html += '
';
-
- for (var r=0;r';
- for (var cc=0;cc 0){
- html += ''+esc(list[r][field])+' | ';
- }
- }else{
- html += ''+esc(list[r][field])+' | ';
- }
- }
- html += '';
- }
- html += '';
- return html;
-}
- `,
- },
- },
- {
- tid: `${key}.tableSingleHeader`,
- title: 'å•è¡Œè¡¨å¤´è¡¨æ ¼',
- type: 'table',
- options: {
- title: 'å•è¡Œè¡¨å¤´è¡¨æ ¼',
- field: 'table',
- testData: '',
- width: 180,
- height: 60,
- },
- columns: [
- [
- { title: 'å•å·', field: 'fbillno', width: 55, align: 'left', colspan: 1, rowspan: 1 },
- { title: '物料', field: 'name', width: 75, align: 'left', colspan: 1, rowspan: 1 },
- { title: 'æ•°é‡', field: 'qty', width: 35, align: 'right', colspan: 1, rowspan: 1 },
- { title: '金é¢', field: 'amount', width: 35, align: 'right', colspan: 1, rowspan: 1 },
- ],
- ],
- },
- ];
-
- // åˆ†ç»„ï¼ˆå·¦ä¾§é¢æ¿å±•示更å‹å¥½ï¼‰
- const groups = [
- new (hiprint as any).PrintElementTypeGroup('HttpPrinteré£Žæ ¼ç»„ä»¶', elements),
- ];
-
- context.addPrintElementTypes(key, groups);
- };
-
- return { addElementTypes };
+export interface DesignerSampleData {
+ [key: string]: any;
}
+export interface MultiHeaderColumnConfig {
+ id: string;
+ title: string;
+ field: string;
+ width?: number;
+ align?: 'left' | 'center' | 'right';
+}
+
+export interface MultiHeaderGroupConfig {
+ id: string;
+ title: string;
+ columns: MultiHeaderColumnConfig[];
+}
+
+export const defaultMultiHeaderConfig: MultiHeaderGroupConfig[] = [
+ {
+ id: 'group_base',
+ title: '基础信æ¯',
+ columns: [{ id: 'col_day', title: '日期', field: 'day', width: 80, align: 'center' }],
+ },
+ {
+ id: 'group_qty',
+ title: '产é‡ä¿¡æ¯',
+ columns: [
+ { id: 'col_planQty', title: '计划数', field: 'planQty', width: 90, align: 'right' },
+ { id: 'col_actualQty', title: '实际数', field: 'actualQty', width: 90, align: 'right' },
+ { id: 'col_passRate', title: 'è¾¾æˆçއ', field: 'passRate', width: 90, align: 'center' },
+ ],
+ },
+];
+
+export const defaultTemplateJson = {
+ panels: [
+ {
+ index: 0,
+ paperType: 'A4',
+ height: 297,
+ width: 210,
+ paperHeader: 8,
+ paperFooter: 8,
+ printElements: [
+ {
+ options: {
+ left: 12,
+ top: 10,
+ height: 16,
+ width: 186,
+ title: 'QH-MES生产工å•',
+ textType: 'text',
+ fontSize: 16,
+ fontWeight: '700',
+ textAlign: 'center',
+ },
+ printElementType: {
+ title: '文本',
+ type: 'text',
+ },
+ },
+ ],
+ },
+ ],
+};
+
+export const defaultPrintData: DesignerSampleData = {
+ docNo: 'MO-20260409001',
+ orderNo: 'SO-20260408-003',
+ customerName: 'åŽä¸œç”µå科技',
+ printTime: '2026-04-09 14:30:21',
+ operator: 'å¼ ä¸‰',
+ mainTable: [
+ {
+ materialCode: 'MAT-001',
+ materialName: '主控æ¿',
+ spec: 'A版-24V',
+ qty: 1200,
+ unit: 'PCS',
+ remark: '优先排产',
+ tp: 'TP-MAT-001-20260409',
+ },
+ {
+ materialCode: 'MAT-002',
+ materialName: 'ä¼ æ„Ÿå™¨',
+ spec: 'TH-08',
+ qty: 3000,
+ unit: 'PCS',
+ remark: '',
+ tp: 'TP-MAT-002-20260409',
+ },
+ ],
+ detailList: [
+ {
+ processName: '贴片',
+ machineNo: 'SMT-03',
+ worker: 'æŽå››',
+ startTime: '2026-04-09 08:10',
+ endTime: '2026-04-09 10:45',
+ okQty: 1180,
+ ngQty: 20,
+ tp: 'TP-SMT03-202604090810',
+ },
+ {
+ processName: '贴片',
+ machineNo: 'SMT-03',
+ worker: 'æŽå››',
+ startTime: '2026-04-09 10:50',
+ endTime: '2026-04-09 11:40',
+ okQty: 1210,
+ ngQty: 15,
+ tp: 'TP-SMT03-202604091050',
+ },
+ {
+ processName: '贴片',
+ machineNo: 'SMT-03',
+ worker: 'æŽå››',
+ startTime: '2026-04-09 13:00',
+ endTime: '2026-04-09 14:25',
+ okQty: 1195,
+ ngQty: 18,
+ tp: 'TP-SMT03-202604091300',
+ },
+ {
+ processName: '回æµç„Š',
+ machineNo: 'RF-01',
+ worker: '王五',
+ startTime: '2026-04-09 11:00',
+ endTime: '2026-04-09 12:30',
+ okQty: 1170,
+ ngQty: 10,
+ tp: 'TP-RF01-202604091100',
+ },
+ {
+ processName: '回æµç„Š',
+ machineNo: 'RF-01',
+ worker: '王五',
+ startTime: '2026-04-09 14:30',
+ endTime: '2026-04-09 15:40',
+ okQty: 1220,
+ ngQty: 12,
+ tp: 'TP-RF01-202604091430',
+ },
+ {
+ processName: '回æµç„Š',
+ machineNo: 'RF-01',
+ worker: '王五',
+ startTime: '2026-04-09 15:45',
+ endTime: '2026-04-09 17:10',
+ okQty: 1205,
+ ngQty: 16,
+ tp: 'TP-RF01-202604091545',
+ },
+ {
+ processName: 'æ’ä»¶',
+ machineNo: 'AI-02',
+ worker: 'èµµå…',
+ startTime: '2026-04-10 08:05',
+ endTime: '2026-04-10 09:25',
+ okQty: 980,
+ ngQty: 8,
+ tp: 'TP-AI02-202604100805',
+ },
+ {
+ processName: 'æ’ä»¶',
+ machineNo: 'AI-02',
+ worker: 'èµµå…',
+ startTime: '2026-04-10 09:30',
+ endTime: '2026-04-10 11:00',
+ okQty: 1015,
+ ngQty: 11,
+ tp: 'TP-AI02-202604100930',
+ },
+ {
+ processName: 'æ’ä»¶',
+ machineNo: 'AI-03',
+ worker: 'èµµå…',
+ startTime: '2026-04-10 13:20',
+ endTime: '2026-04-10 14:50',
+ okQty: 990,
+ ngQty: 9,
+ tp: 'TP-AI03-202604101320',
+ },
+ {
+ processName: '测试',
+ machineNo: 'TEST-01',
+ worker: 'å™ä¸ƒ',
+ startTime: '2026-04-10 15:00',
+ endTime: '2026-04-10 16:10',
+ okQty: 950,
+ ngQty: 14,
+ tp: 'TP-TEST01-202604101500',
+ },
+ {
+ processName: '测试',
+ machineNo: 'TEST-01',
+ worker: 'å™ä¸ƒ',
+ startTime: '2026-04-10 16:15',
+ endTime: '2026-04-10 17:25',
+ okQty: 965,
+ ngQty: 10,
+ tp: 'TP-TEST01-202604101615',
+ },
+ {
+ processName: '包装',
+ machineNo: 'PK-01',
+ worker: '周八',
+ startTime: '2026-04-11 08:30',
+ endTime: '2026-04-11 10:00',
+ okQty: 1880,
+ ngQty: 6,
+ tp: 'TP-PK01-202604110830',
+ },
+ {
+ processName: '包装',
+ machineNo: 'PK-01',
+ worker: '周八',
+ startTime: '2026-04-11 10:05',
+ endTime: '2026-04-11 11:40',
+ okQty: 1920,
+ ngQty: 5,
+ tp: 'TP-PK01-202604111005',
+ },
+ ],
+ multiHeaderTable: [
+ { day: '周一', planQty: 600, actualQty: 580, passRate: '96.67%' },
+ { day: '周二', planQty: 620, actualQty: 600, passRate: '96.77%' },
+ { day: '周三', planQty: 640, actualQty: 635, passRate: '99.22%' },
+ ],
+};
+
+export const dragElementList = [
+ { label: '文本', tid: 'defaultModule.text', tip: 'å•行文本' },
+ { label: '长文本', tid: 'defaultModule.longText', tip: '自动æ¢è¡Œæ–‡æœ¬' },
+ { label: '图片', tid: 'defaultModule.image', tip: '支æŒåЍæ€å›¾ç‰‡é“¾æŽ¥' },
+ { label: 'æ¡å½¢ç ', tid: 'defaultModule.barcode', tip: 'å¸¸ç”¨äºŽå•æ®ç¼–ç ' },
+ { label: '二维ç ', tid: 'defaultModule.qrcode', tip: '常用于追溯ç ' },
+ { label: 'è¡¨æ ¼', tid: 'defaultModule.table', tip: '主表或明细表' },
+ { label: '横线', tid: 'defaultModule.hline', tip: '分割线' },
+ { label: '竖线', tid: 'defaultModule.vline', tip: '分割线' },
+ { label: '矩形', tid: 'defaultModule.rect', tip: '区域框选' },
+];
+
+export function resolveProviders(hiprintModule: Record) {
+ const providers: any[] = [];
+ const defaultProviderCtor = hiprintModule?.defaultElementTypeProvider;
+ if (typeof defaultProviderCtor === 'function') {
+ providers.push(new defaultProviderCtor());
+ }
+ return providers;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/index.vue b/jeecgboot-vue3/src/views/print/template/index.vue
index 0707086..f3b365f 100644
--- a/jeecgboot-vue3/src/views/print/template/index.vue
+++ b/jeecgboot-vue3/src/views/print/template/index.vue
@@ -2,7 +2,27 @@
- 新增
+
+
+
+ æ·»åŠ æ‰“å°æœº
+ åˆ·æ–°æ‰“å°æœº
+
+ 新增原生模æ¿
+ 快速打å°
@@ -23,23 +43,238 @@
+
+
+
+
+ æŒ‰æ¨¡æ¿æ ·å¼æ‰“å°ï¼ˆæŽ¨è)
+ Lodopå®žéªŒï¼ˆæ¨¡æ¿æ ·å¼ï¼‰
+ å‰ç«¯è½¬PDFåŽç«¯æ‰“å°
+ æœåŠ¡ç«¯ç›´æ‰“ï¼ˆçº¯æ–‡æœ¬ï¼‰
+
+
+
+
+
+
+ 预览
+
+ 打开「打å°è®¾è®¡å™¨ã€å¹¶è‡ªåŠ¨æ‰§è¡Œä¸Žå·¥å…·æ 「预览ã€ç›¸åŒçš„逻辑(åŒä¸€å¥— hiprint é¢„è§ˆã€æ ·å¼æ³¨å…¥ä¸Žè¡¨æ ¼åˆå¹¶åŽå¤„ç†ï¼‰ï¼Œç¡®ä¿ä¸Žåœ¨è®¾è®¡å™¨å†…预览一致。
+
+
+ 预览(与设计器一致)
+
+
+
+
+
+
+
+
+
+ 模æ¿ï¼ˆæ”¯æŒç¼–å·/åç§°æœç´¢ï¼‰
+
+
+
+
+ æ‰“å°æœº
+
+
+
+
+
æ‰“å°æ•°æ® JSON
+
+
{{ skillJsonError }}
+
+ 填入示例
+ æ ¼å¼åŒ– JSON
+ æ ¡éªŒ JSON
+ 生æˆé¢„览
+ æäº¤åŽç«¯ PDF 打å°
+
+
+
+
预览(与 Lodop 包装一致的 HTML,供确认表头åˆå¹¶ä¸Žçº¸å¼ )
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/lodopLoader.ts b/jeecgboot-vue3/src/views/print/template/lodopLoader.ts
new file mode 100644
index 0000000..cb31a24
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/lodopLoader.ts
@@ -0,0 +1,122 @@
+/**
+ * 动æ€åŠ è½½ C-Lodop 本地æœåŠ¡æä¾›çš„ CLodopfuncs.js。
+ * 仅安装并å¯åЍ C-Lodop å®¢æˆ·ç«¯æ—¶ï¼Œè‹¥é¡µé¢æœªå¼•入该脚本,window 上ä¸ä¼šå‡ºçް getLodop,导致误判「未检测到ã€ã€‚
+ */
+
+function hasLodopGlobal(): boolean {
+ const w = window as any;
+ return typeof w.getLodop === 'function' || !!w.LODOP || !!w.CLODOP;
+}
+
+let scriptIdSeq = 0;
+const urlToScriptId = new Map();
+
+function scriptDomId(url: string): string {
+ let id = urlToScriptId.get(url);
+ if (!id) {
+ id = `qhmes-clodop-script-${++scriptIdSeq}`;
+ urlToScriptId.set(url, id);
+ }
+ return id;
+}
+
+function loadScriptOnce(src: string): Promise {
+ return new Promise((resolve, reject) => {
+ const id = scriptDomId(src);
+ const existed = document.getElementById(id) as HTMLScriptElement | null;
+ if (existed) {
+ if (existed.getAttribute('data-loaded') === '1') {
+ resolve();
+ return;
+ }
+ existed.addEventListener('load', () => resolve(), { once: true });
+ existed.addEventListener(
+ 'error',
+ () => reject(new Error(`åŠ è½½å¤±è´¥: ${src}`)),
+ { once: true },
+ );
+ return;
+ }
+ const s = document.createElement('script');
+ s.id = id;
+ s.src = src;
+ s.async = true;
+ s.setAttribute('data-qhmes-clodop-src', src);
+ s.onload = () => {
+ s.setAttribute('data-loaded', '1');
+ resolve();
+ };
+ s.onerror = () => {
+ s.remove();
+ urlToScriptId.delete(src);
+ reject(new Error(`åŠ è½½å¤±è´¥: ${src}`));
+ };
+ document.head.appendChild(s);
+ });
+}
+
+function removeOurScript(url: string) {
+ const id = urlToScriptId.get(url);
+ if (id) {
+ document.getElementById(id)?.remove();
+ urlToScriptId.delete(url);
+ }
+}
+
+/** 按当å‰é¡µé¢åè®®åˆ—å‡ºå¸¸è§ C-Lodop 脚本地å€ï¼ˆä¸Žå®˜æ–¹æ–‡æ¡£ç«¯å£ä¸€è‡´ï¼‰ */
+function candidateClodopScriptUrls(): string[] {
+ const isHttps = window.location.protocol === 'https:';
+ if (isHttps) {
+ return [
+ 'https://localhost.lodop.net:8443/CLodopfuncs.js',
+ 'https://127.0.0.1:8443/CLodopfuncs.js',
+ // æ··åˆå†…容:HTTPS 页é¢å¯èƒ½æ‹¦æˆªä¸‹åˆ—地å€ï¼Œä»…作兜底å°è¯•
+ 'http://localhost:8000/CLodopfuncs.js',
+ 'http://127.0.0.1:8000/CLodopfuncs.js',
+ ];
+ }
+ return [
+ 'http://localhost:8000/CLodopfuncs.js',
+ 'http://127.0.0.1:8000/CLodopfuncs.js',
+ 'http://localhost:18000/CLodopfuncs.js',
+ 'http://127.0.0.1:18000/CLodopfuncs.js',
+ ];
+}
+
+let loadPromise: Promise | null = null;
+
+/**
+ * ç¡®ä¿å·²åŠ è½½ CLodopfuncs.js(多次调用共享åŒä¸€ Promise;失败åŽå¯é‡è¯•)。
+ */
+export function ensureClodopScriptLoaded(): Promise {
+ if (hasLodopGlobal()) {
+ return Promise.resolve();
+ }
+ if (!loadPromise) {
+ loadPromise = (async () => {
+ let lastError: Error | null = null;
+ for (const url of candidateClodopScriptUrls()) {
+ try {
+ await loadScriptOnce(url);
+ if (hasLodopGlobal()) {
+ return;
+ }
+ lastError = new Error(`å·²åŠ è½½è„šæœ¬ä½†æœªå‘现 getLodop:${url}`);
+ } catch (e: any) {
+ lastError = e instanceof Error ? e : new Error(String(e));
+ }
+ removeOurScript(url);
+ }
+ throw (
+ lastError ||
+ new Error(
+ 'æ— æ³•ä»Žæœ¬æœºåŠ è½½ CLodopfuncs.js。若站点为 HTTPS,请安装 C-Lodop 扩展版并在æµè§ˆå™¨ä¸ä¿¡ä»» https://localhost.lodop.net:8443 è¯ä¹¦åŽé‡è¯•。',
+ )
+ );
+ })().catch((e) => {
+ loadPromise = null;
+ throw e;
+ });
+ }
+ return loadPromise;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/NativePrintDesigner.vue b/jeecgboot-vue3/src/views/print/template/native/NativePrintDesigner.vue
new file mode 100644
index 0000000..c0d18c1
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/NativePrintDesigner.vue
@@ -0,0 +1,1685 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
画布实际 JSONï¼ˆæ¨¡æ¿æ ·å¼ï¼‰
+
+ 从画布生æˆ
+ 应用到画布
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择或拖拽图片到下方区域,系统将生æˆç”»å¸ƒ JSON 与模拟数æ®ï¼›å…ˆé¢„览渲染效果,确认åŽå†åº”用到画布。
+
+
+
+
+
拖拽图片到æ¤å¤„,或
+
点击选择文件
+
+
+
+
{{ imageAnalyzeProgressTip }}
+
大模型分æžå¯èƒ½éœ€è¦æ•°å秒至两分钟,请è€å¿ƒç‰å¾…,勿关é—窗å£ã€‚
+
+
{{ imageAnalyzeHint }}
+
效果预览(应用å‰ï¼‰
+
+
+
原图
+
![ä¸Šä¼ åŽŸå›¾]()
+
+
+
æŒ‰ç”Ÿæˆæ¨¡æ¿æ¸²æŸ“
+
+
+
+
+
+ å–æ¶ˆ
+
+ 应用到画布
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/BindingDetailFieldsEditor.vue b/jeecgboot-vue3/src/views/print/template/native/components/BindingDetailFieldsEditor.vue
new file mode 100644
index 0000000..4dfb154
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/BindingDetailFieldsEditor.vue
@@ -0,0 +1,622 @@
+
+
+
+
æ‰¹é‡æ–°å¢žæ˜Žç»†è¡¨
+
æ‰¹é‡æ–°å¢žå—段
+
+ 批é‡åˆ 除
+
+
+
+
+
+
+ onInlineTableKeyChange(record, String(v ?? ''), index)"
+ />
+
+
+ onInlineTableLabelChange(record.tableKey, String(v ?? ''))"
+ />
+
+
+ {{ (record.fields || []).length }} 个
+
+
+
+
+
+
å—æ®µåˆ—表({{ record.tableKey }})
+
æ·»åŠ å—æ®µ
+
+
+
+
+ onInlineFieldKeyChange(record.tableKey, frec.key, String(v ?? ''))"
+ />
+
+
+ onInlineFieldLabelChange(record.tableKey, frec.key, String(v ?? ''))"
+ />
+
+
+ åˆ é™¤
+
+
+
+
+
+
+
+
+
+
+
快速生æˆ
+
按数é‡è‡ªåŠ¨ç”Ÿæˆï¼Œæ•°æ®æºé”®ä¸º List + æ•°å—,显示å为 列表 + æ•°å—ï¼ˆä¸Žå‚æ•°ä¾§ã€ŒParameter + æ•°å— / 傿•° + æ•°å—ã€å¯¹åº”)。生æˆç»“果在下方列表ä¸ï¼Œå¯å†ä¿®æ”¹ã€‚
+
+ æ•°é‡
+
+ 一键新增
+
+
+
+
+
手动添åŠ
+
æ¯è¡Œä¸¤ä¸ªè¾“å…¥æ¡†ï¼šå·¦ä¾§æ•°æ®æºé”®ï¼Œå³ä¾§æ˜¾ç¤ºå。å¯ç‚¹ã€Œæ·»åŠ ä¸€è¡Œã€å¢žåŠ ç©ºè¡Œã€‚
+
+
æ·»åŠ ä¸€è¡Œ
+
+
+
+
+
+
+
快速生æˆ
+
+ 先选择父级明细表,å†å¡«æ•°é‡ï¼šå—段键为 Field + æ•°å—,显示å为 å—æ®µ + æ•°å—。生æˆç»“æžœè¿½åŠ åˆ°ä¸‹æ–¹ã€Œæ‰‹åŠ¨æ·»åŠ ã€åˆ—表,å¯å†ä¿®æ”¹åŽç‚¹ã€Œç¡®å®šæ·»åŠ ã€ã€‚
+
+
+
+
+ æ•°é‡
+
+ 一键新增
+
+
+
+
+
+
手动添åŠ
+
æ¯è¡Œï¼šçˆ¶çº§æ•°æ®æºé”®ã€å—æ®µé”®ã€æ˜¾ç¤ºå(å¯é€‰ï¼‰ã€‚父级须为已登记的明细表。
+
+
æ·»åŠ ä¸€è¡Œ
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/BindingParamsEditor.vue b/jeecgboot-vue3/src/views/print/template/native/components/BindingParamsEditor.vue
new file mode 100644
index 0000000..ea610c7
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/BindingParamsEditor.vue
@@ -0,0 +1,302 @@
+
+
+
+
æ‰¹é‡æ–°å¢ž
+
+
+ 批é‡åˆ 除
+
+
+
+
+
+ patchParamAt(resolveRowIndex(record, index), 'key', String(v ?? ''))"
+ />
+
+
+ patchParamAt(resolveRowIndex(record, index), 'label', String(v ?? ''))"
+ />
+
+
+
+
+
+
+
快速生æˆ
+
按数é‡è‡ªåŠ¨ç”Ÿæˆï¼Œå‚数键为 Parameter + æ•°å—,显示å为 傿•° + æ•°å—(与键åŽç¼€æ•°å—一致)。生æˆç»“果在下方列表ä¸ï¼Œå¯å†ä¿®æ”¹ã€‚
+
+ æ•°é‡
+
+ 一键新增
+
+
+
+
+
+
+
手动添åŠ
+
æ¯è¡Œä¸¤ä¸ªè¾“å…¥æ¡†ï¼šå·¦ä¾§å‚æ•°é”®ï¼Œå³ä¾§æ˜¾ç¤ºå。å¯ç‚¹ã€Œæ·»åŠ ä¸€è¡Œã€å¢žåŠ ç©ºè¡Œã€‚
+
+
æ·»åŠ ä¸€è¡Œ
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/DesignerCanvas.vue b/jeecgboot-vue3/src/views/print/template/native/components/DesignerCanvas.vue
new file mode 100644
index 0000000..7a11327
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/DesignerCanvas.vue
@@ -0,0 +1,527 @@
+
+
+
+
+
+
+
+
报表头区域
+
+ 报表尾区域
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/ElementWrapper.vue b/jeecgboot-vue3/src/views/print/template/native/components/ElementWrapper.vue
new file mode 100644
index 0000000..16c8c29
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/ElementWrapper.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/FreeTableCellEditModal.vue b/jeecgboot-vue3/src/views/print/template/native/components/FreeTableCellEditModal.vue
new file mode 100644
index 0000000..53624fa
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/FreeTableCellEditModal.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/PageConfigModal.vue b/jeecgboot-vue3/src/views/print/template/native/components/PageConfigModal.vue
new file mode 100644
index 0000000..0b5141e
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/PageConfigModal.vue
@@ -0,0 +1,129 @@
+
+
+
+
çº¸å¼ ä¸Žç½‘æ ¼
+
+
+
+
+
+
+
页é¢è¾¹è·(mm)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/PropertiesPanel.vue b/jeecgboot-vue3/src/views/print/template/native/components/PropertiesPanel.vue
new file mode 100644
index 0000000..2e20e68
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/PropertiesPanel.vue
@@ -0,0 +1,2294 @@
+
+
+
+
+
+
+ å…ƒç´ å±žæ€§
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 布局
+
+
+
+ 外观
+
+
+ æ•°æ®
+
+
+
+ 行为
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ è¡¨æ ¼é…ç½®
+
+
+
+
+
+
+
+ 分组åˆå¹¶
+
+
+
+
+
+
+ 表头
+
+
+
+
+
+
+
+
+
+ 表体
+
+
+
+ æ‰“å¼€ç»‘å®šå—æ®µåˆ—宽设置
+
+
+
+ 底部
+
+
+
+
+
+
+
+
+
+ 多级表头
+
+
+
+ 打开多级表头设置
+
+
+
+
+
+
+
+
+
æŒ‰ç»‘å®šå—æ®µåˆ†åˆ«è®¾ç½®åˆ—宽,修改åŽä¼šå®žæ—¶åŒæ¥åˆ°ç”»å¸ƒã€‚
+
+
+
+ 列{{ idx + 1 }}
+ {{ col.title || col.key }}
+
+
+
+
+
+
+
+
+
+ 当å‰åˆ—属性(åŒå‡»è¡¨å¤´é€‰æ‹©åˆ—)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 左对é½
+ å±…ä¸
+ å³å¯¹é½
+
+
+
+
+
+ åˆ é™¤å½“å‰åˆ—
+
+
+
新增列
+
+
+
+
+
+
+
+ è‡ªç”±è¡¨æ ¼
+
+ åˆå¹¶ï¼šå…ˆç‚¹å‡»èµ·å§‹æ ¼ï¼Œå†æŒ‰ä½ Shift ç‚¹å‡»ç»“æŸæ ¼ï¼Œç„¶åŽç‚¹ã€Œåˆå¹¶é€‰ä¸åŒºåŸŸã€ã€‚
+
+
+ 新增行
+ åˆ é™¤è¡Œ
+ 新增列
+ åˆ é™¤åˆ—
+
+ å•å…ƒæ ¼åˆå¹¶
+ åˆå¹¶é€‰ä¸åŒºåŸŸ
+ 拆分当å‰åˆå¹¶
+
+
+
+ è¡¨æ ¼æ ·å¼
+
+ å¤–è¾¹æ¡†æŽ§åˆ¶æ•´å¼ è¡¨æœ€å¤–ä¸€åœˆï¼›å†…è¾¹æ¡†æŽ§åˆ¶è¡Œé—´æ¨ªçº¿ã€åˆ—间竖线。选ä¸å•å…ƒæ ¼åŽå¯åœ¨ä¸‹æ–¹å•独éšè—è¯¥æ ¼æŸä¸€ä¾§è¾¹æ¡†ã€‚
+
+
+
+
外框线型
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+
+
横线线型
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+
+
竖线线型
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+ 外边框(显示)
+
+ 内边框(显示)
+
+
+
+
+
+
+
+ è¡¨æ ¼è®¾ç½®
+
+
+ 列宽总和ç‰äºŽå…ƒç´ 宽度ã€è¡Œé«˜æ€»å’Œç‰äºŽå…ƒç´ 高度(å•ä½ mm)。输入æŸä¸€åˆ—/行时会与相邻列/行自动补å¿ï¼›ä¹Ÿå¯åœ¨ç”»å¸ƒä¸æ‹–动è“色分隔线调整。
+
+
+ å‡åˆ†åˆ—宽
+ å‡åˆ†è¡Œé«˜
+
+ 列宽(mm)
+
+ 行高(mm)
+
+
+
+
+ 当å‰å•å…ƒæ ¼ï¼ˆç‚¹å‡»ç”»å¸ƒå•å…ƒæ ¼åŽç¼–辑)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ å•å…ƒæ ¼è¾¹çº¿ï¼ˆéšè—)
+ 以下为当å‰é”šç‚¹æ ¼ï¼ˆå«åˆå¹¶åŒºåŸŸï¼‰å•独éšè—æŸä¾§è¾¹æ¡†ï¼Œä¸Žã€Œè¡¨æ ¼æ ·å¼ã€ä¸çš„外框/内线å åŠ ç”Ÿæ•ˆã€‚
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/TableHeaderConfigEditor.vue b/jeecgboot-vue3/src/views/print/template/native/components/TableHeaderConfigEditor.vue
new file mode 100644
index 0000000..cfa8bb8
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/TableHeaderConfigEditor.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/ToolbarPalette.vue b/jeecgboot-vue3/src/views/print/template/native/components/ToolbarPalette.vue
new file mode 100644
index 0000000..dae47b8
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/ToolbarPalette.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/BarcodeElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/BarcodeElement.vue
new file mode 100644
index 0000000..df3fda5
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/BarcodeElement.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/FreeTableElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/FreeTableElement.vue
new file mode 100644
index 0000000..f258753
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/FreeTableElement.vue
@@ -0,0 +1,679 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ≡
+
+ {{ resolveCellTextForAnchor(cell) }}
+
+ {{ formatFreeCellNumeric(cell) }}
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/ImageElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/ImageElement.vue
new file mode 100644
index 0000000..b8adb13
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/ImageElement.vue
@@ -0,0 +1,51 @@
+
+
+
![]()
+
图片
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/QrcodeElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/QrcodeElement.vue
new file mode 100644
index 0000000..ac6b0ca
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/QrcodeElement.vue
@@ -0,0 +1,60 @@
+
+
+
![qrcode]()
+
二维ç
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/TableElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/TableElement.vue
new file mode 100644
index 0000000..b08cbf7
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/TableElement.vue
@@ -0,0 +1,747 @@
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+ {{ cell.title }}
+
+
+ |
+
+
+
+
+ |
+ 第 {{ item.pageNo }} 页起始
+ |
+
+
+
+ {{ formatNumericValue(resolveFooterTotalByRange(col, item.start, item.end), col) }}
+
+ {{ footerLabelText }}
+ |
+
+
+
+
+
+ {{ resolveCellValue(item.row, col.bindField || col.field) }}
+
+
+ {{ formatNumericValue(resolveCellValue(item.row, col.bindField || col.field), col) }}
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/components/elements/TextElement.vue b/jeecgboot-vue3/src/views/print/template/native/components/elements/TextElement.vue
new file mode 100644
index 0000000..72bc1ee
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/components/elements/TextElement.vue
@@ -0,0 +1,55 @@
+
+
+ {{ displayText }}
+
+
+
+
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/dragResize.ts b/jeecgboot-vue3/src/views/print/template/native/core/dragResize.ts
new file mode 100644
index 0000000..1dec10b
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/dragResize.ts
@@ -0,0 +1,59 @@
+interface Rect {
+ x: number;
+ y: number;
+ w: number;
+ h: number;
+}
+
+type Direction = 'n' | 's' | 'w' | 'e' | 'nw' | 'ne' | 'sw' | 'se';
+
+const MIN_SIZE = 6;
+
+function clamp(value: number, min: number, max: number) {
+ return Math.min(max, Math.max(min, value));
+}
+
+function roundToGrid(value: number, gridSize: number) {
+ if (!gridSize || gridSize <= 1) return value;
+ return Math.round(value / gridSize) * gridSize;
+}
+
+export function calcDragRect(
+ startRect: Rect,
+ pageSize: { width: number; height: number },
+ deltaX: number,
+ deltaY: number,
+ gridSize: number,
+) {
+ const x = clamp(roundToGrid(startRect.x + deltaX, gridSize), 0, pageSize.width - startRect.w);
+ const y = clamp(roundToGrid(startRect.y + deltaY, gridSize), 0, pageSize.height - startRect.h);
+ return { ...startRect, x, y };
+}
+
+export function calcResizeRect(
+ direction: Direction,
+ startRect: Rect,
+ pageSize: { width: number; height: number },
+ deltaX: number,
+ deltaY: number,
+ gridSize: number,
+) {
+ const next = { ...startRect };
+ if (direction.includes('e')) {
+ next.w = clamp(roundToGrid(startRect.w + deltaX, gridSize), MIN_SIZE, pageSize.width - startRect.x);
+ }
+ if (direction.includes('s')) {
+ next.h = clamp(roundToGrid(startRect.h + deltaY, gridSize), MIN_SIZE, pageSize.height - startRect.y);
+ }
+ if (direction.includes('w')) {
+ const newX = clamp(roundToGrid(startRect.x + deltaX, gridSize), 0, startRect.x + startRect.w - MIN_SIZE);
+ next.w = clamp(roundToGrid(startRect.w + (startRect.x - newX), gridSize), MIN_SIZE, pageSize.width - newX);
+ next.x = newX;
+ }
+ if (direction.includes('n')) {
+ const newY = clamp(roundToGrid(startRect.y + deltaY, gridSize), 0, startRect.y + startRect.h - MIN_SIZE);
+ next.h = clamp(roundToGrid(startRect.h + (startRect.y - newY), gridSize), MIN_SIZE, pageSize.height - newY);
+ next.y = newY;
+ }
+ return next;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/fontOptions.ts b/jeecgboot-vue3/src/views/print/template/native/core/fontOptions.ts
new file mode 100644
index 0000000..1a895ad
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/fontOptions.ts
@@ -0,0 +1,19 @@
+import '@fontsource/noto-sans-sc/400.css';
+import '@fontsource/noto-sans-sc/700.css';
+import '@fontsource/noto-serif-sc/400.css';
+import '@fontsource/noto-serif-sc/700.css';
+import '@fontsource/roboto/400.css';
+import '@fontsource/roboto/700.css';
+import '@fontsource/open-sans/400.css';
+import '@fontsource/open-sans/700.css';
+
+export const TABLE_FONT_OPTIONS = [
+ { label: '默认å—体', value: '' },
+ { label: 'Noto Sans SCï¼ˆæ€æºé»‘体)', value: '"Noto Sans SC", sans-serif' },
+ { label: 'Noto Serif SCï¼ˆæ€æºå®‹ä½“)', value: '"Noto Serif SC", serif' },
+ { label: 'Roboto', value: 'Roboto, sans-serif' },
+ { label: 'Open Sans', value: '"Open Sans", sans-serif' },
+ { label: 'Microsoft YaHei(微软雅黑)', value: '"Microsoft YaHei", sans-serif' },
+ { label: 'SimSun(宋体)', value: 'SimSun, serif' },
+ { label: 'SimHei(黑体)', value: 'SimHei, sans-serif' },
+];
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/freeTableBorders.ts b/jeecgboot-vue3/src/views/print/template/native/core/freeTableBorders.ts
new file mode 100644
index 0000000..38b0b4a
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/freeTableBorders.ts
@@ -0,0 +1,143 @@
+/**
+ * è‡ªç”±è¡¨æ ¼ï¼šå¤–æ¡†/内线与å•å…ƒæ ¼å•è¾¹éšè— → 四边是å¦ç»˜åˆ¶è¾¹æ¡†
+ */
+
+import { lineStyleKeyToCssBorderStyle } from './freeTableLineStyles';
+import { getFreeTableOwnerAt, type FreeTableAnchorCell } from './freeTableGrid';
+
+export interface FreeTableBorderSides {
+ top: boolean;
+ right: boolean;
+ bottom: boolean;
+ left: boolean;
+}
+
+/** è¡¨æ ¼å¤–è½®å»“å››è¾¹ï¼Œç¼ºçœå‡ä¸ºæ˜¾ç¤º */
+export function resolveOuterBorderFlags(el: { outerBorder?: Record } | null | undefined): FreeTableBorderSides {
+ const o = el?.outerBorder;
+ return {
+ top: o?.top !== false,
+ right: o?.right !== false,
+ bottom: o?.bottom !== false,
+ left: o?.left !== false,
+ };
+}
+
+/** å†…éƒ¨ç½‘æ ¼çº¿ï¼šæ¨ªå‘(行间)ã€çºµå‘(列间),缺çœå‡ä¸ºæ˜¾ç¤º */
+export function resolveInnerBorderFlags(el: { innerBorder?: { horizontal?: boolean; vertical?: boolean } } | null | undefined): {
+ horizontal: boolean;
+ vertical: boolean;
+} {
+ const i = el?.innerBorder;
+ return {
+ horizontal: i?.horizontal !== false,
+ vertical: i?.vertical !== false,
+ };
+}
+
+/**
+ * 计算锚点å•å…ƒæ ¼ï¼ˆå«åˆå¹¶ï¼‰å››è¾¹æ˜¯å¦ç”»çº¿ã€‚
+ * å…±äº«è¾¹ï¼šè‹¥æœ¬æ ¼æˆ–ç›¸é‚»æ ¼ä»»ä¸€ä¾§å£°æ˜Žéšè—ï¼ˆå¦‚ä¸Šæ ¼çš„ bottom ä¸Žæœ¬æ ¼çš„ top),则两边都ä¸ç”»ï¼Œé¿å…预览/打å°ä»ç•™çº¿ã€‚
+ */
+export function resolveFreeTableCellBorderSides(
+ el: any,
+ anchors: FreeTableAnchorCell[],
+ cell: any,
+ anchorRow: number,
+ anchorCol: number,
+ rs: number,
+ cs: number,
+ rowCount: number,
+ colCount: number,
+): FreeTableBorderSides {
+ const outer = resolveOuterBorderFlags(el);
+ const inner = resolveInnerBorderFlags(el);
+ const rEnd = anchorRow + rs - 1;
+ const cEnd = anchorCol + cs - 1;
+
+ let top = anchorRow === 0 ? outer.top : inner.horizontal;
+ let right = cEnd === colCount - 1 ? outer.right : inner.vertical;
+ let bottom = rEnd === rowCount - 1 ? outer.bottom : inner.horizontal;
+ let left = anchorCol === 0 ? outer.left : inner.vertical;
+
+ if (cell?.hideBorderTop === true) {
+ top = false;
+ }
+ if (cell?.hideBorderRight === true) {
+ right = false;
+ }
+ if (cell?.hideBorderBottom === true) {
+ bottom = false;
+ }
+ if (cell?.hideBorderLeft === true) {
+ left = false;
+ }
+
+ // ä¸Žä¸Šæ–¹æ ¼å…±äº«æ¨ªçº¿ï¼šå¯¹æ–¹ hideBorderBottom åˆ™æœ¬æ ¼ä¹Ÿä¸ç”»ä¸Šè¾¹
+ if (top && anchorRow > 0) {
+ for (let cc = anchorCol; cc <= anchorCol + cs - 1; cc += 1) {
+ const up = getFreeTableOwnerAt(anchors, anchorRow - 1, cc);
+ if (up?.hideBorderBottom === true) {
+ top = false;
+ break;
+ }
+ }
+ }
+ // ä¸Žä¸‹æ–¹æ ¼å…±äº«æ¨ªçº¿
+ if (bottom && rEnd < rowCount - 1) {
+ const belowRow = anchorRow + rs;
+ for (let cc = anchorCol; cc <= anchorCol + cs - 1; cc += 1) {
+ const dn = getFreeTableOwnerAt(anchors, belowRow, cc);
+ if (dn?.hideBorderTop === true) {
+ bottom = false;
+ break;
+ }
+ }
+ }
+ // ä¸Žå·¦ä¾§æ ¼å…±äº«ç«–çº¿
+ if (left && anchorCol > 0) {
+ for (let rr = anchorRow; rr <= anchorRow + rs - 1; rr += 1) {
+ const lf = getFreeTableOwnerAt(anchors, rr, anchorCol - 1);
+ if (lf?.hideBorderRight === true) {
+ left = false;
+ break;
+ }
+ }
+ }
+ // 与å³ä¾§æ ¼å…±äº«ç«–线
+ if (right && cEnd < colCount - 1) {
+ const rightCol = anchorCol + cs;
+ for (let rr = anchorRow; rr <= anchorRow + rs - 1; rr += 1) {
+ const rt = getFreeTableOwnerAt(anchors, rr, rightCol);
+ if (rt?.hideBorderLeft === true) {
+ right = false;
+ break;
+ }
+ }
+ }
+
+ return { top, right, bottom, left };
+}
+
+/** å„边线型(外框线 / 横线 / 竖线),缺çœå‡ä¸º solid */
+export interface FreeTableSideLineStyleKeys {
+ top: string;
+ right: string;
+ bottom: string;
+ left: string;
+}
+
+export function borderSidesToCssFragment(
+ sides: FreeTableBorderSides,
+ bw: number,
+ color: string,
+ lineStyles?: FreeTableSideLineStyleKeys | null,
+): string {
+ const css = (side: keyof FreeTableBorderSides) =>
+ lineStyles ? lineStyleKeyToCssBorderStyle(lineStyles[side]) : 'solid';
+ const t = sides.top ? `${bw}px ${css('top')} ${color}` : 'none';
+ const r = sides.right ? `${bw}px ${css('right')} ${color}` : 'none';
+ const b = sides.bottom ? `${bw}px ${css('bottom')} ${color}` : 'none';
+ const l = sides.left ? `${bw}px ${css('left')} ${color}` : 'none';
+ return `border-top:${t};border-right:${r};border-bottom:${b};border-left:${l};`;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/freeTableGrid.ts b/jeecgboot-vue3/src/views/print/template/native/core/freeTableGrid.ts
new file mode 100644
index 0000000..18041f1
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/freeTableGrid.ts
@@ -0,0 +1,312 @@
+/**
+ * è‡ªç”±è¡¨æ ¼ï¼šé”šç‚¹å•å…ƒæ ¼ + rowspan/colspan,与 HTML table 一致
+ */
+
+export interface FreeTableAnchorCell {
+ row: number;
+ col: number;
+ rowspan: number;
+ colspan: number;
+ text?: string;
+ bindField?: string;
+ contentType?: 'text' | 'image' | 'qrcode' | 'barcode' | 'number' | 'amount';
+ fillCell?: boolean;
+ contentScale?: number;
+ imageFit?: 'fill' | 'contain' | 'cover';
+ qrLevel?: 'L' | 'M' | 'Q' | 'H';
+ qrRenderType?: 'image/png' | 'image/jpeg' | 'image/webp';
+ barcodeFormat?: string;
+ decimalPlaces?: number;
+ roundHalfUp?: boolean;
+ amountType?: 'CNY' | 'USD' | 'EUR';
+ autoWrap?: boolean;
+ autoFitFont?: boolean;
+ align?: string;
+ verticalAlign?: string;
+ fontSize?: number;
+ color?: string;
+ backgroundColor?: string;
+ hideBorderTop?: boolean;
+ hideBorderRight?: boolean;
+ hideBorderBottom?: boolean;
+ hideBorderLeft?: boolean;
+}
+
+const FREE_CELL_CONTENT_TYPES = new Set(['text', 'image', 'qrcode', 'barcode', 'number', 'amount']);
+
+function parseCell(c: any): FreeTableAnchorCell {
+ const row = {
+ row: Math.max(0, Number(c?.row || 0)),
+ col: Math.max(0, Number(c?.col || 0)),
+ rowspan: Math.max(1, Number(c?.rowspan || 1)),
+ colspan: Math.max(1, Number(c?.colspan || 1)),
+ text: String(c?.text ?? ''),
+ bindField: String(c?.bindField ?? ''),
+ align: String(c?.align || 'left'),
+ verticalAlign: String(c?.verticalAlign || 'middle'),
+ fontSize: Math.max(8, Number(c?.fontSize || 12)),
+ color: String(c?.color || '#111111'),
+ backgroundColor: String(c?.backgroundColor || '#ffffff'),
+ } as FreeTableAnchorCell;
+ const ct = String(c?.contentType || '').trim();
+ if (ct && FREE_CELL_CONTENT_TYPES.has(ct)) {
+ row.contentType = ct as FreeTableAnchorCell['contentType'];
+ }
+ if (typeof c?.fillCell === 'boolean') {
+ row.fillCell = c.fillCell;
+ }
+ if (c?.contentScale != null && Number.isFinite(Number(c.contentScale))) {
+ row.contentScale = Number(c.contentScale);
+ }
+ if (c?.imageFit === 'fill' || c?.imageFit === 'contain' || c?.imageFit === 'cover') {
+ row.imageFit = c.imageFit;
+ }
+ if (c?.qrLevel === 'L' || c?.qrLevel === 'M' || c?.qrLevel === 'Q' || c?.qrLevel === 'H') {
+ row.qrLevel = c.qrLevel;
+ }
+ if (c?.qrRenderType === 'image/png' || c?.qrRenderType === 'image/jpeg' || c?.qrRenderType === 'image/webp') {
+ row.qrRenderType = c.qrRenderType;
+ }
+ if (c?.barcodeFormat != null && String(c.barcodeFormat).trim()) {
+ row.barcodeFormat = String(c.barcodeFormat).trim();
+ }
+ if (c?.decimalPlaces != null && Number.isFinite(Number(c.decimalPlaces))) {
+ row.decimalPlaces = Number(c.decimalPlaces);
+ }
+ if (typeof c?.roundHalfUp === 'boolean') {
+ row.roundHalfUp = c.roundHalfUp;
+ }
+ if (c?.amountType === 'CNY' || c?.amountType === 'USD' || c?.amountType === 'EUR') {
+ row.amountType = c.amountType;
+ }
+ if (typeof c?.autoWrap === 'boolean') {
+ row.autoWrap = c.autoWrap;
+ }
+ if (typeof c?.autoFitFont === 'boolean') {
+ row.autoFitFont = c.autoFitFont;
+ }
+ if (c?.hideBorderTop === true) row.hideBorderTop = true;
+ if (c?.hideBorderRight === true) row.hideBorderRight = true;
+ if (c?.hideBorderBottom === true) row.hideBorderBottom = true;
+ if (c?.hideBorderLeft === true) row.hideBorderLeft = true;
+ return row;
+}
+
+export function defaultFreeTableCell(row: number, col: number): FreeTableAnchorCell {
+ return {
+ row,
+ col,
+ rowspan: 1,
+ colspan: 1,
+ text: '',
+ bindField: '',
+ align: 'left',
+ verticalAlign: 'middle',
+ fontSize: 12,
+ color: '#111111',
+ backgroundColor: '#ffffff',
+ };
+}
+
+/** å°† cells 规范为互ä¸é‡å çš„é”šç‚¹åˆ—è¡¨ï¼Œå¹¶å¡«æ»¡ç½‘æ ¼ä¸æœªè¦†ç›–çš„ 1x1 é»˜è®¤æ ¼ */
+export function normalizeFreeTableAnchors(rowCount: number, colCount: number, cellsInput: any[]): FreeTableAnchorCell[] {
+ const occ: boolean[][] = Array.from({ length: rowCount }, () => Array.from({ length: colCount }, () => false));
+ const anchors: FreeTableAnchorCell[] = [];
+ const parsed = (cellsInput || []).map(parseCell).sort((a, b) => a.row - b.row || a.col - b.col);
+
+ for (const c of parsed) {
+ const rs = Math.min(c.rowspan, rowCount - c.row);
+ const cs = Math.min(c.colspan, colCount - c.col);
+ if (rs < 1 || cs < 1 || c.row >= rowCount || c.col >= colCount) continue;
+ let overlap = false;
+ for (let dr = 0; dr < rs && !overlap; dr += 1) {
+ for (let dc = 0; dc < cs && !overlap; dc += 1) {
+ const r = c.row + dr;
+ const cc = c.col + dc;
+ if (r >= rowCount || cc >= colCount || occ[r][cc]) {
+ overlap = true;
+ }
+ }
+ }
+ if (overlap) continue;
+ for (let dr = 0; dr < rs; dr += 1) {
+ for (let dc = 0; dc < cs; dc += 1) {
+ occ[c.row + dr][c.col + dc] = true;
+ }
+ }
+ anchors.push({ ...c, rowspan: rs, colspan: cs });
+ }
+
+ for (let r = 0; r < rowCount; r += 1) {
+ for (let c = 0; c < colCount; c += 1) {
+ if (!occ[r][c]) {
+ occ[r][c] = true;
+ anchors.push(defaultFreeTableCell(r, c));
+ }
+ }
+ }
+
+ anchors.sort((a, b) => a.row - b.row || a.col - b.col);
+ return anchors;
+}
+
+export function getFreeTableOwnerAt(anchors: FreeTableAnchorCell[], r: number, c: number): FreeTableAnchorCell {
+ for (const cell of anchors) {
+ const rs = Math.max(1, Number(cell.rowspan || 1));
+ const cs = Math.max(1, Number(cell.colspan || 1));
+ if (r >= cell.row && r < cell.row + rs && c >= cell.col && c < cell.col + cs) {
+ return cell;
+ }
+ }
+ return defaultFreeTableCell(r, c);
+}
+
+/** 矩形区域内是å¦å‡ä¸º 1x1 独立锚点(å¯åˆå¹¶ï¼‰ */
+export function canMergeFreeTableRegion(
+ anchors: FreeTableAnchorCell[],
+ rowCount: number,
+ colCount: number,
+ r0: number,
+ c0: number,
+ r1: number,
+ c1: number,
+): boolean {
+ const rr0 = Math.min(r0, r1);
+ const rr1 = Math.max(r0, r1);
+ const cc0 = Math.min(c0, c1);
+ const cc1 = Math.max(c0, c1);
+ if (rr0 < 0 || cc0 < 0 || rr1 >= rowCount || cc1 >= colCount) return false;
+ for (let r = rr0; r <= rr1; r += 1) {
+ for (let c = cc0; c <= cc1; c += 1) {
+ const o = getFreeTableOwnerAt(anchors, r, c);
+ const rs = Math.max(1, Number(o.rowspan || 1));
+ const cs = Math.max(1, Number(o.colspan || 1));
+ if (o.row !== r || o.col !== c) return false;
+ if (rs !== 1 || cs !== 1) return false;
+ }
+ }
+ return (rr1 - rr0 + 1) * (cc1 - cc0 + 1) > 1;
+}
+
+export function mergeFreeTableRegion(
+ anchors: FreeTableAnchorCell[],
+ rowCount: number,
+ colCount: number,
+ r0: number,
+ c0: number,
+ r1: number,
+ c1: number,
+): FreeTableAnchorCell[] {
+ const rr0 = Math.min(r0, r1);
+ const rr1 = Math.max(r0, r1);
+ const cc0 = Math.min(c0, c1);
+ const cc1 = Math.max(c0, c1);
+ if (!canMergeFreeTableRegion(anchors, rowCount, colCount, rr0, cc0, rr1, cc1)) {
+ return anchors;
+ }
+ const survivor = { ...getFreeTableOwnerAt(anchors, rr0, cc0) };
+ const next = anchors.filter((cell) => {
+ const r = cell.row;
+ const c = cell.col;
+ return r < rr0 || r > rr1 || c < cc0 || c > cc1;
+ });
+ survivor.row = rr0;
+ survivor.col = cc0;
+ survivor.rowspan = rr1 - rr0 + 1;
+ survivor.colspan = cc1 - cc0 + 1;
+ next.push(survivor);
+ next.sort((a, b) => a.row - b.row || a.col - b.col);
+ return next;
+}
+
+export function splitFreeTableAt(anchors: FreeTableAnchorCell[], rowCount: number, colCount: number, r: number, c: number): FreeTableAnchorCell[] {
+ const owner = getFreeTableOwnerAt(anchors, r, c);
+ const rs = Math.max(1, Number(owner.rowspan || 1));
+ const cs = Math.max(1, Number(owner.colspan || 1));
+ if (rs === 1 && cs === 1) {
+ return anchors;
+ }
+ const next = anchors.filter((cell) => !(cell.row === owner.row && cell.col === owner.col));
+ for (let dr = 0; dr < rs; dr += 1) {
+ for (let dc = 0; dc < cs; dc += 1) {
+ const nr = owner.row + dr;
+ const nc = owner.col + dc;
+ if (nr >= rowCount || nc >= colCount) continue;
+ if (dr === 0 && dc === 0) {
+ next.push({
+ ...defaultFreeTableCell(nr, nc),
+ ...(pickSwapPayload(owner) as any),
+ } as FreeTableAnchorCell);
+ } else {
+ next.push(defaultFreeTableCell(nr, nc));
+ }
+ }
+ }
+ next.sort((a, b) => a.row - b.row || a.col - b.col);
+ return next;
+}
+
+function pickSwapPayload(cell: FreeTableAnchorCell) {
+ const raw: Record = {
+ text: String(cell?.text ?? ''),
+ bindField: String(cell?.bindField ?? ''),
+ contentType: cell.contentType || 'text',
+ fillCell: cell.fillCell,
+ contentScale: cell.contentScale,
+ imageFit: cell.imageFit,
+ qrLevel: cell.qrLevel,
+ qrRenderType: cell.qrRenderType,
+ barcodeFormat: cell.barcodeFormat,
+ decimalPlaces: cell.decimalPlaces,
+ roundHalfUp: cell.roundHalfUp,
+ amountType: cell.amountType,
+ autoWrap: cell.autoWrap,
+ autoFitFont: cell.autoFitFont,
+ align: String(cell?.align || 'left'),
+ verticalAlign: String(cell?.verticalAlign || 'middle'),
+ fontSize: Math.max(8, Number(cell?.fontSize || 12)),
+ color: String(cell?.color || '#111111'),
+ backgroundColor: String(cell?.backgroundColor || '#ffffff'),
+ hideBorderTop: cell.hideBorderTop === true ? true : undefined,
+ hideBorderRight: cell.hideBorderRight === true ? true : undefined,
+ hideBorderBottom: cell.hideBorderBottom === true ? true : undefined,
+ hideBorderLeft: cell.hideBorderLeft === true ? true : undefined,
+ };
+ return Object.fromEntries(Object.entries(raw).filter(([, v]) => v !== undefined)) as Record;
+}
+
+/** 交æ¢ä¸¤ä¸ªé”šç‚¹æ ¼çš„å¯äº¤æ¢å—æ®µï¼ˆä¸æ”¹å˜ rowspan/colspan) */
+export function swapFreeTableOwnerPayloads(
+ anchors: FreeTableAnchorCell[],
+ rowCount: number,
+ colCount: number,
+ fromRow: number,
+ fromCol: number,
+ toRow: number,
+ toCol: number,
+): FreeTableAnchorCell[] {
+ const a = getFreeTableOwnerAt(anchors, fromRow, fromCol);
+ const b = getFreeTableOwnerAt(anchors, toRow, toCol);
+ if (a.row === b.row && a.col === b.col) return anchors;
+ const pa = pickSwapPayload(a);
+ const pb = pickSwapPayload(b);
+ return anchors.map((cell) => {
+ if (cell.row === a.row && cell.col === a.col) {
+ return { ...cell, ...pb };
+ }
+ if (cell.row === b.row && cell.col === b.col) {
+ return { ...cell, ...pa };
+ }
+ return { ...cell };
+ });
+}
+
+/** åˆ é™¤/改维度å‰ï¼šåŽ»æŽ‰è¶Šç•Œçš„é”šç‚¹ */
+export function clipAnchorsToGrid(rowCount: number, colCount: number, cellsInput: any[]): FreeTableAnchorCell[] {
+ const list = (cellsInput || []).map(parseCell);
+ return list.filter((c) => {
+ const rs = Math.max(1, Number(c.rowspan || 1));
+ const cs = Math.max(1, Number(c.colspan || 1));
+ return c.row >= 0 && c.col >= 0 && c.row + rs <= rowCount && c.col + cs <= colCount;
+ });
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/freeTableLineStyles.ts b/jeecgboot-vue3/src/views/print/template/native/core/freeTableLineStyles.ts
new file mode 100644
index 0000000..660407f
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/freeTableLineStyles.ts
@@ -0,0 +1,57 @@
+/**
+ * è‡ªç”±è¡¨æ ¼ï¼šå¤–æ¡†çº¿ / 行间横线 / 列间竖线 çš„çº¿åž‹ï¼ˆä¸Žå±žæ€§é¢æ¿ã€ç”»å¸ƒã€æ‰“å° HTML 共用)
+ */
+
+export type FreeTableLineStyleKey = 'solid' | 'dashed' | 'dotted' | 'dash_dot' | 'double_dash_dot';
+
+export const FREE_TABLE_LINE_STYLE_OPTIONS: { value: FreeTableLineStyleKey; label: string }[] = [
+ { value: 'solid', label: '实线' },
+ { value: 'dashed', label: '段线' },
+ { value: 'dotted', label: '虚线' },
+ { value: 'dash_dot', label: '点划线' },
+ { value: 'double_dash_dot', label: 'åŒç‚¹åˆ’线' },
+];
+
+const LINE_STYLE_SET = new Set(FREE_TABLE_LINE_STYLE_OPTIONS.map((o) => o.value));
+
+export function normalizeFreeTableLineStyleKey(raw: unknown): FreeTableLineStyleKey {
+ const s = String(raw || 'solid');
+ return LINE_STYLE_SET.has(s as FreeTableLineStyleKey) ? (s as FreeTableLineStyleKey) : 'solid';
+}
+
+/**
+ * å°†çº¿åž‹æ˜ å°„ä¸º CSS border-style(点划/åŒç‚¹åˆ’åœ¨æ ‡å‡†è¾¹æ¡†ä¸ä»¥æœ€æŽ¥è¿‘çš„æ ·å¼è¿‘似)
+ */
+export function lineStyleKeyToCssBorderStyle(key: FreeTableLineStyleKey | string | undefined): string {
+ const k = normalizeFreeTableLineStyleKey(key);
+ if (k === 'dashed') return 'dashed';
+ if (k === 'dotted') return 'dotted';
+ if (k === 'dash_dot') return 'dashed';
+ if (k === 'double_dash_dot') return 'double';
+ return 'solid';
+}
+
+/**
+ * æ ¹æ®å•å…ƒæ ¼ä½ç½®åˆ¤æ–æ¯æ¡å¯è§è¾¹å±žäºŽå¤–框还是内线,返回å„边应使用的线型键(与 resolveFreeTableCellBorderSides å‡ ä½•ä¸€è‡´ï¼‰
+ */
+export function resolveFreeTableCellLineStyleKeys(
+ el: any,
+ anchorRow: number,
+ anchorCol: number,
+ rs: number,
+ cs: number,
+ rowCount: number,
+ colCount: number,
+): { top: FreeTableLineStyleKey; right: FreeTableLineStyleKey; bottom: FreeTableLineStyleKey; left: FreeTableLineStyleKey } {
+ const rEnd = anchorRow + rs - 1;
+ const cEnd = anchorCol + cs - 1;
+ const outerStyle = normalizeFreeTableLineStyleKey(el?.outerBorderLineStyle);
+ const hStyle = normalizeFreeTableLineStyleKey(el?.innerBorderHorizontalLineStyle);
+ const vStyle = normalizeFreeTableLineStyleKey(el?.innerBorderVerticalLineStyle);
+ return {
+ top: anchorRow === 0 ? outerStyle : hStyle,
+ right: cEnd === colCount - 1 ? outerStyle : vStyle,
+ bottom: rEnd === rowCount - 1 ? outerStyle : hStyle,
+ left: anchorCol === 0 ? outerStyle : vStyle,
+ };
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/freeTableTracks.ts b/jeecgboot-vue3/src/views/print/template/native/core/freeTableTracks.ts
new file mode 100644
index 0000000..f7829d6
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/freeTableTracks.ts
@@ -0,0 +1,223 @@
+/**
+ * è‡ªç”±è¡¨æ ¼ï¼šåˆ—å®½ã€è¡Œé«˜ï¼ˆå•ä½ mmï¼‰ï¼Œä¸Žå…ƒç´ w/h 总和一致
+ */
+
+export const MIN_FREE_TABLE_TRACK_MM = 4;
+
+export function round2(n: number): number {
+ return Math.round(n * 100) / 100;
+}
+
+/** å‡åˆ†æ€»å°ºå¯¸ï¼ˆå†…部用于åˆå§‹åŒ–) */
+export function evenSplitTracks(totalMm: number, count: number): number[] {
+ const n = Math.max(1, count);
+ const t = Math.max(0.01, Number(totalMm) || 0.01);
+ const base = round2(t / n);
+ const arr = Array.from({ length: n }, () => base);
+ const sum = arr.reduce((a, b) => a + b, 0);
+ arr[n - 1] = round2(arr[n - 1] + (t - sum));
+ return arr;
+}
+
+/** å°†å„轨é“缩放到总和 = totalMm,且æ¯é¡¹ä¸å°äºŽ minMm */
+export function clampTrackSumToTotal(tracks: number[], totalMm: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ const n = tracks.length;
+ if (n === 0) return [];
+ const t = Math.max(0.01, Number(totalMm) || 0.01);
+ let next = tracks.map((x) => round2(Math.max(minMm, Number(x) || minMm)));
+ let sum = next.reduce((a, b) => a + b, 0);
+ if (Math.abs(sum - t) < 0.02) {
+ return next;
+ }
+ const scale = t / sum;
+ next = next.map((x) => round2(x * scale));
+ sum = next.reduce((a, b) => a + b, 0);
+ next[n - 1] = round2(next[n - 1] + (t - sum));
+ return next;
+}
+
+export function resolveFreeTableColWidthsMm(el: { colCount?: number; w: number; colWidths?: number[] | null }): number[] {
+ const colCount = Math.max(1, Number(el?.colCount || 1));
+ const w = Math.max(0.01, Number(el?.w) || 0.01);
+ const raw = Array.isArray(el?.colWidths) ? el.colWidths : [];
+ if (raw.length !== colCount) {
+ return evenSplitTracks(w, colCount);
+ }
+ return clampTrackSumToTotal(raw.map((x) => Number(x) || MIN_FREE_TABLE_TRACK_MM), w);
+}
+
+export function resolveFreeTableRowHeightsMm(el: { rowCount?: number; h: number; rowHeights?: number[] | null }): number[] {
+ const rowCount = Math.max(1, Number(el?.rowCount || 1));
+ const h = Math.max(0.01, Number(el?.h) || 0.01);
+ const raw = Array.isArray(el?.rowHeights) ? el.rowHeights : [];
+ if (raw.length !== rowCount) {
+ return evenSplitTracks(h, rowCount);
+ }
+ return clampTrackSumToTotal(raw.map((x) => Number(x) || MIN_FREE_TABLE_TRACK_MM), h);
+}
+
+/** 拖拽列边界:在 edge 与 edge+1 之间移动,edge ∈ [0, n-2] */
+export function redistributeColEdge(
+ base: number[],
+ edge: number,
+ deltaMm: number,
+ totalW: number,
+ minMm = MIN_FREE_TABLE_TRACK_MM,
+): number[] | null {
+ if (base.length < 2 || edge < 0 || edge >= base.length - 1) {
+ return null;
+ }
+ const next = [...base];
+ next[edge] = round2(next[edge] + deltaMm);
+ next[edge + 1] = round2(next[edge + 1] - deltaMm);
+ if (next[edge] < minMm || next[edge + 1] < minMm) {
+ return null;
+ }
+ return clampTrackSumToTotal(next, totalW, minMm);
+}
+
+/** 拖拽行边界:在 edge 与 edge+1 之间移动 */
+export function redistributeRowEdge(
+ base: number[],
+ edge: number,
+ deltaMm: number,
+ totalH: number,
+ minMm = MIN_FREE_TABLE_TRACK_MM,
+): number[] | null {
+ if (base.length < 2 || edge < 0 || edge >= base.length - 1) {
+ return null;
+ }
+ const next = [...base];
+ next[edge] = round2(next[edge] + deltaMm);
+ next[edge + 1] = round2(next[edge + 1] - deltaMm);
+ if (next[edge] < minMm || next[edge + 1] < minMm) {
+ return null;
+ }
+ return clampTrackSumToTotal(next, totalH, minMm);
+}
+
+/** 新增列åŽåˆ—宽(总宽ä¸å˜ï¼Œå‡åˆ†ç©ºé—´ç»™æ–°åˆ—) */
+export function colWidthsAfterAddCol(widths: number[], totalW: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ const n = widths.length;
+ if (n < 1) {
+ return evenSplitTracks(totalW, 1);
+ }
+ const factor = n / (n + 1);
+ const scaled = widths.map((c) => round2(c * factor));
+ const sum = scaled.reduce((a, b) => a + b, 0);
+ scaled.push(round2(Math.max(minMm, totalW - sum)));
+ return clampTrackSumToTotal(scaled, totalW, minMm);
+}
+
+/** åˆ é™¤åˆ—åŽåˆ—å®½ï¼ˆè¢«åˆ åˆ—å®½åº¦å¹¶å…¥ç›¸é‚»åˆ—ï¼‰ */
+export function colWidthsAfterRemoveCol(widths: number[], removeIdx: number, totalW: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ if (widths.length <= 1) {
+ return [totalW];
+ }
+ const removed = widths[removeIdx] ?? 0;
+ const next = widths.filter((_, i) => i !== removeIdx);
+ const adj = Math.min(Math.max(0, removeIdx), next.length - 1);
+ next[adj] = round2((next[adj] ?? 0) + removed);
+ return clampTrackSumToTotal(next, totalW, minMm);
+}
+
+export function rowHeightsAfterAddRow(heights: number[], totalH: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ const n = heights.length;
+ if (n < 1) {
+ return evenSplitTracks(totalH, 1);
+ }
+ const factor = n / (n + 1);
+ const scaled = heights.map((h) => round2(h * factor));
+ const sum = scaled.reduce((a, b) => a + b, 0);
+ scaled.push(round2(Math.max(minMm, totalH - sum)));
+ return clampTrackSumToTotal(scaled, totalH, minMm);
+}
+
+export function rowHeightsAfterRemoveRow(heights: number[], removeIdx: number, totalH: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ if (heights.length <= 1) {
+ return [totalH];
+ }
+ const removed = heights[removeIdx] ?? 0;
+ const next = heights.filter((_, i) => i !== removeIdx);
+ const adj = Math.min(Math.max(0, removeIdx), next.length - 1);
+ next[adj] = round2((next[adj] ?? 0) + removed);
+ return clampTrackSumToTotal(next, totalH, minMm);
+}
+
+/** 整表缩放外框时,按比例缩放行列尺寸使总和ä»è´´åˆæ–° w/h */
+export function scaleFreeTableTracks(
+ colWidths: number[],
+ rowHeights: number[],
+ prevW: number,
+ prevH: number,
+ newW: number,
+ newH: number,
+ minMm = MIN_FREE_TABLE_TRACK_MM,
+): { colWidths: number[]; rowHeights: number[] } {
+ const pw = Math.max(0.01, Number(prevW) || 0.01);
+ const ph = Math.max(0.01, Number(prevH) || 0.01);
+ const nw = Math.max(0.01, Number(newW) || 0.01);
+ const nh = Math.max(0.01, Number(newH) || 0.01);
+ const sx = nw / pw;
+ const sy = nh / ph;
+ const nextCw = colWidths.length ? colWidths.map((c) => round2(c * sx)) : [];
+ const nextRh = rowHeights.length ? rowHeights.map((r) => round2(r * sy)) : [];
+ return {
+ colWidths: nextCw.length ? clampTrackSumToTotal(nextCw, nw, minMm) : nextCw,
+ rowHeights: nextRh.length ? clampTrackSumToTotal(nextRh, nh, minMm) : nextRh,
+ };
+}
+
+/** 修改æŸä¸€åˆ—宽为指定值,差é¢ç”±ã€Œå¦ä¸€åˆ—ã€æ¶ˆåŒ–ï¼ˆç”¨äºŽå±žæ€§é¢æ¿ï¼‰ */
+export function setColWidthAt(colWidths: number[], index: number, valueMm: number, totalW: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] | null {
+ const n = colWidths.length;
+ if (n < 1 || index < 0 || index >= n) {
+ return null;
+ }
+ const next = [...colWidths];
+ const v = round2(Math.max(minMm, Number(valueMm) || minMm));
+ const diff = v - next[index];
+ const partner = index === n - 1 ? n - 2 : n - 1;
+ if (partner < 0) {
+ next[0] = totalW;
+ return clampTrackSumToTotal(next, totalW, minMm);
+ }
+ next[index] = v;
+ next[partner] = round2(next[partner] - diff);
+ if (next[partner] < minMm) {
+ return null;
+ }
+ return clampTrackSumToTotal(next, totalW, minMm);
+}
+
+/** 修改æŸä¸€è¡Œé«˜ */
+export function setRowHeightAt(rowHeights: number[], index: number, valueMm: number, totalH: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] | null {
+ const n = rowHeights.length;
+ if (n < 1 || index < 0 || index >= n) {
+ return null;
+ }
+ const next = [...rowHeights];
+ const v = round2(Math.max(minMm, Number(valueMm) || minMm));
+ const diff = v - next[index];
+ const partner = index === n - 1 ? n - 2 : n - 1;
+ if (partner < 0) {
+ next[0] = totalH;
+ return clampTrackSumToTotal(next, totalH, minMm);
+ }
+ next[index] = v;
+ next[partner] = round2(next[partner] - diff);
+ if (next[partner] < minMm) {
+ return null;
+ }
+ return clampTrackSumToTotal(next, totalH, minMm);
+}
+
+/** å‡åˆ†åˆ—宽(写入 colWidths) */
+export function buildEvenColWidths(colCount: number, totalW: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ return clampTrackSumToTotal(evenSplitTracks(totalW, Math.max(1, colCount)), totalW, minMm);
+}
+
+/** å‡åˆ†è¡Œé«˜ï¼ˆå†™å…¥ rowHeights) */
+export function buildEvenRowHeights(rowCount: number, totalH: number, minMm = MIN_FREE_TABLE_TRACK_MM): number[] {
+ return clampTrackSumToTotal(evenSplitTracks(totalH, Math.max(1, rowCount)), totalH, minMm);
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/nativeMockData.ts b/jeecgboot-vue3/src/views/print/template/native/core/nativeMockData.ts
new file mode 100644
index 0000000..bd4a173
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/nativeMockData.ts
@@ -0,0 +1,239 @@
+import type { NativeElement } from './types';
+
+/**
+ * æ ¹æ®ç”»å¸ƒå…ƒç´ 与「画布实际 JSONã€æ–‡æœ¬ç”Ÿæˆæ¨¡æ‹Ÿæ•°æ®å¯¹è±¡ã€‚
+ * 逻辑与 NativePrintDesigner.generateMockData 䏿 ¹æ®ç”»å¸ƒç”Ÿæˆéƒ¨åˆ†ä¸€è‡´ã€‚
+ */
+export function generateNativeMockDataObject(elements: NativeElement[], canvasJsonText: string): Record {
+ const randomInt = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min;
+ const randomPick = (list: any[]) => list[randomInt(0, Math.max(0, list.length - 1))];
+ const shortWords = ['æ ‡å‡†ä»¶', 'ä¸é”ˆé’¢', '铿¿', '铜件', '塑胶件', 'è¾…æ–™', '组件'];
+ const longWords = [
+ 'ç”¨äºŽäº§çº¿ç»„è£…çš„å…³é”®éƒ¨ä»¶ï¼Œéœ€æŒ‰å·¥è‰ºè¦æ±‚进行批次追溯与检验记录。',
+ '该物料用于连ç»ç”Ÿäº§æµç¨‹ï¼Œå»ºè®®ç»“åˆåº“å˜å‘¨è½¬ä¸Žæ‰¹æ¬¡æœ‰æ•ˆæœŸè¿›è¡ŒåЍæ€è¡¥æ–™ã€‚',
+ 'æœ¬æ¡æ•°æ®ä¸ºæ¨¡æ‹Ÿé•¿æ–‡æœ¬ï¼Œä¸»è¦ç”¨äºŽéªŒè¯åˆ—宽å˜åŒ–åŽè‡ªåЍæ¢è¡Œä¸Žå—å·è‡ªé€‚应效果。',
+ ];
+ const buildShortText = (field: string, rowIndex: number) => `${field}_${randomPick(shortWords)}_${rowIndex + 1}`;
+ const buildLongText = (field: string, rowIndex: number) => `${field}_${rowIndex + 1}_${randomPick(longWords)}`;
+ const buildRandomText = (field: string, rowIndex: number, shouldWrap: boolean) => {
+ if (shouldWrap && Math.random() < 0.45) {
+ return buildLongText(field, rowIndex);
+ }
+ return buildShortText(field, rowIndex);
+ };
+ const toAlphaNumKey = (input: string) => {
+ const normalized = String(input || '')
+ .replace(/[^a-zA-Z0-9]/g, '_')
+ .replace(/_+/g, '_')
+ .replace(/^_+|_+$/g, '');
+ return normalized || 'CODE';
+ };
+ const buildQrValue = (field: string) => `QR_${toAlphaNumKey(field)}_${randomInt(100000, 999999)}`;
+ const buildBarcodeValue = (field: string) => `BAR${randomInt(100000000000, 999999999999)}${toAlphaNumKey(field).slice(0, 6).toUpperCase()}`;
+ const buildMergeValue = (field: string, groupIndex: number, shouldWrap: boolean) =>
+ shouldWrap ? `${field}_åˆå¹¶ç»„${groupIndex + 1}_${randomPick(longWords)}` : `${field}_åˆå¹¶ç»„${groupIndex + 1}_${randomPick(shortWords)}`;
+ const resolveTemplateColumns = (element: any) => {
+ let parsed: any = {};
+ try {
+ parsed = JSON.parse(canvasJsonText || '{}');
+ } catch (_error) {
+ parsed = {};
+ }
+ if (!Array.isArray(parsed?.elements)) {
+ return Array.isArray(element?.columns) ? element.columns : [];
+ }
+ const matched = parsed.elements.find((item: any) => {
+ const component = String(item?.component || '');
+ return item?.id === element?.id && (component === 'table' || component === 'detailTable');
+ });
+ if (Array.isArray(matched?.payload?.columns)) {
+ return matched.payload.columns;
+ }
+ return Array.isArray(element?.columns) ? element.columns : [];
+ };
+
+ const resolveTemplateFreeTableCells = (element: any) => {
+ const fromElement = Array.isArray(element?.cells) ? element.cells : [];
+ let parsed: any = {};
+ try {
+ parsed = JSON.parse(canvasJsonText || '{}');
+ } catch (_error) {
+ parsed = {};
+ }
+ if (!Array.isArray(parsed?.elements)) {
+ return fromElement;
+ }
+ const matched = parsed.elements.find(
+ (item: any) => item?.id === element?.id && String(item?.component || '') === 'freeTable',
+ );
+ const fromJson = matched?.payload?.cells;
+ if (!Array.isArray(fromJson) || !fromJson.length) {
+ return fromElement;
+ }
+ const map = new Map();
+ fromElement.forEach((c: any) => {
+ const k = `${Number(c?.row ?? 0)}_${Number(c?.col ?? 0)}`;
+ map.set(k, { ...c });
+ });
+ fromJson.forEach((jc: any) => {
+ const k = `${Number(jc?.row ?? 0)}_${Number(jc?.col ?? 0)}`;
+ const prev = map.get(k) || {};
+ map.set(k, { ...prev, ...jc });
+ });
+ return Array.from(map.values());
+ };
+ const mock: Record = {};
+ const placeholderReg = /{{\s*([\w.]+)\s*}}/g;
+ const setByPath = (target: Record, path: string, value: any) => {
+ const segments = String(path || '')
+ .split('.')
+ .filter(Boolean);
+ if (!segments.length) {
+ return;
+ }
+ let cursor: Record = target;
+ for (let i = 0; i < segments.length - 1; i += 1) {
+ const key = segments[i];
+ if (!cursor[key] || typeof cursor[key] !== 'object') {
+ cursor[key] = {};
+ }
+ cursor = cursor[key];
+ }
+ cursor[segments[segments.length - 1]] = value;
+ };
+ const getByPath = (target: Record | null, path: string) => {
+ if (!target) return undefined;
+ return String(path || '')
+ .split('.')
+ .filter(Boolean)
+ .reduce((acc: any, key: string) => acc?.[key], target);
+ };
+ let qrcodeIndex = 1;
+ let barcodeIndex = 1;
+ elements.forEach((element) => {
+ if (element.type === 'table' || element.type === 'detailTable') {
+ const source = (element as any).source || 'mainTable';
+ const columns = resolveTemplateColumns(element);
+ const mergeKeys = Array.isArray((element as any).mergeColumnKeys) ? ((element as any).mergeColumnKeys as string[]) : [];
+ const strictGrouping = (element as any).strictGrouping !== false;
+ const mergeFieldOrder = mergeKeys
+ .map((key) => columns.find((col: any) => String(col?.key || '') === String(key || '')))
+ .filter(Boolean)
+ .map((col: any) => String(col?.bindField || col?.field || ''))
+ .filter(Boolean);
+ const rowCount = randomInt(6, 10);
+ const rowsDataCache: Record[] = [];
+ const rows = Array.from({ length: rowCount }).map((_, rowIndex) => {
+ const row: Record = {};
+ const prevRow = rowIndex > 0 ? (rowsDataCache[rowIndex - 1] || {}) : null;
+ columns.forEach((col: any, colIndex: number) => {
+ const field = String(col?.bindField || col?.field || `field${colIndex + 1}`);
+ const shouldWrap = col?.autoWrap !== false;
+ const contentType = String(col?.contentType || 'text');
+ const randomText = buildRandomText(field, rowIndex, shouldWrap);
+ const mergeIndex = mergeFieldOrder.findIndex((item) => item === field);
+ const enableMerge = mergeIndex >= 0;
+ const canFollowPrev =
+ !strictGrouping ||
+ mergeIndex <= 0 ||
+ mergeFieldOrder.slice(0, mergeIndex).every((parentField) => getByPath(prevRow, parentField) === getByPath(row, parentField));
+ if (enableMerge && rowIndex > 0 && prevRow && canFollowPrev && Math.random() < 0.5) {
+ const previousValue = getByPath(prevRow, field);
+ setByPath(row, field, previousValue ?? buildMergeValue(field, randomInt(0, 3), shouldWrap));
+ } else if (enableMerge) {
+ setByPath(row, field, buildMergeValue(field, randomInt(0, 3), shouldWrap));
+ } else {
+ if (contentType === 'image') {
+ setByPath(row, field, `https://picsum.photos/seed/${encodeURIComponent(`${field}_${rowIndex + 1}`)}/260/120`);
+ } else if (contentType === 'qrcode') {
+ setByPath(row, field, buildQrValue(field));
+ } else if (contentType === 'barcode') {
+ setByPath(row, field, buildBarcodeValue(field));
+ } else if (contentType === 'number' || contentType === 'amount') {
+ const decimals = Math.max(0, Math.min(6, Number(col?.decimalPlaces ?? 2)));
+ const base = randomInt(100, 50000) + Math.random();
+ const num = col?.roundHalfUp === false ? Math.trunc(base * 10 ** decimals) / 10 ** decimals : Number(base.toFixed(decimals));
+ setByPath(row, field, num);
+ } else {
+ setByPath(row, field, randomText);
+ }
+ }
+ });
+ rowsDataCache.push(row);
+ return row;
+ });
+ mock[source] = rows;
+ return;
+ }
+ if (element.type === 'freeTable') {
+ const cells = resolveTemplateFreeTableCells(element);
+ cells.forEach((cell: any, idx: number) => {
+ const bindField = String(cell?.bindField || '').trim();
+ if (!bindField) return;
+ if (bindField in mock) return;
+ const cellText = String(cell?.text || '').trim();
+ const contentType = String(cell?.contentType || 'text');
+ const shouldWrap = cell?.autoWrap !== false;
+ if (contentType === 'image') {
+ mock[bindField] = `https://picsum.photos/seed/${encodeURIComponent(`${bindField}_ft`)}/260/120`;
+ } else if (contentType === 'qrcode') {
+ mock[bindField] = buildQrValue(bindField || `ft${idx}`);
+ } else if (contentType === 'barcode') {
+ mock[bindField] = buildBarcodeValue(bindField || `ft${idx}`);
+ } else if (contentType === 'number' || contentType === 'amount') {
+ const decimals = Math.max(0, Math.min(6, Number(cell?.decimalPlaces ?? 2)));
+ const base = randomInt(100, 50000) + Math.random();
+ const num =
+ cell?.roundHalfUp === false ? Math.trunc(base * 10 ** decimals) / 10 ** decimals : Number(base.toFixed(decimals));
+ mock[bindField] = num;
+ } else {
+ mock[bindField] = cellText || buildRandomText(bindField, 0, shouldWrap);
+ }
+ });
+ return;
+ }
+
+ if (element.type === 'qrcode') {
+ const bindField = String((element as any).bindField || '').trim();
+ const key = bindField || `qrcodeValue${qrcodeIndex}`;
+ mock[key] = buildQrValue(bindField || `qrcode${qrcodeIndex}`);
+ qrcodeIndex += 1;
+ return;
+ }
+
+ if (element.type === 'barcode') {
+ const bindField = String((element as any).bindField || '').trim();
+ const key = bindField || `barcodeValue${barcodeIndex}`;
+ mock[key] = buildBarcodeValue(bindField || `barcode${barcodeIndex}`);
+ barcodeIndex += 1;
+ return;
+ }
+
+ const bindField = String((element as any).bindField || '').trim();
+ if (bindField && !(bindField in mock)) {
+ if (element.type === 'image') {
+ mock[bindField] = 'https://via.placeholder.com/180x80.png?text=Image';
+ } else if (element.type === 'date') {
+ mock[bindField] = '2026-01-01';
+ } else {
+ mock[bindField] = `${bindField}_示例值`;
+ }
+ }
+
+ const text = String((element as any).text || '');
+ const matches = Array.from(text.matchAll(placeholderReg));
+ matches.forEach((item) => {
+ const field = String(item?.[1] || '').split('.')[0];
+ if (!field) return;
+ if (!(field in mock)) {
+ mock[field] = `${field}_示例值`;
+ }
+ });
+ });
+ if (!Object.keys(mock).length) {
+ mock.docNo = 'DOC-001';
+ mock.orderNo = 'ORDER-001';
+ mock.mainTable = [{ field1: '值1', field2: '值2', field3: '值3' }];
+ }
+ return mock;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/nativeSchemaNormalize.ts b/jeecgboot-vue3/src/views/print/template/native/core/nativeSchemaNormalize.ts
new file mode 100644
index 0000000..0a09ef8
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/nativeSchemaNormalize.ts
@@ -0,0 +1,54 @@
+import { createDefaultSchema } from './useDesignerStore';
+import type { NativeElement, NativeTemplateSchema } from './types';
+
+/** å°†æŽ¥å£æˆ–导入的 JSON 规范为å¯ç”¨çš„ NativeTemplateSchema(与 NativePrintDesigner 内原逻辑一致) */
+export function normalizeImportedNativeSchema(raw: unknown): NativeTemplateSchema {
+ const base = createDefaultSchema();
+ const obj = raw as Record;
+ if (!obj || obj.engine !== 'native') {
+ throw new Error('è¿”å›žå†…å®¹ä¸æ˜¯åŽŸç”Ÿæ¨¡æ¿ï¼ˆengine 需为 native)');
+ }
+ const page = { ...base.page, ...(obj.page || {}) } as NativeTemplateSchema['page'];
+ page.unit = 'mm';
+ if (!Array.isArray(page.margin) || page.margin.length < 4) {
+ page.margin = [...base.page.margin];
+ }
+ const elements = Array.isArray(obj.elements) ? obj.elements : [];
+ let z = 1;
+ for (const el of elements as any[]) {
+ if (!el.id) {
+ el.id = `${String(el.type || 'el')}_${Math.random().toString(36).slice(2, 10)}`;
+ }
+ if (el.zIndex == null || el.zIndex === undefined) {
+ el.zIndex = z;
+ }
+ z += 1;
+ }
+ const dataBinding: NonNullable = {
+ fieldMap: { ...(base.dataBinding?.fieldMap || {}), ...(obj.dataBinding?.fieldMap || {}) },
+ tableSources:
+ Array.isArray(obj.dataBinding?.tableSources) && obj.dataBinding.tableSources.length
+ ? [...obj.dataBinding.tableSources]
+ : [...(base.dataBinding?.tableSources || ['mainTable', 'detailList'])],
+ params: Array.isArray(obj.dataBinding?.params) ? [...obj.dataBinding.params] : [...(base.dataBinding?.params || [])],
+ detailTables: Array.isArray(obj.dataBinding?.detailTables)
+ ? obj.dataBinding.detailTables.map((t: any) => ({
+ tableKey: String(t.tableKey || ''),
+ label: t.label ? String(t.label) : undefined,
+ fields: Array.isArray(t.fields)
+ ? t.fields.map((f: any) => ({
+ key: String(f.key || ''),
+ label: f.label ? String(f.label) : undefined,
+ }))
+ : [],
+ }))
+ : [...(base.dataBinding?.detailTables || [])],
+ };
+ return {
+ engine: 'native',
+ version: String(obj.version || '1.0.0'),
+ page,
+ elements: elements as NativeElement[],
+ dataBinding,
+ };
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/nativeTemplateStyleSerialize.ts b/jeecgboot-vue3/src/views/print/template/native/core/nativeTemplateStyleSerialize.ts
new file mode 100644
index 0000000..a11bb8f
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/nativeTemplateStyleSerialize.ts
@@ -0,0 +1,126 @@
+import type { NativeElement, NativeTemplateSchema } from './types';
+
+function defaultDataBinding(): NonNullable {
+ return {
+ fieldMap: {},
+ tableSources: ['mainTable', 'detailList'],
+ params: [],
+ detailTables: [],
+ };
+}
+
+/** 与 NativePrintDesigner.mapElementToTemplateStyle ä¸€è‡´ï¼šç”»å¸ƒå…ƒç´ â†’ã€Œç”»å¸ƒå®žé™… JSONã€ä¸çš„å…ƒç´ èŠ‚ç‚¹ */
+export function mapElementToTemplateStyle(element: NativeElement) {
+ return {
+ id: element.id,
+ component: element.type,
+ bindField: (element as any).bindField || '',
+ region: (element as any).region || '',
+ bandId: (element as any).bandId || '',
+ rect: { x: element.x, y: element.y, w: element.w, h: element.h, zIndex: element.zIndex },
+ style: { ...(element.style || {}) },
+ payload:
+ element.type === 'image'
+ ? { src: (element as any).src, fit: (element as any).fit }
+ : element.type === 'table' || element.type === 'detailTable'
+ ? {
+ source: (element as any).source,
+ mergeColumnKeys: (element as any).mergeColumnKeys || [],
+ strictGrouping: (element as any).strictGrouping !== false,
+ enableMultiHeader: (element as any).enableMultiHeader === true,
+ tableHeightMode: (element as any).tableHeightMode,
+ fixedRows: (element as any).fixedRows,
+ showHeader: (element as any).showHeader,
+ rowHeight: (element as any).rowHeight,
+ headerHeight: (element as any).headerHeight,
+ headerFontSize: (element as any).headerFontSize,
+ bodyFontSize: (element as any).bodyFontSize,
+ headerBgColor: (element as any).headerBgColor,
+ headerTextColor: (element as any).headerTextColor,
+ footerLabelColumnKey: (element as any).footerLabelColumnKey,
+ footerLabelText: (element as any).footerLabelText,
+ footerLabelCenter: (element as any).footerLabelCenter,
+ footerShowTotal: (element as any).footerShowTotal !== false,
+ footerTotalMode: (element as any).footerTotalMode || 'overall',
+ headerConfig: (element as any).headerConfig,
+ columns: (element as any).columns,
+ }
+ : element.type === 'freeTable'
+ ? {
+ rowCount: Number((element as any).rowCount || 1),
+ colCount: Number((element as any).colCount || 1),
+ borderColor: (element as any).borderColor || '#d9d9d9',
+ borderWidth: Number((element as any).borderWidth || 1),
+ outerBorderLineStyle: (element as any).outerBorderLineStyle || 'solid',
+ innerBorderHorizontalLineStyle: (element as any).innerBorderHorizontalLineStyle || 'solid',
+ innerBorderVerticalLineStyle: (element as any).innerBorderVerticalLineStyle || 'solid',
+ colWidths: Array.isArray((element as any).colWidths) ? [...(element as any).colWidths] : undefined,
+ rowHeights: Array.isArray((element as any).rowHeights) ? [...(element as any).rowHeights] : undefined,
+ outerBorder: (element as any).outerBorder,
+ innerBorder: (element as any).innerBorder,
+ cells: Array.isArray((element as any).cells)
+ ? (element as any).cells.map((cell: any) => ({
+ row: cell.row,
+ col: cell.col,
+ rowspan: Math.max(1, Number(cell?.rowspan || 1)),
+ colspan: Math.max(1, Number(cell?.colspan || 1)),
+ text: cell.text,
+ bindField: cell.bindField,
+ contentType: cell.contentType || 'text',
+ fillCell: cell.fillCell,
+ contentScale: cell.contentScale,
+ imageFit: cell.imageFit,
+ qrLevel: cell.qrLevel,
+ qrRenderType: cell.qrRenderType,
+ barcodeFormat: cell.barcodeFormat,
+ decimalPlaces: cell.decimalPlaces,
+ roundHalfUp: cell.roundHalfUp,
+ amountType: cell.amountType,
+ autoWrap: cell.autoWrap,
+ autoFitFont: cell.autoFitFont,
+ align: cell.align,
+ verticalAlign: cell.verticalAlign,
+ fontSize: cell.fontSize,
+ color: cell.color,
+ backgroundColor: cell.backgroundColor,
+ hideBorderTop: cell.hideBorderTop,
+ hideBorderRight: cell.hideBorderRight,
+ hideBorderBottom: cell.hideBorderBottom,
+ hideBorderLeft: cell.hideBorderLeft,
+ }))
+ : [],
+ }
+ : element.type === 'reportHeader' || element.type === 'reportFooter'
+ ? {
+ text: (element as any).text,
+ bookmarkText: (element as any).bookmarkText,
+ keepTogether: (element as any).keepTogether,
+ centerWithDetail: (element as any).centerWithDetail,
+ refreshPage: (element as any).refreshPage,
+ visible: (element as any).visible,
+ stretch: (element as any).stretch,
+ shrink: (element as any).shrink,
+ printRepeated: (element as any).printRepeated,
+ printAtPageBottom: (element as any).printAtPageBottom,
+ removeBlankWhenNoData: (element as any).removeBlankWhenNoData,
+ }
+ : element.type === 'qrcode' || element.type === 'barcode'
+ ? { value: (element as any).value }
+ : { text: (element as any).text, format: (element as any).format },
+ };
+}
+
+/** 与设计器「从画布生æˆã€ä¸€è‡´çš„画布实际 JSON 对象 */
+export function buildNativeTemplateStylePayload(schema: NativeTemplateSchema) {
+ return {
+ engine: 'native-template-style',
+ version: '1.0.0',
+ page: { ...schema.page },
+ elements: schema.elements.map((item) => mapElementToTemplateStyle(item)),
+ dataBinding: schema.dataBinding || defaultDataBinding(),
+ };
+}
+
+export function stringifyNativeTemplateStyle(schema: NativeTemplateSchema, space = 2) {
+ return JSON.stringify(buildNativeTemplateStylePayload(schema), null, space);
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/printRenderer.ts b/jeecgboot-vue3/src/views/print/template/native/core/printRenderer.ts
new file mode 100644
index 0000000..e5c66bc
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/printRenderer.ts
@@ -0,0 +1,547 @@
+import dayjs from 'dayjs';
+import QRCode from 'qrcode';
+import { buildRowSpanMap } from './tableMerge';
+import { getValueByPath, normalizeTableWidths, resolveTableRows } from './tableBuilder';
+import type { NativeElement, NativeFreeTableElement, NativeTableElement, NativeTemplateSchema } from './types';
+import { normalizeFreeTableAnchors } from './freeTableGrid';
+import { borderSidesToCssFragment, resolveFreeTableCellBorderSides } from './freeTableBorders';
+import { resolveFreeTableCellLineStyleKeys } from './freeTableLineStyles';
+import { resolveFreeTableColWidthsMm, resolveFreeTableRowHeightsMm } from './freeTableTracks';
+
+function resolveBoundValue(element: NativeElement, data: Record) {
+ const bindField = (element as any).bindField;
+ if (!bindField) return undefined;
+ return String(bindField)
+ .split('.')
+ .reduce((acc: any, key: string) => acc?.[key], data || {});
+}
+
+function resolveText(element: NativeElement, data: Record, pageNo = 1, totalPages = 1) {
+ const bindValue = resolveBoundValue(element, data);
+ if (bindValue !== undefined && bindValue !== null && element.type !== 'pageNo') {
+ if (element.type === 'date') {
+ return dayjs(bindValue).format((element as any).format || 'YYYY-MM-DD');
+ }
+ return String(bindValue);
+ }
+ if (element.type === 'date') {
+ return dayjs().format((element as any).format || 'YYYY-MM-DD');
+ }
+ if (element.type === 'pageNo') {
+ return (element as any).text.replace('{{pageNo}}', String(pageNo)).replace('{{totalPages}}', String(totalPages));
+ }
+ if ((element as any).text?.startsWith('{{') && (element as any).text?.endsWith('}}')) {
+ const key = (element as any).text.replaceAll('{', '').replaceAll('}', '').trim();
+ return String(getValueByPath(data || {}, key) ?? '');
+ }
+ return String((element as any).text ?? '');
+}
+
+async function renderTable(element: NativeTableElement, data: Record) {
+ const sourceRows = resolveTableRows(element, data);
+ const columns = normalizeTableWidths(element);
+ return renderTablePage(element, columns as any[], sourceRows, true, sourceRows);
+}
+
+async function renderFreeTable(element: NativeFreeTableElement, data: Record) {
+ const rowCount = Math.max(1, Number((element as any)?.rowCount || 1));
+ const colCount = Math.max(1, Number((element as any)?.colCount || 1));
+ const wMm = Math.max(0.01, Number((element as any)?.w) || 0.01);
+ const hMm = Math.max(0.01, Number((element as any)?.h) || 0.01);
+ const colWidthsMm = resolveFreeTableColWidthsMm(element as any);
+ const rowHeightsMm = resolveFreeTableRowHeightsMm(element as any);
+ const borderColor = String((element as any)?.borderColor || '#d9d9d9');
+ const borderWidth = Math.max(1, Number((element as any)?.borderWidth || 1));
+ const colgroup = `${colWidthsMm.map((cw) => ``).join('')}`;
+ const anchors = normalizeFreeTableAnchors(rowCount, colCount, (element as any)?.cells || []);
+ const body = (
+ await Promise.all(
+ Array.from({ length: rowCount }, async (_, row) => {
+ const rh = rowHeightsMm[row] ?? hMm / rowCount;
+ const rowCells = (
+ await Promise.all(
+ anchors
+ .filter((cell) => cell.row === row)
+ .sort((a, b) => a.col - b.col)
+ .map(async (cell) => {
+ const rs = Math.max(1, Number((cell as any).rowspan || 1));
+ const cs = Math.max(1, Number((cell as any).colspan || 1));
+ const bindField = String((cell as any)?.bindField || '').trim();
+ const cellValue = bindField ? getValueByPath(data || {}, bindField) ?? '' : (cell as any)?.text ?? '';
+ const raw = String(cellValue ?? '');
+ const contentType = String((cell as any)?.contentType || 'text');
+ const displayValue =
+ contentType === 'number' || contentType === 'amount'
+ ? formatNumericValue(cellValue, cell as any)
+ : raw;
+ const innerArg =
+ contentType === 'image' || contentType === 'qrcode' || contentType === 'barcode' ? raw : displayValue;
+ const bodyInnerHtml = await resolvePrintCellInnerHtml(contentType, innerArg, cell as any);
+ const align = String((cell as any)?.align || 'left');
+ const verticalAlign = String((cell as any)?.verticalAlign || 'middle');
+ const fontSize = Math.max(8, Number((cell as any)?.fontSize || element.style?.fontSize || 12));
+ const color = String((cell as any)?.color || '#111111');
+ const backgroundColor = String((cell as any)?.backgroundColor || '#ffffff');
+ const rowspanAttr = rs > 1 ? ` rowspan="${rs}"` : '';
+ const colspanAttr = cs > 1 ? ` colspan="${cs}"` : '';
+ const spanW = colWidthsMm.slice(cell.col, cell.col + cs).reduce((a, b) => a + b, 0);
+ const colWidthStyle = `width:${spanW}mm;`;
+ const sides = resolveFreeTableCellBorderSides(element, anchors, cell, cell.row, cell.col, rs, cs, rowCount, colCount);
+ const lineKeys = resolveFreeTableCellLineStyleKeys(element, cell.row, cell.col, rs, cs, rowCount, colCount);
+ const borderCss = borderSidesToCssFragment(sides, borderWidth, borderColor, lineKeys);
+ const nowrap = (cell as any).autoWrap === false;
+ const ws = nowrap ? 'nowrap' : 'normal';
+ const wb = nowrap ? 'normal' : 'break-all';
+ const ow = nowrap ? 'normal' : 'anywhere';
+ return `${bodyInnerHtml} | `;
+ }),
+ )
+ ).join('');
+ return `${rowCells}
`;
+ }),
+ )
+ ).join('');
+ // ä¸è®¾ table 固定总高:固定 height 时边框/å†…è¾¹è·æ˜“超出被è£åˆ‡ï¼›è¡Œé«˜ä¹‹å’Œå·²è´´åˆå…ƒç´ hã€‚è¡¨æ ¼å¤–æ¡†ç”±å•å…ƒæ ¼è¾¹æ¡†æ‹¼æˆã€‚
+ return ``;
+}
+
+async function renderFixedRowsTablePages(element: NativeTableElement, data: Record) {
+ const sourceRows = resolveTableRows(element, data);
+ const columns = normalizeTableWidths(element);
+ const pageSize = Math.max(1, Number(element?.fixedRows || 5));
+ const pages = chunkRows(sourceRows, pageSize);
+ const chunks = pages.length ? pages : [[]];
+ const footerMode = String((element as any).footerTotalMode || 'overall');
+ return Promise.all(
+ chunks.map((rows, index) => {
+ const isLastPage = index === chunks.length - 1;
+ const showFooter = footerMode === 'page' ? true : isLastPage;
+ const footerRows = footerMode === 'page' ? rows : sourceRows;
+ return renderTablePage(element, columns as any[], rows, showFooter, footerRows);
+ }),
+ );
+}
+
+async function renderTablePage(
+ element: NativeTableElement,
+ columns: any[],
+ rows: Record[],
+ showFooter: boolean,
+ footerRows: Record[] = rows,
+) {
+ const rowSpanMap = buildRowSpanMap(rows, element.columns, (element as any).mergeColumnKeys || [], (element as any).strictGrouping !== false);
+ const headerHtml = element.showHeader ? buildPrintHeaderHtml(element, columns as any[]) : '';
+ const bodyHtml = (
+ await Promise.all(
+ rows.map(async (row, rowIndex) => {
+ const cells = (
+ await Promise.all(
+ columns.map(async (column) => {
+ const fieldKey = column.bindField || column.field;
+ const span = rowSpanMap[`${rowIndex}_${fieldKey}`];
+ if (span === 0) return '';
+ const rowSpanText = span && span > 1 ? ` rowspan="${span}"` : '';
+ const cellValue = getValueByPath(row || {}, fieldKey) ?? '';
+ const contentType = String((column as any).contentType || 'text');
+ const displayValue = isNumericColumn(column as any) ? formatNumericValue(cellValue, column as any) : String(cellValue);
+ const bodyInnerHtml = await resolvePrintCellInnerHtml(contentType, displayValue, column as any);
+ const bodyBaseSize = (column as any)?.useCustomFontSize ? Number((column as any)?.fontSize || 12) : Number(element.bodyFontSize || 12);
+ const fontSize = resolvePrintAutoFontSize(column as any, displayValue, Number(column?.width || 30), element.rowHeight || 8, bodyBaseSize);
+ return `${bodyInnerHtml} | `;
+ }),
+ )
+ ).join('');
+ return `${cells}
`;
+ }),
+ )
+ ).join('');
+ const footerHtml = showFooter ? buildFooterHtml(footerRows, columns as any[], element) : '';
+ return `${headerHtml}${bodyHtml}${footerHtml}
`;
+}
+
+function chunkRows(rows: Record[], pageSize: number) {
+ const size = Math.max(1, Number(pageSize || 1));
+ const list: Record[][] = [];
+ for (let i = 0; i < rows.length; i += size) {
+ list.push(rows.slice(i, i + size));
+ }
+ return list;
+}
+
+function buildPrintHeaderHtml(element: NativeTableElement, columns: any[]) {
+ const headerRows = buildPrintHeaderRows(element, columns);
+ const rowCount = Math.max(1, headerRows.length);
+ const rowHeight = (element.headerHeight || 10) / rowCount;
+ return headerRows
+ .map((cells) => {
+ const cellHtml = cells
+ .map((cell) => {
+ const column = columns[cell.col] || {};
+ const widthMm = columns.slice(cell.col, cell.col + cell.colspan).reduce((sum: number, col: any) => sum + Number(col?.width || 0), 0);
+ const cellHeightMm = rowHeight * Number(cell.rowspan || 1);
+ const headerFontSize = resolvePrintAutoFontSize(
+ column as any,
+ String(cell?.title || ''),
+ Number(widthMm || column?.width || 30),
+ cellHeightMm,
+ Number(element.headerFontSize || 12),
+ );
+ return `${cell.title || ''} | `;
+ })
+ .join('');
+ return `${cellHtml}
`;
+ })
+ .join('');
+}
+
+function buildPrintHeaderRows(element: NativeTableElement, columns: any[]) {
+ const colCount = columns.length;
+ if (!colCount) return [];
+ if (element.enableMultiHeader !== true) {
+ return [
+ columns.map((col: any, index: number) => ({
+ row: 0,
+ col: index,
+ rowspan: 1,
+ colspan: 1,
+ title: String(col?.title || ''),
+ align: col?.align || 'center',
+ widthPercent: Number(col?.widthPercent || 0),
+ })),
+ ];
+ }
+ const headerConfig = (element as any)?.headerConfig;
+ const rowCount = Math.max(1, Number(headerConfig?.rowCount || 1));
+ const owner: any[][] = Array.from({ length: rowCount }, () => Array.from({ length: colCount }, () => null));
+ const cells: any[] = [];
+ const configCells = Array.isArray(headerConfig?.cells) && Number(headerConfig?.colCount || 0) === colCount ? headerConfig.cells : [];
+ configCells.forEach((item: any) => {
+ const row = Math.max(0, Number(item?.row || 0));
+ const col = Math.max(0, Number(item?.col || 0));
+ const rowspan = Math.max(1, Number(item?.rowspan || 1));
+ const colspan = Math.max(1, Number(item?.colspan || 1));
+ if (row >= rowCount || col >= colCount || owner[row][col]) return;
+ const maxRow = Math.min(rowCount, row + rowspan);
+ const maxCol = Math.min(colCount, col + colspan);
+ for (let r = row; r < maxRow; r += 1) {
+ for (let c = col; c < maxCol; c += 1) {
+ if (owner[r][c]) return;
+ }
+ }
+ const next = { row, col, rowspan: maxRow - row, colspan: maxCol - col, title: String(item?.title || ''), align: String(item?.align || 'center') };
+ for (let r = row; r < maxRow; r += 1) {
+ for (let c = col; c < maxCol; c += 1) {
+ owner[r][c] = next;
+ }
+ }
+ cells.push(next);
+ });
+ for (let r = 0; r < rowCount; r += 1) {
+ for (let c = 0; c < colCount; c += 1) {
+ if (owner[r][c]) continue;
+ const fallback = { row: r, col: c, rowspan: 1, colspan: 1, title: r === rowCount - 1 ? String(columns[c]?.title || '') : '', align: columns[c]?.align || 'center' };
+ owner[r][c] = fallback;
+ cells.push(fallback);
+ }
+ }
+ const rows = Array.from({ length: rowCount }, () => [] as any[]);
+ cells.forEach((cell) => {
+ if (owner[cell.row][cell.col] !== cell) return;
+ const widthPercent = columns.slice(cell.col, cell.col + cell.colspan).reduce((sum: number, col: any) => sum + Number(col?.widthPercent || 0), 0);
+ rows[cell.row].push({ ...cell, widthPercent });
+ });
+ rows.forEach((list) => list.sort((a, b) => a.col - b.col));
+ return rows;
+}
+
+async function buildQrcodeDataUrl(value: string, column?: any) {
+ const text = String(value || 'empty');
+ return QRCode.toDataURL(text, {
+ errorCorrectionLevel: column?.qrLevel || 'M',
+ margin: 0,
+ type: column?.qrRenderType || 'image/png',
+ width: 220,
+ });
+}
+
+async function resolvePrintCellInnerHtml(contentType: string, value: string, column: any) {
+ const safeValue = String(value || '');
+ const fillCell = column?.fillCell !== false;
+ const scale = Math.max(10, Math.min(100, Number(column?.contentScale || 100)));
+ if (contentType === 'image') {
+ const src = safeValue || `https://via.placeholder.com/180x80.png?text=${encodeURIComponent(column?.title || 'Image')}`;
+ return `
`;
+ }
+ if (contentType === 'qrcode') {
+ try {
+ const src = await buildQrcodeDataUrl(safeValue, column);
+ return `
`;
+ } catch (_error) {
+ return `QR:${safeValue}
`;
+ }
+ }
+ if (contentType === 'barcode') {
+ return `BAR:${safeValue}
`;
+ }
+ return safeValue;
+}
+
+function resolvePrintAutoFontSize(column: any, text: string, columnWidthMm: number, rowHeightMm: number, baseSize: number) {
+ const base = Number(baseSize || 12);
+ if (!column?.autoFitFont) {
+ return base;
+ }
+ const widthPx = Math.max(1, columnWidthMm * 3.7795275591);
+ const heightPx = Math.max(1, rowHeightMm * 3.7795275591);
+ const textLen = Math.max(1, text.length);
+ const byWidth = widthPx / Math.max(1, textLen * 0.62);
+ const byHeight = column?.autoWrap === false ? heightPx * 0.55 : heightPx * 0.36;
+ const next = Math.min(base, byWidth, byHeight);
+ return Math.max(8, Math.round(next));
+}
+
+function isNumericColumn(column: any) {
+ const type = String(column?.contentType || 'text');
+ return type === 'number' || type === 'amount';
+}
+
+function formatNumericValue(value: any, column: any) {
+ const numeric = Number(value);
+ if (!Number.isFinite(numeric)) {
+ return String(value ?? '');
+ }
+ const decimals = Math.max(0, Math.min(6, Number(column?.decimalPlaces ?? 2)));
+ const finalValue = column?.roundHalfUp === false ? Math.trunc(numeric * 10 ** decimals) / 10 ** decimals : Number(numeric.toFixed(decimals));
+ const formatted = finalValue.toLocaleString(undefined, {
+ minimumFractionDigits: decimals,
+ maximumFractionDigits: decimals,
+ });
+ if (String(column?.contentType || 'text') === 'amount') {
+ const symbol = column?.amountType === 'USD' ? '$' : column?.amountType === 'EUR' ? 'EUR ' : 'Â¥';
+ return `${symbol}${formatted}`;
+ }
+ return formatted;
+}
+
+function buildFooterHtml(rows: Record[], columns: any[], element: NativeTableElement) {
+ if ((element as any)?.footerShowTotal === false) {
+ return '';
+ }
+ const labelColumnKey = String(element?.footerLabelColumnKey || columns?.[0]?.key || '');
+ const labelText = String(element?.footerLabelText || 'åˆè®¡');
+ const labelAlign = element?.footerLabelCenter === false ? 'left' : 'center';
+ const cells = columns
+ .map((column, index) => {
+ if (isNumericColumn(column) && !!column?.enableFooterTotal) {
+ const fieldKey = column?.bindField || column?.field;
+ const total = rows.reduce((sum, row) => {
+ const value = Number(getValueByPath(row || {}, fieldKey));
+ return sum + (Number.isFinite(value) ? value : 0);
+ }, 0);
+ return `${formatNumericValue(total, column)} | `;
+ }
+ if (String(column?.key || '') === labelColumnKey || (!labelColumnKey && index === 0)) {
+ return `${labelText} | `;
+ }
+ return ` | `;
+ })
+ .join('');
+ return `${cells}
`;
+}
+
+export async function renderNativePrintHtml(schema: NativeTemplateSchema, data: Record) {
+ const pageCount = resolvePrintPageCount(schema, data);
+ const totalHeight = schema.page.height * pageCount;
+ const repeatHeaderConfig = resolveRepeatHeaderConfig(schema);
+ const repeatHeaderByPage = repeatHeaderConfig.enabled;
+ const headerVisible = repeatHeaderConfig.visible;
+ const headerBandHeight = resolveHeaderBandHeight(schema);
+ const sorted = [...schema.elements].sort((a, b) => a.zIndex - b.zIndex);
+ const content = (
+ await Promise.all(
+ sorted.map(async (item) => {
+ if ((item as any).visible === false) {
+ return '';
+ }
+ const isReportFooter = item.type === 'reportFooter';
+ const isReportHeader = item.type === 'reportHeader';
+ const repeatReportHeader = isReportHeader && (item as any).printRepeated === true;
+ const isHeaderRegionElement = isElementInHeaderRegion(item, repeatHeaderConfig.headerId, headerBandHeight);
+ if (!headerVisible && isHeaderRegionElement) {
+ return '';
+ }
+ const repeatHeaderElement = isHeaderRegionElement && repeatHeaderByPage;
+ const renderX = isReportHeader || isReportFooter ? 0 : item.x;
+ const renderY = isReportHeader ? 0 : isReportFooter && (item as any).printAtPageBottom === true ? Math.max(0, schema.page.height - item.h) : item.y;
+ const renderW = isReportHeader || isReportFooter ? schema.page.width : item.w;
+ const styleParts = [
+ `position:absolute`,
+ `width:${renderW}mm`,
+ `height:${item.h}mm`,
+ `font-size:${item.style?.fontSize || 12}px`,
+ `font-weight:${item.style?.fontWeight || 400}`,
+ `color:${item.style?.color || '#111'}`,
+ `line-height:${item.style?.lineHeight || 1.4}`,
+ `text-align:${item.style?.textAlign || 'left'}`,
+ `background:${item.style?.backgroundColor || 'transparent'}`,
+ item.style?.borderWidth ? `border:${item.style.borderWidth}px solid ${item.style.borderColor || '#222'}` : '',
+ 'overflow:hidden',
+ ]
+ .filter(Boolean)
+ .join(';');
+ const style = (topMm: number) => [`left:${renderX}mm`, `top:${topMm}mm`, styleParts].join(';');
+ const shouldRepeat = (repeatReportHeader || repeatHeaderElement) && pageCount > 1;
+ const pages = shouldRepeat ? Array.from({ length: pageCount }, (_v, i) => i + 1) : [1];
+ const htmlByPage = await Promise.all(
+ pages.map(async (pageNo) => {
+ const top = renderY + (shouldRepeat ? (pageNo - 1) * schema.page.height : 0);
+ if (item.type === 'table' || item.type === 'detailTable') {
+ const tableMode = String((item as any).tableHeightMode || 'autoPage');
+ if (tableMode === 'fixedRows') {
+ const pageTables = await renderFixedRowsTablePages(item, data);
+ if (shouldRepeat) {
+ const firstPageTable = pageTables[0] || '';
+ return `${firstPageTable}
`;
+ }
+ return pageTables
+ .map((tableHtml, pageIndex) => {
+ const pageTop = renderY + pageIndex * schema.page.height;
+ return `${tableHtml}
`;
+ })
+ .join('');
+ }
+ return `${await renderTable(item, data)}
`;
+ }
+ if (item.type === 'freeTable') {
+ // è‡ªç”±è¡¨æ ¼ï¼šé¿å… overflow:hidden è£æŽ‰åº•è¾¹/竖线边框;由行高+box-sizing 控制å ä½
+ const ftHtml = await renderFreeTable(item as NativeFreeTableElement, data);
+ return `${ftHtml}
`;
+ }
+ if (item.type === 'qrcode') {
+ const value = resolveBoundValue(item, data) ?? (item as any).value;
+ try {
+ const src = await buildQrcodeDataUrl(String(value ?? ''), item as any);
+ return `
`;
+ } catch (_error) {
+ return `二维ç :${value ?? ''}
`;
+ }
+ }
+ if (item.type === 'barcode') {
+ const value = resolveBoundValue(item, data) ?? (item as any).value;
+ return `æ¡å½¢ç :${value ?? ''}
`;
+ }
+ if (item.type === 'image') {
+ const image = item as any;
+ const src = (resolveBoundValue(item, data) ?? image.src) || '';
+ return `
`;
+ }
+ return `${resolveText(item, data, pageNo, pageCount)}
`;
+ }),
+ );
+ return htmlByPage.join('');
+ }),
+ )
+ ).join('');
+ const pageBreakGuides = pageCount > 1
+ ? Array.from({ length: pageCount - 1 })
+ .map((_v, index) => ``)
+ .join('')
+ : '';
+ const pageMargin = resolvePageMarginCss(schema.page.margin);
+ return `
+
+
+
+
+
+
+
+ ${content}
+ ${pageBreakGuides}
+
+
+`;
+}
+
+function resolvePageMarginCss(margin?: [number, number, number, number]) {
+ if (!Array.isArray(margin) || margin.length < 4) {
+ return '0mm';
+ }
+ const top = Math.max(0, Number(margin[0] || 0));
+ const right = Math.max(0, Number(margin[1] || 0));
+ const bottom = Math.max(0, Number(margin[2] || 0));
+ const left = Math.max(0, Number(margin[3] || 0));
+ return `${top}mm ${right}mm ${bottom}mm ${left}mm`;
+}
+
+/** 与 renderNativePrintHtml å†…éƒ¨é¡µæ•°è®¡ç®—ä¸€è‡´ï¼Œä¾›åˆ—è¡¨é¢„è§ˆç‰æ¯”缩放使用 */
+export function resolvePrintPageCount(schema: NativeTemplateSchema, data: Record) {
+ const tablePages = schema.elements
+ .filter((item) => item.type === 'table' || item.type === 'detailTable')
+ .map((item: any) => {
+ const rows = resolveTableRows(item as NativeTableElement, data);
+ const mode = String(item?.tableHeightMode || 'autoPage');
+ if (mode !== 'fixedRows') {
+ return 1;
+ }
+ const pageSize = Math.max(1, Number(item?.fixedRows || 5));
+ return Math.max(1, Math.ceil(rows.length / pageSize));
+ });
+ return Math.max(1, ...tablePages);
+}
+
+function resolveRepeatHeaderConfig(schema: NativeTemplateSchema) {
+ const reportHeader = schema.elements.find((item) => item.type === 'reportHeader') as any;
+ if (!reportHeader) return { visible: true, enabled: false, headerId: '' };
+ if (reportHeader.visible === false) return { visible: false, enabled: false, headerId: String(reportHeader.id || '') };
+ return { visible: true, enabled: reportHeader.printRepeated === true, headerId: String(reportHeader.id || '') };
+}
+
+function resolveHeaderBandHeight(schema: NativeTemplateSchema) {
+ const reportHeader = schema.elements.find((item) => item.type === 'reportHeader') as any;
+ return Math.max(0, Number(reportHeader?.h || 0));
+}
+
+function isElementInHeaderRegion(element: NativeElement, repeatHeaderId: string, headerBandHeight: number) {
+ if (element.type === 'reportHeader') return true;
+ if (element.type === 'reportFooter') return false;
+ const bandId = String((element as any).bandId || '');
+ if (repeatHeaderId && bandId === repeatHeaderId) return true;
+ const region = String((element as any).region || '');
+ if (region === 'header') return true;
+ if (region === 'body' || region === 'footer') return false;
+ if (headerBandHeight <= 0) return false;
+ const topY = Number(element.y || 0);
+ const bottomY = topY + Number(element.h || 0);
+ // 兼容旧模æ¿ï¼šæœªæ ‡æ³¨ region 时,按ä½ç½®åˆ¤æ–å…ƒç´ æ˜¯å¦å±žäºŽæŠ¥è¡¨å¤´åŒºåŸŸ
+ return topY < headerBandHeight && bottomY <= headerBandHeight + 0.2;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/printService.ts b/jeecgboot-vue3/src/views/print/template/native/core/printService.ts
new file mode 100644
index 0000000..da39e02
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/printService.ts
@@ -0,0 +1,64 @@
+let printingInProgress = false;
+
+export function printHtml(html: string) {
+ if (printingInProgress) {
+ return;
+ }
+ printingInProgress = true;
+
+ const iframe = document.createElement('iframe');
+ iframe.style.position = 'fixed';
+ iframe.style.right = '0';
+ iframe.style.bottom = '0';
+ iframe.style.width = '0';
+ iframe.style.height = '0';
+ iframe.style.border = '0';
+ iframe.style.opacity = '0';
+ iframe.setAttribute('aria-hidden', 'true');
+ iframe.setAttribute('sandbox', 'allow-modals allow-same-origin');
+
+ let printTriggered = false;
+ let cleaned = false;
+ let timeoutId = 0;
+
+ const cleanup = () => {
+ if (cleaned) return;
+ cleaned = true;
+ if (timeoutId) {
+ window.clearTimeout(timeoutId);
+ }
+ iframe.removeEventListener('load', handleLoad);
+ setTimeout(() => {
+ iframe.remove();
+ printingInProgress = false;
+ }, 0);
+ };
+
+ const handleLoad = () => {
+ if (printTriggered) {
+ return;
+ }
+ printTriggered = true;
+ const win = iframe.contentWindow;
+ if (!win) {
+ cleanup();
+ return;
+ }
+ const handleAfterPrint = () => {
+ win.removeEventListener('afterprint', handleAfterPrint);
+ cleanup();
+ };
+ win.addEventListener('afterprint', handleAfterPrint);
+ setTimeout(() => {
+ win.focus();
+ win.print();
+ }, 50);
+ };
+
+ iframe.addEventListener('load', handleLoad);
+ iframe.srcdoc = html;
+ document.body.appendChild(iframe);
+ timeoutId = window.setTimeout(() => {
+ cleanup();
+ }, 60 * 1000);
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/tableBuilder.ts b/jeecgboot-vue3/src/views/print/template/native/core/tableBuilder.ts
new file mode 100644
index 0000000..ad1983e
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/tableBuilder.ts
@@ -0,0 +1,25 @@
+import type { NativeTableElement } from './types';
+
+export function getValueByPath(data: Record, path: string) {
+ if (!path) return undefined;
+ return String(path)
+ .split('.')
+ .reduce((acc: any, key: string) => acc?.[key], data || {});
+}
+
+export function resolveTableRows(element: NativeTableElement, data: Record) {
+ const rows = data?.[element.source];
+ if (Array.isArray(rows)) {
+ return rows.filter((item) => item && typeof item === 'object');
+ }
+ return [];
+}
+
+export function normalizeTableWidths(element: NativeTableElement) {
+ const total = element.columns.reduce((sum, item) => sum + Number(item.width || 0), 0);
+ if (!total) return element.columns;
+ return element.columns.map((item) => ({
+ ...item,
+ widthPercent: (Number(item.width || 0) / total) * 100,
+ }));
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/tableMerge.ts b/jeecgboot-vue3/src/views/print/template/native/core/tableMerge.ts
new file mode 100644
index 0000000..c5768e1
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/tableMerge.ts
@@ -0,0 +1,61 @@
+import type { NativeTableColumn } from './types';
+import { getValueByPath } from './tableBuilder';
+
+interface MergeRange {
+ start: number;
+ end: number;
+}
+
+function resolveMergeFields(columns: NativeTableColumn[], mergeColumnKeys: string[] = []) {
+ const byKey = new Map(columns.map((col) => [String(col?.key || ''), col] as const));
+ const orderedFields = mergeColumnKeys
+ .map((key) => byKey.get(String(key || '')))
+ .filter(Boolean)
+ .map((col) => String(col?.bindField || col?.field || ''))
+ .filter(Boolean);
+ if (orderedFields.length) {
+ return orderedFields;
+ }
+ return columns
+ .filter((item) => item.mergeByValue)
+ .map((item) => String(item.bindField || item.field || ''))
+ .filter(Boolean);
+}
+
+function buildRangesByField(rows: Record[], field: string, ranges: MergeRange[]) {
+ const nextRanges: MergeRange[] = [];
+ const map: Record = {};
+ ranges.forEach((range) => {
+ let start = range.start;
+ while (start < range.end) {
+ const value = getValueByPath(rows[start] || {}, field);
+ let end = start + 1;
+ while (end < range.end && getValueByPath(rows[end] || {}, field) === value) {
+ end += 1;
+ }
+ map[`${start}_${field}`] = end - start;
+ for (let i = start + 1; i < end; i += 1) {
+ map[`${i}_${field}`] = 0;
+ }
+ nextRanges.push({ start, end });
+ start = end;
+ }
+ });
+ return { map, nextRanges };
+}
+
+export function buildRowSpanMap(rows: Record[], columns: NativeTableColumn[], mergeColumnKeys: string[] = [], strictGrouping = false) {
+ const map: Record = {};
+ if (!rows.length) return map;
+ const mergeFields = resolveMergeFields(columns, mergeColumnKeys);
+ if (!mergeFields.length) return map;
+ let currentRanges: MergeRange[] = [{ start: 0, end: rows.length }];
+ mergeFields.forEach((field) => {
+ const { map: fieldMap, nextRanges } = buildRangesByField(rows, field, currentRanges);
+ Object.assign(map, fieldMap);
+ if (strictGrouping) {
+ currentRanges = nextRanges;
+ }
+ });
+ return map;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/types.ts b/jeecgboot-vue3/src/views/print/template/native/core/types.ts
new file mode 100644
index 0000000..b0a5f53
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/types.ts
@@ -0,0 +1,267 @@
+import type { FreeTableLineStyleKey } from './freeTableLineStyles';
+
+export type NativeElementType =
+ | 'title'
+ | 'subtitle'
+ | 'text'
+ | 'date'
+ | 'pageNo'
+ | 'reportHeader'
+ | 'reportFooter'
+ | 'image'
+ | 'table'
+ | 'detailTable'
+ | 'freeTable'
+ | 'qrcode'
+ | 'barcode';
+
+export interface NativeElementBase {
+ id: string;
+ type: NativeElementType;
+ bindField?: string;
+ region?: 'header' | 'body' | 'footer';
+ bandId?: string;
+ x: number;
+ y: number;
+ w: number;
+ h: number;
+ rotate?: number;
+ zIndex: number;
+ style?: {
+ fontSize?: number;
+ fontWeight?: number | string;
+ color?: string;
+ textAlign?: 'left' | 'center' | 'right';
+ lineHeight?: number;
+ borderWidth?: number;
+ borderColor?: string;
+ backgroundColor?: string;
+ };
+}
+
+export interface NativeTextElement extends NativeElementBase {
+ type: 'title' | 'subtitle' | 'text' | 'date' | 'pageNo';
+ text: string;
+ format?: string;
+}
+
+export interface NativeReportBandElement extends NativeElementBase {
+ type: 'reportHeader' | 'reportFooter';
+ text: string;
+ bookmarkText?: string;
+ keepTogether?: boolean;
+ centerWithDetail?: boolean;
+ refreshPage?: 'none' | 'always' | 'onOverflow';
+ visible?: boolean;
+ stretch?: boolean;
+ shrink?: boolean;
+ printRepeated?: boolean;
+ printAtPageBottom?: boolean;
+ removeBlankWhenNoData?: boolean;
+}
+
+export interface NativeImageElement extends NativeElementBase {
+ type: 'image';
+ src: string;
+ fit: 'fill' | 'contain' | 'cover';
+}
+
+export interface NativeCodeElement extends NativeElementBase {
+ type: 'qrcode' | 'barcode';
+ value: string;
+}
+
+export interface NativeTableColumn {
+ key: string;
+ title: string;
+ field: string;
+ bindField?: string;
+ width: number;
+ align?: 'left' | 'center' | 'right';
+ contentType?: 'text' | 'image' | 'qrcode' | 'barcode' | 'number' | 'amount';
+ fontFamily?: string;
+ fontSize?: number;
+ useCustomFontSize?: boolean;
+ fontColor?: string;
+ autoFitFont?: boolean;
+ autoWrap?: boolean;
+ fillCell?: boolean;
+ contentScale?: number;
+ imageFit?: 'fill' | 'contain' | 'cover';
+ qrLevel?: 'L' | 'M' | 'Q' | 'H';
+ qrRenderType?: 'image/png' | 'image/jpeg' | 'image/webp';
+ barcodeFormat?: string;
+ decimalPlaces?: number;
+ roundHalfUp?: boolean;
+ amountType?: 'CNY' | 'USD' | 'EUR';
+ enableFooterTotal?: boolean;
+ mergeByValue?: boolean;
+}
+
+export interface NativeTableHeaderCell {
+ id: string;
+ row: number;
+ col: number;
+ rowspan: number;
+ colspan: number;
+ title: string;
+ align?: 'left' | 'center' | 'right';
+}
+
+export interface NativeTableHeaderConfig {
+ rowCount: number;
+ colCount: number;
+ cells: NativeTableHeaderCell[];
+}
+
+export interface NativeTableElement extends NativeElementBase {
+ type: 'table' | 'detailTable';
+ source: string;
+ mergeColumnKeys?: string[];
+ strictGrouping?: boolean;
+ enableMultiHeader?: boolean;
+ tableHeightMode?: 'autoPage' | 'fixedRows';
+ fixedRows?: number;
+ showHeader: boolean;
+ rowHeight: number;
+ headerHeight: number;
+ headerFontSize?: number;
+ bodyFontSize?: number;
+ headerBgColor?: string;
+ headerTextColor?: string;
+ footerLabelColumnKey?: string;
+ footerLabelText?: string;
+ footerLabelCenter?: boolean;
+ footerShowTotal?: boolean;
+ footerTotalMode?: 'overall' | 'page';
+ headerConfig?: NativeTableHeaderConfig;
+ columns: NativeTableColumn[];
+}
+
+export interface NativeFreeTableCell {
+ row: number;
+ col: number;
+ rowspan?: number;
+ colspan?: number;
+ text?: string;
+ bindField?: string;
+ /** å•å…ƒæ ¼å†…å®¹ç±»åž‹ï¼Œä¸Žæ˜Žç»†è¡¨åˆ— contentType 一致 */
+ contentType?: 'text' | 'image' | 'qrcode' | 'barcode' | 'number' | 'amount';
+ fillCell?: boolean;
+ contentScale?: number;
+ imageFit?: 'fill' | 'contain' | 'cover';
+ qrLevel?: 'L' | 'M' | 'Q' | 'H';
+ qrRenderType?: 'image/png' | 'image/jpeg' | 'image/webp';
+ barcodeFormat?: string;
+ decimalPlaces?: number;
+ roundHalfUp?: boolean;
+ amountType?: 'CNY' | 'USD' | 'EUR';
+ autoWrap?: boolean;
+ autoFitFont?: boolean;
+ align?: 'left' | 'center' | 'right';
+ verticalAlign?: 'top' | 'middle' | 'bottom';
+ fontSize?: number;
+ color?: string;
+ backgroundColor?: string;
+ /** 为 true 时强制ä¸ç»˜åˆ¶è¯¥ä¾§è¾¹æ¡†ï¼ˆä¸Žè¡¨æ ¼å±€éƒ¨å†…线/外框共åŒä½œç”¨ï¼‰ */
+ hideBorderTop?: boolean;
+ hideBorderRight?: boolean;
+ hideBorderBottom?: boolean;
+ hideBorderLeft?: boolean;
+}
+
+/** è¡¨æ ¼å¤–è½®å»“ï¼šç¼ºçœå››è¾¹å‡æ˜¾ç¤ºï¼ˆå—段为 false æ—¶éšè—该边) */
+export interface NativeFreeTableOuterBorder {
+ top?: boolean;
+ right?: boolean;
+ bottom?: boolean;
+ left?: boolean;
+}
+
+/** è¡¨æ ¼å†…éƒ¨ç½‘æ ¼çº¿ï¼šç¼ºçœæ¨ªå‘ã€çºµå‘凿˜¾ç¤º */
+export interface NativeFreeTableInnerBorder {
+ /** 行间横线 */
+ horizontal?: boolean;
+ /** 列间竖线 */
+ vertical?: boolean;
+}
+
+export interface NativeFreeTableElement extends NativeElementBase {
+ type: 'freeTable';
+ rowCount: number;
+ colCount: number;
+ /** å„列宽度(mm),长度与 colCount ä¸€è‡´ï¼›æœªè®¾ç½®æ—¶æŒ‰å…ƒç´ w å‡åˆ† */
+ colWidths?: number[];
+ /** å„行高度(mm),长度与 rowCount ä¸€è‡´ï¼›æœªè®¾ç½®æ—¶æŒ‰å…ƒç´ h å‡åˆ† */
+ rowHeights?: number[];
+ borderColor?: string;
+ borderWidth?: number;
+ /** è¡¨æ ¼å¤–è½®å»“çº¿åž‹ï¼ˆå››è¾¹æœ€å¤–ä¸€åœˆï¼‰ */
+ outerBorderLineStyle?: FreeTableLineStyleKey;
+ /** è¡Œé—´æ¨ªçº¿ï¼ˆå†…éƒ¨æ°´å¹³ç½‘æ ¼çº¿ï¼‰çº¿åž‹ */
+ innerBorderHorizontalLineStyle?: FreeTableLineStyleKey;
+ /** åˆ—é—´ç«–çº¿ï¼ˆå†…éƒ¨åž‚ç›´ç½‘æ ¼çº¿ï¼‰çº¿åž‹ */
+ innerBorderVerticalLineStyle?: FreeTableLineStyleKey;
+ /** è¡¨æ ¼å¤–æ¡†å››è¾¹æ˜¾ç¤ºå¼€å…³ */
+ outerBorder?: NativeFreeTableOuterBorder;
+ /** 内部横线/竖线显示开关 */
+ innerBorder?: NativeFreeTableInnerBorder;
+ cells: NativeFreeTableCell[];
+}
+
+export type NativeElement =
+ | NativeTextElement
+ | NativeReportBandElement
+ | NativeImageElement
+ | NativeCodeElement
+ | NativeTableElement
+ | NativeFreeTableElement;
+
+export interface NativePageConfig {
+ width: number;
+ height: number;
+ unit: 'mm';
+ margin: [number, number, number, number];
+ gridSize: number;
+}
+
+/** éžæ˜Žç»†ç±»ç»„ä»¶å¯ç”¨çš„ç»‘å®šå‚æ•°ï¼ˆä¸»æ•°æ®å—段路径ç‰ï¼‰ */
+export interface NativeDataBindingParam {
+ key: string;
+ label?: string;
+}
+
+/** æ˜Žç»†è¡¨ä¸‹çš„å—æ®µå®šä¹‰ */
+export interface NativeDataBindingDetailField {
+ key: string;
+ label?: string;
+}
+
+/** æ˜Žç»†æ•°æ®æºï¼šè¡¨å + å—æ®µåˆ—è¡¨ï¼ˆæ ‘çŠ¶ç»´æŠ¤ï¼‰ */
+export interface NativeDataBindingDetailTable {
+ /** ä¸Žæ˜Žç»†è¡¨æ ¼å…ƒç´ çš„ source 对应,如 detailList */
+ tableKey: string;
+ label?: string;
+ fields: NativeDataBindingDetailField[];
+}
+
+export interface NativeTemplateSchema {
+ engine: 'native';
+ version: string;
+ page: NativePageConfig;
+ elements: NativeElement[];
+ dataBinding?: {
+ fieldMap?: Record;
+ tableSources?: string[];
+ /** 傿•°ï¼šä¾›æ–‡æœ¬/è‡ªç”±è¡¨æ ¼ç‰éžæ˜Žç»†ç»„ä»¶ bindField å‚考 */
+ params?: NativeDataBindingParam[];
+ /** å—æ®µæ ‘ï¼šä¾›æ˜Žç»†è¡¨æ ¼ç‰æŒ‰æ˜Žç»† source 绑定å‚考 */
+ detailTables?: NativeDataBindingDetailTable[];
+ };
+}
+
+export interface NativeDesignerState {
+ schema: NativeTemplateSchema;
+ selectedId: string;
+ scale: number;
+}
diff --git a/jeecgboot-vue3/src/views/print/template/native/core/useDesignerStore.ts b/jeecgboot-vue3/src/views/print/template/native/core/useDesignerStore.ts
new file mode 100644
index 0000000..eb66508
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/native/core/useDesignerStore.ts
@@ -0,0 +1,386 @@
+import { computed, reactive } from 'vue';
+import type {
+ NativeDesignerState,
+ NativeElement,
+ NativeElementType,
+ NativeFreeTableElement,
+ NativeTableElement,
+ NativeTemplateSchema,
+} from './types';
+
+const MM_TO_PX = 3.7795275591;
+
+function uid(prefix: string) {
+ return `${prefix}_${Math.random().toString(36).slice(2, 10)}`;
+}
+
+export function createDefaultSchema(): NativeTemplateSchema {
+ return {
+ engine: 'native',
+ version: '1.0.0',
+ page: {
+ width: 210,
+ height: 297,
+ unit: 'mm',
+ margin: [10, 10, 10, 10],
+ gridSize: 2,
+ },
+ elements: [],
+ dataBinding: {
+ fieldMap: {},
+ tableSources: ['mainTable', 'detailList'],
+ params: [],
+ detailTables: [],
+ },
+ };
+}
+
+function createTableColumns() {
+ return [
+ {
+ key: uid('col'),
+ title: '列1',
+ field: 'field1',
+ bindField: 'field1',
+ width: 30,
+ align: 'left' as const,
+ contentType: 'text' as const,
+ fontFamily: '',
+ fontSize: 12,
+ useCustomFontSize: false,
+ fontColor: '#111111',
+ autoFitFont: false,
+ autoWrap: true,
+ fillCell: true,
+ contentScale: 100,
+ imageFit: 'contain' as const,
+ qrLevel: 'M' as const,
+ qrRenderType: 'image/png' as const,
+ barcodeFormat: 'CODE128',
+ decimalPlaces: 2,
+ roundHalfUp: true,
+ amountType: 'CNY' as const,
+ enableFooterTotal: false,
+ mergeByValue: false,
+ },
+ {
+ key: uid('col'),
+ title: '列2',
+ field: 'field2',
+ bindField: 'field2',
+ width: 30,
+ align: 'left' as const,
+ contentType: 'text' as const,
+ fontFamily: '',
+ fontSize: 12,
+ useCustomFontSize: false,
+ fontColor: '#111111',
+ autoFitFont: false,
+ autoWrap: true,
+ fillCell: true,
+ contentScale: 100,
+ imageFit: 'contain' as const,
+ qrLevel: 'M' as const,
+ qrRenderType: 'image/png' as const,
+ barcodeFormat: 'CODE128',
+ decimalPlaces: 2,
+ roundHalfUp: true,
+ amountType: 'CNY' as const,
+ enableFooterTotal: false,
+ mergeByValue: false,
+ },
+ {
+ key: uid('col'),
+ title: '列3',
+ field: 'field3',
+ bindField: 'field3',
+ width: 30,
+ align: 'left' as const,
+ contentType: 'text' as const,
+ fontFamily: '',
+ fontSize: 12,
+ useCustomFontSize: false,
+ fontColor: '#111111',
+ autoFitFont: false,
+ autoWrap: true,
+ fillCell: true,
+ contentScale: 100,
+ imageFit: 'contain' as const,
+ qrLevel: 'M' as const,
+ qrRenderType: 'image/png' as const,
+ barcodeFormat: 'CODE128',
+ decimalPlaces: 2,
+ roundHalfUp: true,
+ amountType: 'CNY' as const,
+ enableFooterTotal: false,
+ mergeByValue: false,
+ },
+ ];
+}
+
+export function createElementByType(type: NativeElementType, zIndex: number, defaultTableSource = 'List1'): NativeElement {
+ const base = { id: uid(type), type, bindField: '', region: 'body' as const, bandId: '', x: 20, y: 20, w: 60, h: 12, zIndex };
+ if (type === 'title') {
+ return { ...base, type, text: 'æ ‡é¢˜', h: 14, style: { fontSize: 20, fontWeight: 700, textAlign: 'center' } };
+ }
+ if (type === 'subtitle') {
+ return { ...base, type, text: 'å‰¯æ ‡é¢˜', style: { fontSize: 14, textAlign: 'center' } };
+ }
+ if (type === 'text') {
+ return { ...base, type, text: '文本内容', style: { fontSize: 12 } };
+ }
+ if (type === 'date') {
+ return { ...base, type, text: '日期', format: 'YYYY-MM-DD', style: { fontSize: 12 } };
+ }
+ if (type === 'pageNo') {
+ return { ...base, type, text: '第 {{pageNo}} / {{totalPages}} 页', style: { fontSize: 12 } };
+ }
+ if (type === 'reportHeader') {
+ return {
+ ...base,
+ type,
+ x: 10,
+ y: 10,
+ w: 190,
+ h: 16,
+ region: 'header',
+ text: '',
+ bookmarkText: '',
+ keepTogether: true,
+ centerWithDetail: true,
+ refreshPage: 'none',
+ visible: true,
+ stretch: false,
+ shrink: false,
+ printRepeated: false,
+ style: { fontSize: 12, fontWeight: 600, textAlign: 'left', backgroundColor: '#ffffff' },
+ } as any;
+ }
+ if (type === 'reportFooter') {
+ return {
+ ...base,
+ type,
+ x: 10,
+ y: 260,
+ w: 190,
+ h: 18,
+ region: 'footer',
+ text: '',
+ bookmarkText: '',
+ keepTogether: true,
+ centerWithDetail: true,
+ refreshPage: 'none',
+ visible: true,
+ stretch: false,
+ shrink: false,
+ printRepeated: false,
+ printAtPageBottom: false,
+ removeBlankWhenNoData: false,
+ style: { fontSize: 12, fontWeight: 600, textAlign: 'left', backgroundColor: '#ffffff' },
+ } as any;
+ }
+ if (type === 'image') {
+ return { ...base, type, w: 36, h: 24, src: '', fit: 'contain' };
+ }
+ if (type === 'qrcode') {
+ return { ...base, type, w: 24, h: 24, value: 'https://www.jeecg.com' };
+ }
+ if (type === 'barcode') {
+ return { ...base, type, w: 48, h: 18, value: '1234567890' };
+ }
+ if (type === 'freeTable') {
+ return {
+ ...base,
+ type,
+ w: 120,
+ h: 50,
+ rowCount: 3,
+ colCount: 3,
+ borderColor: '#d9d9d9',
+ borderWidth: 1,
+ outerBorderLineStyle: 'solid',
+ innerBorderHorizontalLineStyle: 'solid',
+ innerBorderVerticalLineStyle: 'solid',
+ cells: Array.from({ length: 3 }).flatMap((_, row) =>
+ Array.from({ length: 3 }).map((_c, col) => ({
+ row,
+ col,
+ rowspan: 1,
+ colspan: 1,
+ text: `å•å…ƒæ ¼${row + 1}-${col + 1}`,
+ bindField: '',
+ align: 'left',
+ verticalAlign: 'middle',
+ fontSize: 12,
+ color: '#111111',
+ backgroundColor: '#ffffff',
+ })),
+ ),
+ } as NativeFreeTableElement;
+ }
+ return {
+ ...base,
+ type,
+ w: 120,
+ h: 36,
+ source: defaultTableSource,
+ mergeColumnKeys: [],
+ strictGrouping: true,
+ enableMultiHeader: false,
+ tableHeightMode: 'autoPage',
+ fixedRows: 5,
+ showHeader: true,
+ rowHeight: 8,
+ headerHeight: 10,
+ headerFontSize: 12,
+ bodyFontSize: 12,
+ headerBgColor: '#f5f5f5',
+ headerTextColor: '#111111',
+ footerLabelColumnKey: '',
+ footerLabelText: 'åˆè®¡',
+ footerLabelCenter: true,
+ footerShowTotal: true,
+ footerTotalMode: 'overall',
+ columns: createTableColumns(),
+ } as NativeTableElement;
+}
+
+export function useDesignerStore() {
+ const state = reactive({
+ schema: createDefaultSchema(),
+ selectedId: '',
+ scale: 1,
+ });
+
+ const selectedElement = computed(() => state.schema.elements.find((item) => item.id === state.selectedId) as NativeElement | undefined);
+
+ function setSchema(schema: NativeTemplateSchema) {
+ const merged: NativeTemplateSchema = {
+ ...schema,
+ dataBinding: {
+ fieldMap: { ...(schema.dataBinding?.fieldMap || {}) },
+ tableSources: Array.isArray(schema.dataBinding?.tableSources)
+ ? [...(schema.dataBinding!.tableSources as string[])]
+ : ['mainTable', 'detailList'],
+ params: Array.isArray(schema.dataBinding?.params) ? [...schema.dataBinding!.params!] : [],
+ detailTables: Array.isArray(schema.dataBinding?.detailTables)
+ ? schema.dataBinding!.detailTables!.map((t) => ({
+ ...t,
+ fields: Array.isArray(t.fields) ? [...t.fields] : [],
+ }))
+ : [],
+ },
+ };
+ state.schema = merged;
+ if (!merged.elements.some((item) => item.id === state.selectedId)) {
+ state.selectedId = '';
+ }
+ }
+
+ function addElement(type: NativeElementType) {
+ const zIndex = Math.max(0, ...state.schema.elements.map((item) => item.zIndex)) + 1;
+ const dts = state.schema.dataBinding?.detailTables ?? [];
+ const firstKey = dts.length && dts[0]?.tableKey ? String(dts[0].tableKey) : '';
+ const defaultTableSource = type === 'table' || type === 'detailTable' ? firstKey || 'List1' : '';
+ const element = createElementByType(type, zIndex, defaultTableSource);
+ state.schema.elements.push(element);
+ state.selectedId = element.id;
+ }
+
+ function removeSelected() {
+ if (!state.selectedId) return;
+ state.schema.elements = state.schema.elements.filter((item) => item.id !== state.selectedId);
+ state.selectedId = '';
+ }
+
+ function updateElement(id: string, patch: Partial) {
+ const target = state.schema.elements.find((item) => item.id === id);
+ if (!target) return;
+ Object.assign(target, patch);
+ }
+
+ function setSelected(id: string) {
+ state.selectedId = id;
+ }
+
+ /** åˆå¹¶æ›´æ–°æ¨¡æ¿ dataBindingï¼ˆå‚æ•°ã€æ˜Žç»†å—æ®µæ ‘ç‰ï¼‰ */
+ function patchDataBinding(patch: Partial>) {
+ const cur = state.schema.dataBinding || {
+ fieldMap: {},
+ tableSources: ['mainTable', 'detailList'],
+ params: [],
+ detailTables: [],
+ };
+ state.schema.dataBinding = {
+ ...cur,
+ ...patch,
+ };
+ }
+
+ function duplicateSelected() {
+ const source = selectedElement.value;
+ if (!source) return;
+ const zIndex = Math.max(0, ...state.schema.elements.map((item) => item.zIndex)) + 1;
+ const copied = JSON.parse(JSON.stringify(source)) as NativeElement;
+ copied.id = uid(source.type);
+ copied.x += 6;
+ copied.y += 6;
+ copied.zIndex = zIndex;
+ state.schema.elements.push(copied);
+ state.selectedId = copied.id;
+ }
+
+ function bringForward() {
+ const target = selectedElement.value;
+ if (!target) return;
+ target.zIndex += 1;
+ }
+
+ function sendBackward() {
+ const target = selectedElement.value;
+ if (!target) return;
+ target.zIndex = Math.max(1, target.zIndex - 1);
+ }
+
+ function setScale(scale: number) {
+ state.scale = Math.min(2, Math.max(0.2, scale));
+ }
+
+ function serialize() {
+ return JSON.stringify(state.schema);
+ }
+
+ function deserialize(raw: string) {
+ const parsed = JSON.parse(raw || '{}') as NativeTemplateSchema;
+ if (parsed?.engine !== 'native' || !Array.isArray(parsed.elements) || !parsed.page) {
+ throw new Error('æ¨¡æ¿ JSON 䏿˜¯åŽŸç”Ÿè®¾è®¡å™¨æ ¼å¼');
+ }
+ setSchema(parsed);
+ }
+
+ function pagePxSize() {
+ return {
+ width: state.schema.page.width * MM_TO_PX,
+ height: state.schema.page.height * MM_TO_PX,
+ };
+ }
+
+ return {
+ MM_TO_PX,
+ state,
+ selectedElement,
+ setSchema,
+ patchDataBinding,
+ addElement,
+ removeSelected,
+ updateElement,
+ setSelected,
+ duplicateSelected,
+ bringForward,
+ sendBackward,
+ setScale,
+ serialize,
+ deserialize,
+ pagePxSize,
+ };
+}
diff --git a/jeecgboot-vue3/src/views/print/template/printTemplate.api.ts b/jeecgboot-vue3/src/views/print/template/printTemplate.api.ts
index 505a77e..53dbc7d 100644
--- a/jeecgboot-vue3/src/views/print/template/printTemplate.api.ts
+++ b/jeecgboot-vue3/src/views/print/template/printTemplate.api.ts
@@ -7,7 +7,12 @@ enum Api {
deleteOne = '/print/template/delete',
deleteBatch = '/print/template/deleteBatch',
queryById = '/print/template/queryById',
+ queryByCode = '/print/template/queryByCode',
+ queryPrinters = '/print/template/queryPrinters',
+ directPrint = '/print/template/directPrint',
+ directPrintPdf = '/print/template/directPrintPdf',
saveJson = '/print/template/saveJson',
+ analyzeImageForNative = '/print/template/analyzeImageForNative',
}
export const list = (params) => defHttp.get({ url: Api.list, params });
@@ -28,7 +33,52 @@ export const batchDelete = (params, handleSuccess?) => {
});
};
-export const queryById = (id: string) => defHttp.get({ url: Api.queryById, params: { id } });
+export const queryById = (id: string) => defHttp.get({ url: Api.queryById, params: { id, _t: Date.now() } });
+export const queryByCode = (code: string) => defHttp.get({ url: Api.queryByCode, params: { code, _t: Date.now() } });
+
+export const queryPrinters = () => defHttp.get({ url: Api.queryPrinters });
+/** æœåŠ¡ç«¯ç›´æ‰“ï¼Œé˜Ÿåˆ—è¾ƒæ…¢æ—¶é€‚å½“æ”¾å®½ */
+export const directPrint = (data: { templateCode: string; printerName?: string; dataJson: any }) =>
+ defHttp.post({ url: Api.directPrint, data, timeout: 60 * 1000 });
+/** ä¸Šä¼ Base64 PDF + åŽç«¯æ¸²æŸ“打å°ï¼Œè€—æ—¶æ˜Žæ˜¾é•¿äºŽæ™®é€šæŽ¥å£ */
+export const directPrintPdf = (data: { templateCode: string; printerName?: string; dataJson: any; pdfBase64: string; fileName?: string }) =>
+ defHttp.post({ url: Api.directPrintPdf, data, timeout: 3 * 60 * 1000 });
export const saveJson = (data: { id: string; templateJson: string }) =>
defHttp.post({ url: Api.saveJson, data }, { successMessageMode: 'message' });
+
+/** ä¸Šä¼ å›¾ç‰‡ç”±åŽå°ç”ŸæˆåŽŸç”Ÿæ¨¡æ¿ JSON(Base64,é¿å… FormData 与ç¾å拦截问题) */
+export const analyzeImageForNative = (data: { imageBase64: string; filename?: string; mime?: string }) =>
+ defHttp.post<{
+ templateJson: string;
+ mockDataJson: string;
+ aiUsed: boolean;
+ hint?: string;
+ }>({ url: Api.analyzeImageForNative, data, timeout: 120000 }, { successMessageMode: 'none' });
+
+/** è¯»å–æœ¬åœ°å›¾ç‰‡ä¸º Data URL åŽè°ƒç”¨ analyzeImageForNative */
+export function analyzeImageForNativeFile(file: File): Promise<{
+ templateJson: string;
+ mockDataJson: string;
+ aiUsed: boolean;
+ hint?: string;
+}> {
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onload = async () => {
+ try {
+ const imageBase64 = String(reader.result || '');
+ const res = await analyzeImageForNative({
+ imageBase64,
+ filename: file.name,
+ mime: file.type || undefined,
+ });
+ resolve(res);
+ } catch (e) {
+ reject(e);
+ }
+ };
+ reader.onerror = () => reject(new Error('读å–图片失败'));
+ reader.readAsDataURL(file);
+ });
+}
diff --git a/jeecgboot-vue3/src/views/print/template/printTemplate.data.ts b/jeecgboot-vue3/src/views/print/template/printTemplate.data.ts
index e5e343e..a12496d 100644
--- a/jeecgboot-vue3/src/views/print/template/printTemplate.data.ts
+++ b/jeecgboot-vue3/src/views/print/template/printTemplate.data.ts
@@ -1,5 +1,52 @@
import { BasicColumn, FormSchema } from '/@/components/Table';
+export const PRINT_TEMPLATE_CATEGORY_DICT = 'print_template_category';
+export const PRINT_PAPER_PRESET_DICT = 'print_paper_preset';
+
+export const CATEGORY_OPTIONS = [
+ { label: 'æ¡ç ', value: 'barcode' },
+ { label: 'æ ‡ç¾', value: 'label' },
+ { label: '快递é¢å•', value: 'waybill' },
+ { label: 'åŠç‰Œ', value: 'hangtag' },
+ { label: '物料å¡', value: 'materialCard' },
+ { label: '箱唛', value: 'cartonMark' },
+ { label: '质检å•', value: 'qc' },
+ { label: '入库å•', value: 'inbound' },
+ { label: '出库å•', value: 'outbound' },
+ { label: 'å·¥å•', value: 'workOrder' },
+ { label: '表å•套打', value: 'form' },
+ { label: '报表', value: 'report' },
+];
+
+export const CATEGORY_LABEL_MAP = CATEGORY_OPTIONS.reduce>((acc, item) => {
+ acc[item.value] = item.label;
+ return acc;
+}, {});
+
+export const PAPER_PRESET_MAP: Record<
+ string,
+ { width: number; height: number; orientation: 'portrait' | 'landscape' }
+> = {
+ A4: { width: 210, height: 297, orientation: 'portrait' },
+ A5: { width: 148, height: 210, orientation: 'portrait' },
+ A6: { width: 105, height: 148, orientation: 'portrait' },
+ B5: { width: 176, height: 250, orientation: 'portrait' },
+ B6: { width: 125, height: 176, orientation: 'portrait' },
+ L_10_12: { width: 10, height: 12, orientation: 'portrait' },
+ L_20_10: { width: 20, height: 10, orientation: 'landscape' },
+ L_25_15: { width: 25, height: 15, orientation: 'landscape' },
+ L_30_20: { width: 30, height: 20, orientation: 'landscape' },
+ L_40_30: { width: 40, height: 30, orientation: 'landscape' },
+ L_50_30: { width: 50, height: 30, orientation: 'landscape' },
+ L_60_40: { width: 60, height: 40, orientation: 'landscape' },
+ L_70_50: { width: 70, height: 50, orientation: 'landscape' },
+ L_80_50: { width: 80, height: 50, orientation: 'landscape' },
+ L_90_60: { width: 90, height: 60, orientation: 'landscape' },
+ L_100_70: { width: 100, height: 70, orientation: 'landscape' },
+ L_100_150: { width: 100, height: 150, orientation: 'portrait' },
+ L_100_180: { width: 100, height: 180, orientation: 'portrait' },
+};
+
export const columns: BasicColumn[] = [
{ title: '模æ¿ç¼–ç ', dataIndex: 'templateCode', width: 140 },
{ title: '模æ¿åç§°', dataIndex: 'templateName', width: 180 },
@@ -7,10 +54,7 @@ export const columns: BasicColumn[] = [
title: '分类',
dataIndex: 'category',
width: 100,
- customRender: ({ text }) => {
- const m = { barcode: 'æ¡ç ', form: '表å•套打', report: '报表' };
- return m[text] || text;
- },
+ customRender: ({ text }) => CATEGORY_LABEL_MAP[text] || text,
},
{
title: 'çº¸å¼ (mm)',
@@ -31,13 +75,9 @@ export const searchFormSchema: FormSchema[] = [
{
label: '分类',
field: 'category',
- component: 'Select',
+ component: 'JDictSelectTag',
componentProps: {
- options: [
- { label: 'æ¡ç ', value: 'barcode' },
- { label: '表å•套打', value: 'form' },
- { label: '报表', value: 'report' },
- ],
+ dictCode: PRINT_TEMPLATE_CATEGORY_DICT,
allowClear: true,
},
colProps: { span: 6 },
@@ -62,17 +102,33 @@ export const formSchema: FormSchema[] = [
{
label: '分类',
field: 'category',
- component: 'Select',
+ component: 'JDictSelectTag',
defaultValue: 'form',
componentProps: {
- options: [
- { label: 'æ¡ç ', value: 'barcode' },
- { label: '表å•套打', value: 'form' },
- { label: '报表', value: 'report' },
- ],
+ dictCode: PRINT_TEMPLATE_CATEGORY_DICT,
},
required: true,
},
+ {
+ label: 'çº¸å¼ è§„æ ¼',
+ field: 'paperPreset',
+ component: 'JDictSelectTag',
+ defaultValue: 'A4',
+ componentProps: ({ formModel }) => ({
+ dictCode: PRINT_PAPER_PRESET_DICT,
+ allowClear: true,
+ placeholder: 'é€‰æ‹©é¢„è®¾è§„æ ¼æˆ–è‡ªå®šä¹‰',
+ onChange: (value: string) => {
+ const preset = PAPER_PRESET_MAP[String(value || '')];
+ if (!preset) {
+ return;
+ }
+ formModel.paperWidthMm = preset.width;
+ formModel.paperHeightMm = preset.height;
+ formModel.paperOrientation = preset.orientation;
+ },
+ }),
+ },
{
label: '纸宽(mm)',
field: 'paperWidthMm',
diff --git a/jeecgboot-vue3/src/views/print/template/quickPrintPreviewStorage.ts b/jeecgboot-vue3/src/views/print/template/quickPrintPreviewStorage.ts
new file mode 100644
index 0000000..c608566
--- /dev/null
+++ b/jeecgboot-vue3/src/views/print/template/quickPrintPreviewStorage.ts
@@ -0,0 +1,2 @@
+/** 快速打å°ã€Œè®¾è®¡å™¨åŒæºé¢„览ã€å†™å…¥ sessionStorage 的键(PrintDesigner ä¸Žåˆ—è¡¨é¡µå…±ç”¨ï¼Œå‹¿éšæ„改å) */
+export const QUICK_PRINT_PREVIEW_STORAGE_KEY = 'qhmes_quick_print_preview_v1';
diff --git a/replay_pid6216.log b/replay_pid6216.log
new file mode 100644
index 0000000..a43e10d
--- /dev/null
+++ b/replay_pid6216.log
@@ -0,0 +1,10155 @@
+version 2
+JvmtiExport can_access_local_variables 0
+JvmtiExport can_hotswap_or_post_breakpoint 1
+JvmtiExport can_post_on_exceptions 0
+# 382 ciObject found
+instanceKlass org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding
+ciMethodData java/lang/Object ()V 2 7349198 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 4 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData java/util/AbstractCollection ()V 2 1258976 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x10002 0x1335f6 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData java/util/Arrays copyOf ([Ljava/lang/Object;I)[Ljava/lang/Object; 2 76752 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 19 0x30005 0x12bd1 0x0 0x0 0x0 0x0 0x0 0x60002 0x12bd0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0x0 oops 0 methods 0
+ciMethodData jdk/internal/util/ArraysSupport newLength (III)I 2 14838 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 23 0x30002 0x39f6 0xa0007 0x0 0x40 0x39f6 0x100007 0x0 0x20 0x39f6 0x170002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0
+ciMethodData java/util/ArrayList add (Ljava/lang/Object;)Z 2 419684 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 17 0x140005 0x66758 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xe 0x0 oops 0 methods 0
+ciMethodData java/util/ArrayList add (Ljava/lang/Object;[Ljava/lang/Object;I)V 2 419668 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 30 0x30007 0x4d9d7 0x58 0x18db1 0x70005 0x18db3 0x0 0x0 0x0 0x0 0x0 0xe0104 0x0 0x0 0x19a7d800518 0x14a2 0x19a05deb9d0 0x3 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x4 0xc 0x0 0xffffffffffffffff 0x0 oops 2 14 java/lang/Class 16 lombok/patcher/scripts/AddFieldScript methods 0
+ciMethodData java/util/ArrayList grow ()[Ljava/lang/Object; 2 103531 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 16 0x70005 0x1946b 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xc oops 0 methods 0
+ciMethodData java/util/ArrayList grow (I)[Ljava/lang/Object; 2 5241 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 24 0x70007 0x190 0x40 0x12e9 0x110007 0x12e5 0x40 0x4 0x1b0002 0x194 0x250002 0x194 0x310002 0x12e5 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xc 0x0 oops 0 methods 0
+ciMethodData java/util/AbstractList ()V 2 879092 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x10002 0xd6a0b 0x0 0x0 0x0 0x0 0x9 0x1 0x6 oops 0 methods 0
+ciMethodData java/util/ArrayList toArray ([Ljava/lang/Object;)[Ljava/lang/Object; 2 8451 orig 80 2 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 36 0x60007 0x10d7 0x68 0x102c 0x120005 0x102c 0x0 0x0 0x0 0x0 0x0 0x8000000400150002 0x102d 0x8000000600240002 0x10da 0x2d0007 0x10c8 0x58 0x17 0x360104 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 0 methods 0
+ciMethodData java/util/ArrayList (I)V 2 5121 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 51 0x10002 0x1401 0x50007 0x36a 0x38 0x1097 0x100003 0x1097 0x118 0x140007 0x0 0x38 0x36a 0x1e0003 0x36a 0xe0 0x290002 0x0 0x2e0005 0x0 0x0 0x0 0x0 0x0 0x0 0x320005 0x0 0x0 0x0 0x0 0x0 0x0 0x350005 0x0 0x0 0x0 0x0 0x0 0x0 0x380002 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xe 0x0 oops 0 methods 0
+ciMethod org/eclipse/jdt/core/compiler/CharOperation equals ([C[C)Z 582 0 677429 0 -1
+ciMethod org/eclipse/jdt/core/compiler/CharOperation equals ([C[CII)Z 166 0 11497 0 -1
+ciMethod org/eclipse/jdt/core/compiler/CharOperation indexOf (C[CI)I 4322 21320 12137 0 288
+ciMethod org/eclipse/jdt/core/compiler/CharOperation subarray ([CII)[C 176 0 5216 0 528
+ciMethod org/eclipse/jdt/internal/compiler/impl/ITypeRequestor accept (Lorg/eclipse/jdt/internal/compiler/env/IModule;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;)V 562 0 569 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding ()V 516 0 27080 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding enclosingType ()Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 256 0 128 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding isParameterizedType ()Z 256 0 128 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding hasNullTypeAnnotations ()Z 952 0 68360 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding hasTypeAnnotations ()Z 550 0 104780 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding setTypeAnnotations ([Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding;Z)V 0 0 28 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding typeVariables ()[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding; 8 0 4 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeBinding isUnresolvedType ()Z 292 0 146 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/Binding ()V 520 0 69823 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding ()V 512 0 24058 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding computeId (Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;)V 512 0 9433 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding depth ()I 520 36 977 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding getMemberType ([C)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 518 0 1524 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding isStatic ()Z 42 0 46669 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/Scope referenceCompilationUnit ()Lorg/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration; 456 0 47732 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding ([CLorg/eclipse/jdt/internal/compiler/lookup/Binding;ILorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;)V 480 0 8913 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding isPrototype ()Z 518 0 22143 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setFirstBound (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 512 0 7454 0 1104
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setSuperClass (Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 3632 0 8373 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setSuperInterfaces ([Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)[Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 518 0 7860 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding getDerivedTypesForDeferredInitialization ()[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 0 0 6 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/ElementValuePair ([CLjava/lang/Object;Lorg/eclipse/jdt/internal/compiler/lookup/MethodBinding;)V 344 0 8661 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/problem/ProblemReporter corruptedSignature (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;[CI)V 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/problem/ProblemReporter isClassPathCorrect ([[CLorg/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration;Lorg/eclipse/jdt/internal/compiler/ast/Location;ZLorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)V 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/problem/ProblemReporter undefinedTypeVariableSignature ([CLorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)V 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation getTypeName ()[C 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation getElementValuePairs ()[Lorg/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/IBinaryAnnotation isExternalAnnotation ()Z 256 0 2498 0 -1
+ciMethodData org/eclipse/jdt/core/compiler/CharOperation indexOf (C[CI)I 2 9976 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 20 0x20003 0x26f8 0x38 0x90007 0xa82d 0x20 0x18c5 0x140007 0xc0f2 0xffffffffffffffe0 0xe33 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0
+ciMethod org/eclipse/jdt/internal/compiler/env/IModuleAwareNameEnvironment getModule ([C)Lorg/eclipse/jdt/internal/compiler/env/IModule; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getModule ([C)Lorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding; 532 0 6422 0 4728
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment javaBaseModule ()Lorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding; 320 0 7819 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment createUnresolvedAnnotation (Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;[Lorg/eclipse/jdt/internal/compiler/lookup/ElementValuePair;)Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 512 0 5169 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment createArrayType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;I[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ArrayBinding; 74 0 2568 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment createMissingType (Lorg/eclipse/jdt/internal/compiler/lookup/PackageBinding;[[C)Lorg/eclipse/jdt/internal/compiler/lookup/MissingTypeBinding; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment createParameterizedType (Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding; 362 0 6371 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getResolvedType ([[CLorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding;Lorg/eclipse/jdt/internal/compiler/lookup/Scope;Z)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 514 0 5438 0 32152
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getResolvedJavaBaseType ([[CLorg/eclipse/jdt/internal/compiler/lookup/Scope;)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 286 0 5270 0 328
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getType ([[CLorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 282 282 4267 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeArgumentsFromSignature (Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 338 24 6342 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeFromConstantPoolName ([CIIZ[[[C)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 376 0 13449 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeFromSignature ([CIIZLorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 792 128 31207 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment annotateType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;[[[C)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 26 0 8453 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment countNonStaticNestingLevels (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)I 0 0 205 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeFromTypeSignature (Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 88 12 23925 0 58664
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeFromTypeVariable (Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;I[[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding;Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;[[[C)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 124 0 13503 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getUnannotatedType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 512 0 9434 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getAnnotatedTypes (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 0 0 6 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding convertMemberValue (Ljava/lang/Object;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;[[[CZ)Ljava/lang/Object; 34 10 4452 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createAnnotation (Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;[[[C)Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 38 18 5169 0 3272
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createAnnotations ([Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;[[[C)[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 586 38 6980 0 608
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding resolveType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;Z)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 118 0 17492 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createTypeVariables (Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;Z[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;Z)[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding; 1058 33780 2570 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding initializeTypeVariable (Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)V 424 0 3520 0 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding isPrototype ()Z 526 0 250869 0 104
+ciMethod org/eclipse/jdt/internal/compiler/lookup/TypeSystem getUnannotatedType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 518 0 12561 0 2080
+ciMethod org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem flattenedAnnotations ([[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding;)[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 146 0 5254 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/util/HashtableOfModule get ([C)Lorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding; 402 450 3541 0 -1
+ciMethodData org/eclipse/jdt/core/compiler/CharOperation subarray ([CII)[C 2 5128 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 29 0x20007 0x12e3 0x20 0x125 0xa0007 0x1408 0x20 0x0 0x100007 0x1408 0x20 0x0 0x180007 0x1408 0x20 0x0 0x2a0002 0x1408 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0x0 0x0 oops 0 methods 0
+ciMethod org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair getName ()[C 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/IBinaryElementValuePair getValue ()Ljava/lang/Object; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker toTypeParameter (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker toTypeParameterBounds (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker toTypeBound (S)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker toNextArrayDimension ()Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker toNextNestedType ()Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker getAnnotationsAtCursor (IZ)[Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation; 0 0 1 0 -1
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getModule ([C)Lorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding; 2 6156 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 87 0x50007 0x11c0 0x58 0x64c 0xd0005 0x0 0x0 0x19a04f83910 0x64c 0x0 0x0 0x120007 0x3fd 0x70 0xdc3 0x190007 0x2b1 0x50 0xb12 0x200002 0xb12 0x230007 0xb12 0x20 0x0 0x300005 0xb12 0x0 0x0 0x0 0x0 0x0 0x350007 0x805 0x158 0x30d 0x3c0007 0x0 0x138 0x30d 0x430004 0x0 0x0 0x19a0459df50 0x286 0x19a0459e000 0x87 0x470005 0x0 0x0 0x19a0459df50 0x286 0x19a0459e000 0x87 0x4e0007 0x145 0xa8 0x1c8 0x570005 0x0 0x0 0x19a0459e0b0 0x159 0x19a0459e160 0x6f 0x640005 0x1c8 0x0 0x0 0x0 0x0 0x0 0x680003 0x1c8 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0xffffffffffffffff 0xffffffffffffffff oops 7 7 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 43 org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment 45 org/eclipse/jdt/internal/core/builder/NameEnvironment 50 org/eclipse/jdt/internal/core/search/matching/JavaSearchNameEnvironment 52 org/eclipse/jdt/internal/core/builder/NameEnvironment 61 org/eclipse/jdt/internal/core/search/indexing/SourceIndexer 63 org/eclipse/jdt/internal/compiler/Compiler methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/Binding ()V 2 69563 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x10002 0x10fbb 0x0 0x0 0x0 0x0 0x9 0x1 0xc oops 0 methods 0
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus isPotentiallyUnannotatedLib ()Z 622 0 15673 0 184
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus values ()[Lorg/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus; 2 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus $SWITCH_TABLE$org$eclipse$jdt$internal$compiler$lookup$BinaryTypeBinding$ExternalAnnotationStatus ()[I 622 0 9542 0 120
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeParameterBounds (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 522 0 2311 0 80
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeBound (S)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 522 0 2314 0 80
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeParameter (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 522 0 2310 0 80
+ciMethod org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 getAnnotationsAtCursor (IZ)[Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation; 566 0 1358 0 88
+ciMethod org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper computeEnd ()I 550 0 10370 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper nextWord ()[C 0 0 1 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker restrict (JI)Lorg/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker; 636 0 3720 0 -1
+ciMethod org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker toTypeBound (S)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 538 0 274 0 0
+ciMethod org/eclipse/jdt/internal/compiler/classfmt/TypeAnnotationWalker toTypeBound (S)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 386 774 193 0 -1
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding isPrototype ()Z 2 250628 orig 80 1 0 0 0 1 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 13 0x8000000600050007 0x17 0x20 0x3d2f0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createAnnotations ([Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;[[[C)[Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 2 6687 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 41 0x10007 0x8a8 0x38 0x1177 0x50003 0x1177 0x18 0xc0007 0xc0 0x38 0x195f 0x120003 0x195f 0x18 0x1e0003 0x1a1f 0x60 0x2b0002 0xdb 0x2e0004 0x0 0x0 0x19a050e4798 0xdb 0x0 0x0 0x350007 0xdb 0xffffffffffffffb8 0x1a1f 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0xffffffffffffffff 0xffffffffffffffff oops 1 22 org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createAnnotation (Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation;Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;[[[C)Lorg/eclipse/jdt/internal/compiler/lookup/AnnotationBinding; 2 5150 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 130 0x10004 0xfffffffffffffff8 0x0 0x19a050e6d00 0x1416 0x0 0x0 0x40007 0x8 0xc0 0x1416 0x80004 0x0 0x0 0x19a050e6d00 0x1416 0x0 0x0 0x100007 0x1416 0x68 0x0 0x1a0002 0x0 0x1d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x210005 0x3 0x0 0x19a050e6d00 0x1416 0x19a05de9548 0x5 0x280007 0x141e 0x38 0x0 0x2c0003 0x0 0x18 0x350007 0x464 0x38 0xfba 0x3b0003 0xfba 0x18 0x480003 0x141e 0xe0 0x570005 0x0 0x0 0x19a05de95f8 0x4ed 0x0 0x0 0x600005 0x0 0x0 0x19a05de95f8 0x4ed 0x0 0x0 0x680002 0x4ed 0x6c0002 0x4ed 0x6f0004 0x0 0x0 0x19a050e7ce8 0x4ed 0x0 0x0 0x770007 0x4ed 0xffffffffffffff38 0x141e 0x7b0005 0x3 0x0 0x19a050e6d00 0x1416 0x19a05de9548 0x5 0x830005 0x3 0x0 0x19a050e6d00 0x1416 0x19a05de9548 0x5 0x880007 0x1416 0x38 0x8 0x8f0003 0x8 0x18 0xa10005 0x0 0x0 0x19a04f83910 0x141e 0x0 0x0 0xac0005 0x0 0x0 0x19a04f83910 0x141e 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 13 3 org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo 14 org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo 34 org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo 36 org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider$1 58 org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo 65 org/eclipse/jdt/internal/compiler/classfmt/ElementValuePairInfo 76 org/eclipse/jdt/internal/compiler/lookup/ElementValuePair 87 org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo 89 org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider$1 94 org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo 96 org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider$1 108 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 115 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeBinding hasTypeAnnotations ()Z 2 104505 orig 80 1 0 0 0 2 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 11 0x80000006000a0007 0x197ff 0x20 0x3d 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeBinding hasNullTypeAnnotations ()Z 2 67893 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 11 0x80000006000a0007 0x10924 0x20 0x12 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding createTypeVariables (Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;Z[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;Z)[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding; 2 2056 orig 80 2 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 178 0x10005 0x808 0x0 0x0 0x0 0x0 0x0 0x40007 0x808 0x30 0x0 0xb0002 0x0 0x250002 0x808 0x330003 0x808 0x2c0 0x3b0008 0xa 0xe557 0x128 0xbf7 0xb0 0xc0 0x60 0x0 0x128 0x8c9 0x78 0x5b0003 0xc0 0x248 0x630007 0xc0 0x230 0x809 0x660003 0x809 0x230 0x6b0007 0xfb 0x1f8 0xafc 0x740007 0x0 0x1d8 0xafc 0x8000000600800007 0x3 0x1b8 0xafa 0x860003 0xafa 0x198 0x8b0007 0xda5e 0x180 0xaf9 0x970002 0xaf9 0xa20002 0xaf9 0xb40002 0xaf9 0xc20005 0x3 0x0 0x19a07b7abf0 0x9e4 0x19a07b7aca0 0x112 0xc90005 0x3 0x0 0x19a07b7abf0 0x9e4 0x19a07b7aca0 0x112 0xd30002 0xaf9 0xda0007 0x0 0x78 0xaf9 0xe20007 0xaf9 0x58 0x0 0xf30005 0x0 0x0 0x0 0x0 0x0 0x0 0xfa0005 0x0 0x0 0x19a7d803dc8 0xaf9 0x0 0x0 0x1050007 0xfad7 0xfffffffffffffd58 0x0 0x1120005 0x0 0x0 0x19a7d803dc8 0x809 0x0 0x0 0x1170007 0x6d2 0x20 0x137 0x1230003 0x809 0x138 0x1360005 0x3 0x0 0x19a07b7abf0 0x9e5 0x19a07b7aca0 0x112 0x13b0005 0xafa 0x0 0x0 0x0 0x0 0x0 0x1420005 0xafa 0x0 0x0 0x0 0x0 0x0 0x1450007 0x112 0x78 0x9e8 0x14d0005 0x0 0x0 0x19a07b7a498 0x9e8 0x0 0x0 0x1500007 0x9e8 0x20 0x0 0x1610007 0xafa 0xfffffffffffffee0 0x809 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x6 0x0 0x0 0x0 0x0 0x0 0x0 oops 9 68 org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 70 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 75 org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 77 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 99 java/util/ArrayList 110 java/util/ArrayList 124 org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 126 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 149 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getTypeFromTypeSignature (Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 2 23881 orig 80 2 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 466 0x30003 0x5d49 0x18 0x1e0007 0x310 0x0 0x5d49 0x260007 0x5a3a 0x170 0x30f 0x2e0007 0x308 0x150 0x7 0x340003 0x7 0x110 0x3b0005 0x0 0x0 0x19a07b7aca0 0x7 0x0 0x0 0x430002 0x7 0x4d0007 0x7 0x78 0x0 0x520007 0x0 0x20 0x0 0x620004 0x0 0x0 0x0 0x0 0x0 0x0 0x650005 0x0 0x0 0x19a07b7aca0 0x7 0x0 0x0 0x730007 0x7 0xffffffffffffff08 0x7 0x810007 0x3b94 0x318 0x21b5 0x8d0005 0x0 0x0 0x19a07b7a1c8 0x21b5 0x0 0x0 0x960003 0x21b5 0x80 0xa80002 0x19c4 0xab0007 0x83b 0x58 0x1189 0xbb0005 0x1189 0x0 0x0 0x0 0x0 0x0 0xc40007 0x19c4 0xffffffffffffff98 0x102c 0xcb0004 0x0 0x0 0x19a07b79fa0 0x102c 0x0 0x0 0xce0007 0x0 0x70 0x102c 0xd20004 0x0 0x0 0x19a07b79fa0 0x102c 0x0 0x0 0xda0003 0x102c 0x50 0xde0005 0x0 0x0 0x0 0x0 0x0 0x0 0xe80003 0x102c 0x80 0xfb0002 0x1404 0xfe0007 0x3d8 0x58 0x102c 0x10f0005 0x102c 0x0 0x0 0x0 0x0 0x0 0x1180007 0x1404 0xffffffffffffff98 0x0 0x11c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x1210007 0x0 0xfffffffffffffe48 0x0 0x1300002 0x0 0x1350005 0x0 0x0 0x0 0x0 0x0 0x0 0x1440005 0x0 0x0 0x19a07b7a1c8 0x3b94 0x0 0x0 0x14f0007 0x2065 0x38 0x1b2f 0x1530003 0x1b2f 0x18 0x15f0005 0x0 0x0 0x19a04f83910 0x3b94 0x0 0x0 0x1660007 0x1b2f 0xa0 0x2065 0x16b0007 0x9c 0x38 0x1fc9 0x1700003 0x1fc9 0x60 0x17a0002 0x9c 0x17d0005 0x0 0x0 0x19a04f83910 0x9c 0x0 0x0 0x1830004 0x0 0x0 0x19a05f39c80 0xc6d 0x19a07b79fa0 0xec2 0x80000006018d0007 0x1aea 0x118 0x46 0x1920004 0xffffffffffffffdc 0x0 0x19a05f39c80 0x22 0x19a07b79fa0 0x1c 0x1950007 0x24 0xc0 0x22 0x19a0005 0x0 0x0 0x19a05f39c80 0x22 0x0 0x0 0x19d0007 0x21 0x68 0x1 0x1a40002 0x1 0x1a70004 0x0 0x0 0x19a07b79fa0 0x1 0x0 0x0 0x1ae0005 0x0 0x0 0x19a05f39c80 0xc6d 0x19a07b79fa0 0xec3 0x1bc0007 0x1aea 0x120 0x46 0x1c10005 0x0 0x0 0x19a05f39c80 0x21 0x19a07b79fa0 0x25 0x1c40007 0x40 0xc8 0x6 0x1ca0005 0x6 0x0 0x0 0x0 0x0 0x0 0x1d20003 0x6 0x50 0x1d70005 0x0 0x0 0x0 0x0 0x0 0x0 0x1e50007 0x0 0xffffffffffffffc8 0x6 0x1f20005 0x1b30 0x0 0x0 0x0 0x0 0x0 0x1fe0005 0x0 0x0 0x19a04f83910 0x1b30 0x0 0x0 0x2070003 0x1b34 0x3b8 0x21b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x2240002 0x0 0x2270004 0x0 0x0 0x0 0x0 0x0 0x0 0x2300005 0x0 0x0 0x0 0x0 0x0 0x0 0x2370007 0x0 0x58 0x0 0x2460005 0x0 0x0 0x0 0x0 0x0 0x0 0x24b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x24e0007 0x0 0x38 0x0 0x2550003 0x0 0x50 0x25a0005 0x0 0x0 0x0 0x0 0x0 0x0 0x26c0007 0x0 0x70 0x0 0x2830005 0x0 0x0 0x0 0x0 0x0 0x0 0x2880003 0x0 0x18 0x2900007 0x0 0xd0 0x0 0x2950005 0x0 0x0 0x0 0x0 0x0 0x0 0x2980007 0x0 0x120 0x0 0x29d0005 0x0 0x0 0x0 0x0 0x0 0x0 0x2a00007 0x0 0xc8 0x0 0x2a50005 0x0 0x0 0x0 0x0 0x0 0x0 0x2a80007 0x0 0x20 0x0 0x2b60005 0x0 0x0 0x0 0x0 0x0 0x0 0x2bb0003 0x0 0x18 0x2d10007 0x0 0xfffffffffffffc60 0x1b34 0x2e50005 0x1b34 0x0 0x0 0x0 0x0 0x0 0x2ec0007 0xe8 0x38 0x1a4c 0x2f10003 0x1a4c 0x60 0x2fb0002 0xe8 0x2fe0005 0x0 0x0 0x19a04f83910 0xe8 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x6 0x0 0x0 0x0 0x0 0x0 0x0 oops 20 21 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 45 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 60 org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper 87 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 98 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 155 org/eclipse/jdt/internal/compiler/lookup/SignatureWrapper 169 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 189 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 196 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 198 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 207 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 209 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 218 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 231 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 238 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 240 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 249 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 251 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 288 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 434 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeBinding ()V 2 26822 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 9 0x10002 0x68c6 0x0 0x0 0x0 0x0 0x9 0x1 0x1c oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 getAnnotationsAtCursor (IZ)[Lorg/eclipse/jdt/internal/compiler/env/IBinaryAnnotation; 2 1075 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeSystem getUnannotatedType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 2 12302 orig 80 1 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 144 0x30005 0x16b7 0x0 0x19a05f39c80 0x8ef 0x19a07b79fa0 0x1068 0x60007 0x271f 0x78 0x8ef 0xa0004 0x0 0x0 0x19a05f39c80 0x8ef 0x0 0x0 0x140007 0x8ef 0x20 0x0 0x1f0007 0x2d37 0x108 0x2d7 0x230005 0x2d7 0x0 0x0 0x0 0x0 0x0 0x260007 0x2d7 0x30 0x0 0x2d0002 0x0 0x3c0007 0x2d4 0x30 0x3 0x510002 0x3 0x6c0004 0x0 0x0 0x19a05f3a078 0x2d7 0x0 0x0 0x6d0003 0x2d7 0x1c8 0x790007 0x2d27 0x38 0x10 0x7d0003 0x10 0x18 0x8d0005 0x2d37 0x0 0x0 0x0 0x0 0x0 0x900007 0x2d1e 0x50 0x1a 0x940007 0x1a 0x30 0x0 0x9b0002 0x0 0xa00007 0x10 0x60 0x2d28 0xa70007 0x24bb 0x40 0x86d 0xb00007 0x86d 0x20 0x0 0xca0004 0x0 0x0 0x19a05f3a078 0x10 0x0 0x0 0xcb0003 0x10 0x58 0xd10007 0x0 0x40 0x0 0xda0007 0x0 0x20 0x0 0xe90007 0x265 0x40 0x82 0xf20007 0x82 0x20 0x0 0x1090004 0x0 0x0 0x19a05f39c80 0x82 0x19a07b79fa0 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 7 3 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 5 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 14 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 48 [Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 94 [Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 120 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 122 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment javaBaseModule ()Lorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding; 2 7659 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 42 0x40007 0x1ce 0x20 0x1c1d 0x110007 0x8 0x58 0x1c6 0x190005 0x0 0x0 0x19a04f83910 0x1c6 0x0 0x0 0x270007 0x0 0x58 0x8 0x2e0005 0x0 0x0 0x19a04f83910 0x8 0x0 0x0 0x340007 0x0 0x38 0x8 0x380003 0x8 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 2 11 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 22 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus isPotentiallyUnannotatedLib ()Z 2 15362 orig 80 1 0 0 0 1 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 30 0x2 0x3c02 0x40005 0x3c02 0x0 0x0 0x0 0x0 0x0 0x8000000600080008 0xa 0x0 0x60 0x0 0x60 0x3b96 0x60 0x0 0x60 0x6e 0x60 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding$ExternalAnnotationStatus $SWITCH_TABLE$org$eclipse$jdt$internal$compiler$lookup$BinaryTypeBinding$ExternalAnnotationStatus ()[I 2 9231 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 54 0x40007 0x0 0x20 0x240f 0x90002 0x0 0x140005 0x0 0x0 0x0 0x0 0x0 0x0 0x190003 0x0 0x18 0x210005 0x0 0x0 0x0 0x0 0x0 0x0 0x260003 0x0 0x18 0x2e0005 0x0 0x0 0x0 0x0 0x0 0x0 0x330003 0x0 0x18 0x3b0005 0x0 0x0 0x0 0x0 0x0 0x0 0x400003 0x0 0x18 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding ()V 2 23802 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x10002 0x5cfa 0x0 0x0 0x9 0x1 0x1c oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding isPrototype ()Z 2 21884 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 13 0x50007 0x4 0x20 0x5578 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding initializeTypeVariable (Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;[Lorg/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding;Lorg/eclipse/jdt/internal/compiler/lookup/SignatureWrapper;[[[CLorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker;)V 2 3308 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 175 0x10005 0xcec 0x0 0x0 0x0 0x0 0x0 0x40007 0xcec 0x30 0x0 0xb0002 0x0 0x190002 0xcec 0x370007 0xbb3 0x70 0x139 0x420005 0x0 0x0 0x19a04f83910 0x139 0x0 0x0 0x4e0003 0x139 0x168 0x640005 0x3 0x0 0x19a07b7abf0 0xaa7 0x19a07b7aca0 0x109 0x690005 0x0 0x0 0x19a04f83910 0xbb3 0x0 0x0 0x700004 0x0 0x0 0x19a07b79fa0 0xb96 0x19a05f39c80 0x6 0x730007 0x0 0x70 0xbb3 0x780004 0x0 0x0 0x19a07b79fa0 0xb96 0x19a05f39c80 0x6 0x7d0003 0xbb3 0x50 0x880005 0x0 0x0 0x0 0x0 0x0 0x0 0xa00005 0x0 0x0 0x19a07b7a498 0xcec 0x0 0x0 0xb20007 0xbb0 0x168 0x13c 0xba0002 0x13c 0xde0005 0x0 0x0 0x19a07b7abf0 0x133 0x19a07b7aca0 0x9 0xe30005 0x0 0x0 0x19a04f83910 0x13c 0x0 0x0 0xe60005 0x0 0x0 0x19a7d803dc8 0x13c 0x0 0x0 0xf50007 0x0 0xffffffffffffff58 0x13c 0xfa0005 0x0 0x0 0x19a7d803dc8 0x13c 0x0 0x0 0x1060005 0x0 0x0 0x19a7d803dc8 0x13c 0x0 0x0 0x10d0007 0x13c 0x38 0xbb0 0x1130003 0xbb0 0x18 0x1180005 0x0 0x0 0x19a07b7a498 0xcec 0x0 0x0 0x11e0007 0xbb3 0x58 0x139 0x1260007 0x139 0x38 0x0 0x12a0003 0x0 0x18 0x1380005 0x0 0x0 0x19a07b7a498 0xcec 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x6 0x0 0x0 0x0 0x0 0x0 0x0 oops 17 22 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 32 org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 34 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 39 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 46 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 48 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 57 org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding 59 org/eclipse/jdt/internal/compiler/lookup/UnresolvedReferenceBinding 74 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 87 org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 89 org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker 94 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 101 java/util/ArrayList 112 java/util/ArrayList 119 java/util/ArrayList 133 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 151 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding ([CLorg/eclipse/jdt/internal/compiler/lookup/Binding;ILorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;)V 2 8673 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 24 0x10002 0x21e1 0x430005 0x3 0x0 0x19a07b7a498 0x178e 0x19a04c52908 0xa50 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0x0 0x0 0x0 0x0 0x0 oops 2 5 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 7 org/eclipse/jdt/internal/compiler/lookup/InferenceVariable methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding computeId (Lorg/eclipse/jdt/internal/compiler/lookup/LookupEnvironment;)V 2 9177 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 17 0x20005 0x0 0x0 0x19a04f83910 0x23d9 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 1 3 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getUnannotatedType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 2 9178 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 17 0x50005 0x23da 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setFirstBound (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 2 7198 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 68 0x10005 0x0 0x0 0x19a07b7a498 0x1b87 0x19a7f0ead18 0x97 0x40007 0x1c1c 0x58 0x2 0xc0005 0x0 0x0 0x19a07b7a498 0x2 0x0 0x0 0x1f0007 0x1c19 0x120 0x3 0x230005 0x0 0x0 0x19a07b7a498 0x3 0x0 0x0 0x2a0007 0x3 0x38 0x0 0x2e0003 0x0 0x18 0x350003 0x3 0x70 0x3b0004 0x0 0x0 0x19a07b7a498 0x6 0x0 0x0 0x470007 0x0 0x20 0x6 0x620007 0x6 0xffffffffffffffa8 0x3 0x660007 0x25 0x20 0x1bf7 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 5 3 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 5 org/eclipse/jdt/internal/compiler/lookup/CaptureBinding 14 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 25 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 42 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding getDerivedTypesForDeferredInitialization ()[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 1 6 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 16 0x50005 0x0 0x0 0x19a04f83910 0x6 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x1 0xffffffffffffffff oops 1 3 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getAnnotatedTypes (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;)[Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding; 1 6 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 17 0x50005 0x0 0x0 0x19a10a58250 0x6 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0xffffffffffffffff oops 1 3 org/eclipse/jdt/internal/compiler/lookup/AnnotatableTypeSystem methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setSuperClass (Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 2 6572 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 68 0x10005 0x0 0x0 0x19a07b7a498 0x1706 0x19a7f0ead18 0x2a6 0x40007 0x19aa 0x58 0x2 0xc0005 0x0 0x0 0x19a07b7a498 0x2 0x0 0x0 0x160007 0x0 0x20 0x19aa 0x340007 0x19a7 0x120 0x3 0x380005 0x0 0x0 0x19a07b7a498 0x3 0x0 0x0 0x3f0007 0x3 0x38 0x0 0x430003 0x0 0x18 0x4a0003 0x3 0x70 0x500004 0x0 0x0 0x19a07b7a498 0x6 0x0 0x0 0x5c0007 0x0 0x20 0x6 0x770007 0x6 0xffffffffffffffa8 0x3 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 5 3 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 5 org/eclipse/jdt/internal/compiler/lookup/CaptureBinding 14 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 29 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 46 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding setSuperInterfaces ([Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding;)[Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 2 7601 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 60 0x10005 0x0 0x0 0x19a07b7a498 0x1a09 0x19a7f0ead18 0x3a8 0x40007 0x1db1 0x58 0x0 0xc0005 0x0 0x0 0x0 0x0 0x0 0x0 0x1f0007 0x1db1 0x100 0x0 0x230005 0x0 0x0 0x0 0x0 0x0 0x0 0x2a0007 0x0 0x38 0x0 0x2e0003 0x0 0x18 0x350003 0x0 0x50 0x3b0004 0x0 0x0 0x0 0x0 0x0 0x0 0x4c0007 0x0 0xffffffffffffffc8 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x2 0x0 0x0 oops 2 3 org/eclipse/jdt/internal/compiler/lookup/TypeVariableBinding 5 org/eclipse/jdt/internal/compiler/lookup/CaptureBinding methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeParameter (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 2 2049 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeParameterBounds (ZI)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 2 2050 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 7 0x0 0x0 0x9 0x3 0x0 0x0 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker$1 toTypeBound (S)Lorg/eclipse/jdt/internal/compiler/env/ITypeAnnotationWalker; 2 2053 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 6 0x0 0x0 0x9 0x2 0x0 0x0 oops 0 methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getResolvedType ([[CLorg/eclipse/jdt/internal/compiler/lookup/ModuleBinding;Lorg/eclipse/jdt/internal/compiler/lookup/Scope;Z)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 2 5181 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 63 0x50007 0xa47 0x58 0x9f6 0x110005 0x0 0x0 0x19a04f83910 0x9f6 0x0 0x0 0x180005 0x0 0x0 0x19a04f83910 0xa47 0x0 0x0 0x1f0007 0x0 0x20 0xa47 0x2b0007 0x0 0x38 0x0 0x350003 0x0 0x50 0x390005 0x0 0x0 0x0 0x0 0x0 0x0 0x460005 0x0 0x0 0x0 0x0 0x0 0x0 0x4c0005 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x5 0xffffffffffffffff 0xffffffffffffffff 0xffffffffffffffff 0xffffffffffffffff 0x0 oops 2 7 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 14 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciMethodData org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment getResolvedJavaBaseType ([[CLorg/eclipse/jdt/internal/compiler/lookup/Scope;)Lorg/eclipse/jdt/internal/compiler/lookup/ReferenceBinding; 2 5127 orig 80 0 0 0 0 0 0 0 0 0 0 0 0 154 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 data 25 0x30005 0x0 0x0 0x19a04f83910 0x1407 0x0 0x0 0x80005 0x0 0x0 0x19a04f83910 0x1407 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x9 0x3 0xffffffffffffffff 0xffffffffffffffff 0xffffffffffffffff oops 2 3 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment 10 org/eclipse/jdt/internal/compiler/lookup/LookupEnvironment methods 0
+ciInstanceKlass java/lang/Cloneable 1 0 7 100 1 100 1 1 1
+instanceKlass org/apache/http/impl/conn/PoolingHttpClientConnectionManager$2
+instanceKlass java/lang/Throwable$PrintStreamOrWriter
+instanceKlass org/codehaus/plexus/interpolation/util/StringUtils
+instanceKlass org/codehaus/plexus/interpolation/reflection/MethodMap
+instanceKlass org/codehaus/plexus/interpolation/reflection/ClassMap$CacheMiss
+instanceKlass org/codehaus/plexus/interpolation/reflection/ClassMap
+instanceKlass org/codehaus/plexus/interpolation/reflection/ReflectionValueExtractor$Tokenizer
+instanceKlass org/codehaus/plexus/interpolation/reflection/ReflectionValueExtractor
+instanceKlass org/codehaus/plexus/interpolation/util/ValueSourceUtils
+instanceKlass java/nio/file/attribute/PosixFileAttributes
+instanceKlass @bci org/apache/commons/io/IOUtils ()V 47 argL0 ; # org/apache/commons/io/IOUtils$$Lambda+0x0000019a3d827d38
+instanceKlass @bci org/apache/commons/io/IOUtils ()V 36 argL0 ; # org/apache/commons/io/IOUtils$$Lambda+0x0000019a3d827b18
+instanceKlass org/apache/commons/io/IOUtils
+instanceKlass org/codehaus/plexus/interpolation/PrefixAwareRecursionInterceptor
+instanceKlass org/codehaus/plexus/interpolation/SimpleRecursionInterceptor
+instanceKlass @bci org/apache/maven/shared/filtering/BaseFilter createInterpolator (Ljava/util/LinkedHashSet;Ljava/util/List;Lorg/codehaus/plexus/interpolation/ValueSource;Lorg/apache/maven/project/MavenProject;Lorg/apache/maven/execution/MavenSession;Ljava/lang/String;Z)Lorg/codehaus/plexus/interpolation/Interpolator; 126 argL0 ; # org/apache/maven/shared/filtering/BaseFilter$$Lambda+0x0000019a3d8259b8
+instanceKlass org/codehaus/plexus/interpolation/InterpolationPostProcessor
+instanceKlass org/codehaus/plexus/interpolation/SingleResponseValueSource
+instanceKlass org/codehaus/plexus/interpolation/PrefixedValueSourceWrapper
+instanceKlass org/codehaus/plexus/interpolation/FeedbackEnabledValueSource
+instanceKlass org/codehaus/plexus/interpolation/AbstractDelegatingValueSource
+instanceKlass org/codehaus/plexus/interpolation/QueryEnabledValueSource
+instanceKlass org/codehaus/plexus/interpolation/multi/DelimiterSpecification
+instanceKlass org/codehaus/plexus/interpolation/multi/MultiDelimiterStringSearchInterpolator
+instanceKlass org/apache/maven/shared/filtering/FilteringUtils
+instanceKlass org/apache/commons/io/FilenameUtils
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d820000
+instanceKlass org/eclipse/aether/resolution/ResolutionErrorPolicyRequest
+instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader$1
+instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader$ContentTransformer
+instanceKlass org/apache/maven/artifact/repository/metadata/io/xpp3/MetadataXpp3Reader
+instanceKlass @bci org/eclipse/aether/internal/impl/DefaultUpdateCheckManager setUpdated (Lorg/eclipse/aether/RepositorySystemSession;Ljava/lang/Object;)V 21 argL0 ; # org/eclipse/aether/internal/impl/DefaultUpdateCheckManager$$Lambda+0x0000019a3d81b7d8
+instanceKlass @bci org/eclipse/aether/internal/impl/DefaultFileProcessor write (Ljava/io/File;Ljava/lang/String;)V 5 member ; # org/eclipse/aether/internal/impl/DefaultFileProcessor$$Lambda+0x0000019a3d81b5b0
+instanceKlass org/eclipse/aether/util/FileUtils$FileWriter
+instanceKlass @bci org/eclipse/aether/connector/basic/ChecksumValidator validateChecksums (Ljava/util/Map;Lorg/eclipse/aether/spi/connector/checksum/ChecksumPolicy$ChecksumKind;Ljava/util/Map;)Z 79 member ; # org/eclipse/aether/connector/basic/ChecksumValidator$$Lambda+0x0000019a3d81b158
+instanceKlass @bci org/eclipse/aether/transport/http/HttpTransporter$EntityGetter extractChecksums (Lorg/apache/http/client/methods/CloseableHttpResponse;)V 68 member ; # org/eclipse/aether/transport/http/HttpTransporter$EntityGetter$$Lambda+0x0000019a3d81af20
+instanceKlass org/eclipse/aether/repository/LocalMetadataRegistration
+instanceKlass sun/security/ssl/SSLBasicKeyDerivation$SecretSizeSpec
+instanceKlass sun/security/ssl/SSLBasicKeyDerivation
+instanceKlass sun/security/provider/certpath/CertId
+instanceKlass sun/security/provider/certpath/OCSPResponse$SingleResponse
+instanceKlass sun/security/provider/certpath/OCSP$RevocationStatus
+instanceKlass sun/security/provider/certpath/ResponderId
+instanceKlass sun/security/provider/certpath/OCSPResponse
+instanceKlass sun/security/ssl/CertStatusExtension$CertStatusResponse
+instanceKlass sun/security/ssl/CertStatusExtension$CertStatusResponseSpec
+instanceKlass sun/security/ssl/CertificateMessage$CertificateEntry
+instanceKlass sun/security/ssl/SSLTrafficKeyDerivation$T13TrafficKeyDerivation
+instanceKlass sun/security/ssl/SSLSecretDerivation
+instanceKlass javax/crypto/MacSpi
+instanceKlass javax/crypto/Mac
+instanceKlass sun/security/ssl/HKDF
+instanceKlass sun/security/ssl/XDHKeyExchange$XDHEKAGenerator
+instanceKlass sun/security/ssl/XDHKeyExchange
+instanceKlass sun/security/ssl/KeyShareExtension$SHKeyShareSpec
+instanceKlass sun/security/ssl/HandshakeHash$T13HandshakeHash
+instanceKlass sun/security/ssl/SupportedVersionsExtension$SHSupportedVersionsSpec
+instanceKlass org/eclipse/aether/util/FileUtils$1
+instanceKlass java/nio/file/TempFileHelper
+instanceKlass org/eclipse/aether/util/ChecksumUtils
+instanceKlass org/apache/http/client/utils/DateUtils$DateFormatHolder
+instanceKlass org/apache/http/client/utils/DateUtils
+instanceKlass org/apache/http/util/EntityUtils
+instanceKlass org/eclipse/aether/transport/http/RFC9457/RFC9457Reporter
+instanceKlass org/apache/http/impl/cookie/BasicClientCookie
+instanceKlass org/apache/http/cookie/ClientCookie
+instanceKlass org/apache/http/message/BasicHeaderElement
+instanceKlass org/apache/http/message/BasicNameValuePair
+instanceKlass org/eclipse/aether/transport/http/AuthSchemePool
+instanceKlass org/apache/http/entity/HttpEntityWrapper
+instanceKlass org/apache/http/conn/EofSensorWatcher
+instanceKlass org/apache/http/impl/execchain/HttpResponseProxy
+instanceKlass org/apache/http/message/BasicHeaderValueParser
+instanceKlass org/apache/http/message/HeaderValueParser
+instanceKlass org/apache/http/message/BasicHeaderElementIterator
+instanceKlass org/apache/http/message/BasicHeaderIterator
+instanceKlass org/apache/http/message/BasicTokenIterator
+instanceKlass org/apache/http/entity/AbstractHttpEntity
+instanceKlass org/apache/http/message/BufferedHeader
+instanceKlass org/apache/http/message/BasicStatusLine
+instanceKlass org/apache/http/protocol/HTTP
+instanceKlass org/apache/http/FormattedHeader
+instanceKlass java/security/spec/ECPublicKeySpec
+instanceKlass sun/security/ssl/ECDHKeyExchange$ECDHECredentials
+instanceKlass org/apache/http/message/BasicListHeaderIterator
+instanceKlass org/apache/http/impl/auth/HttpAuthenticator$1
+instanceKlass org/apache/http/util/NetUtils
+instanceKlass org/apache/http/conn/util/DnsUtils
+instanceKlass org/apache/http/conn/ssl/DefaultHostnameVerifier$1
+instanceKlass org/apache/http/conn/ssl/SubjectName
+instanceKlass sun/security/rsa/MGF1
+instanceKlass sun/security/ssl/SSLKeyExchange$SSLKeyExECDHERSAOrPSS
+instanceKlass org/apache/http/conn/routing/RouteTracker
+instanceKlass org/apache/http/impl/execchain/ConnectionHolder
+instanceKlass org/apache/http/conn/ConnectionReleaseTrigger
+instanceKlass org/apache/http/impl/conn/CPoolProxy
+instanceKlass org/apache/http/impl/conn/Wire
+instanceKlass org/apache/http/impl/io/AbstractMessageParser
+instanceKlass org/apache/http/util/CharArrayBuffer
+instanceKlass org/apache/http/impl/io/AbstractMessageWriter
+instanceKlass org/apache/http/impl/HttpConnectionMetricsImpl
+instanceKlass org/apache/http/impl/io/SessionOutputBufferImpl
+instanceKlass org/apache/http/util/ByteArrayBuffer
+instanceKlass org/apache/http/config/MessageConstraints$Builder
+instanceKlass org/apache/http/config/MessageConstraints
+instanceKlass org/apache/http/impl/io/SessionInputBufferImpl
+instanceKlass org/apache/http/io/BufferInfo
+instanceKlass org/apache/http/impl/io/HttpTransportMetricsImpl
+instanceKlass org/apache/http/io/HttpTransportMetrics
+instanceKlass org/apache/http/io/SessionOutputBuffer
+instanceKlass org/apache/http/io/SessionInputBuffer
+instanceKlass org/apache/http/HttpConnectionMetrics
+instanceKlass org/apache/http/config/ConnectionConfig$Builder
+instanceKlass org/apache/http/config/ConnectionConfig
+instanceKlass org/apache/http/impl/conn/PoolingHttpClientConnectionManager$1
+instanceKlass org/apache/http/pool/AbstractConnPool$2
+instanceKlass org/apache/http/util/Asserts
+instanceKlass org/apache/http/pool/PoolStats
+instanceKlass org/apache/http/util/LangUtils
+instanceKlass org/apache/http/impl/cookie/AbstractCookieAttributeHandler
+instanceKlass org/apache/http/impl/cookie/PublicSuffixDomainFilter
+instanceKlass org/apache/http/impl/cookie/BasicDomainHandler
+instanceKlass org/apache/http/message/TokenParser
+instanceKlass org/apache/http/cookie/SetCookie
+instanceKlass org/apache/http/cookie/Cookie
+instanceKlass org/apache/http/impl/cookie/RFC6265CookieSpec
+instanceKlass org/apache/http/impl/cookie/RFC6265CookieSpecProvider$2
+instanceKlass org/apache/http/cookie/CookieOrigin
+instanceKlass org/apache/http/conn/routing/HttpRoute
+instanceKlass org/apache/http/auth/AuthState
+instanceKlass org/apache/http/message/BasicRequestLine
+instanceKlass org/apache/http/params/HttpProtocolParams
+instanceKlass org/apache/http/params/CoreProtocolPNames
+instanceKlass org/apache/http/params/AbstractHttpParams
+instanceKlass org/apache/http/params/HttpParamsNames
+instanceKlass org/eclipse/aether/transport/http/SharingAuthCache
+instanceKlass org/apache/http/protocol/BasicHttpContext
+instanceKlass org/apache/http/protocol/HttpCoreContext
+instanceKlass org/apache/http/HeaderElement
+instanceKlass org/apache/http/message/BasicHeader
+instanceKlass java/util/concurrent/atomic/AtomicMarkableReference$Pair
+instanceKlass java/util/concurrent/atomic/AtomicMarkableReference
+instanceKlass org/apache/http/message/HeaderGroup
+instanceKlass org/apache/http/conn/util/InetAddressUtils
+instanceKlass org/apache/http/message/ParserCursor
+instanceKlass org/apache/http/client/utils/URLEncodedUtils
+instanceKlass org/apache/http/client/utils/URIBuilder
+instanceKlass org/eclipse/aether/transport/http/UriUtils
+instanceKlass org/apache/http/params/HttpParams
+instanceKlass org/apache/http/message/AbstractHttpMessage
+instanceKlass org/apache/http/client/methods/AbortableHttpRequest
+instanceKlass org/apache/http/client/methods/HttpExecutionAware
+instanceKlass org/eclipse/aether/transport/http/HttpTransporter$EntityGetter
+instanceKlass org/eclipse/aether/internal/impl/checksum/MessageDigestChecksumAlgorithmFactorySupport$1
+instanceKlass org/eclipse/aether/connector/basic/ChecksumCalculator$Checksum
+instanceKlass org/eclipse/aether/connector/basic/ChecksumCalculator
+instanceKlass org/eclipse/aether/util/FileUtils$2
+instanceKlass org/eclipse/aether/util/FileUtils$CollocatedTempFile
+instanceKlass org/eclipse/aether/util/FileUtils$TempFile
+instanceKlass org/eclipse/aether/util/FileUtils
+instanceKlass org/eclipse/aether/transfer/TransferEvent
+instanceKlass org/eclipse/aether/connector/basic/ChecksumValidator
+instanceKlass org/eclipse/aether/connector/basic/BasicRepositoryConnector$TaskRunner
+instanceKlass org/eclipse/aether/connector/basic/ChecksumValidator$ChecksumFetcher
+instanceKlass org/eclipse/aether/spi/connector/layout/RepositoryLayout$ChecksumLocation
+instanceKlass org/eclipse/aether/internal/impl/AbstractChecksumPolicy
+instanceKlass org/eclipse/aether/transfer/TransferEvent$Builder
+instanceKlass org/apache/http/conn/ClientConnectionManager
+instanceKlass org/apache/http/cookie/CookieIdentityComparator
+instanceKlass org/apache/http/impl/client/BasicCookieStore
+instanceKlass org/apache/http/impl/cookie/IgnoreSpecProvider
+instanceKlass org/apache/http/impl/cookie/NetscapeDraftSpecProvider
+instanceKlass org/apache/http/impl/cookie/RFC6265CookieSpecProvider
+instanceKlass org/apache/http/cookie/CookieSpec
+instanceKlass org/apache/http/impl/cookie/BasicPathHandler
+instanceKlass org/apache/http/cookie/CommonCookieAttributeHandler
+instanceKlass org/apache/http/cookie/CookieAttributeHandler
+instanceKlass org/apache/http/impl/cookie/DefaultCookieSpecProvider
+instanceKlass org/apache/http/cookie/CookieSpecProvider
+instanceKlass org/apache/http/impl/client/CookieSpecRegistries
+instanceKlass org/apache/http/impl/execchain/RedirectExec
+instanceKlass org/apache/http/impl/execchain/ServiceUnavailableRetryExec
+instanceKlass org/apache/http/impl/conn/DefaultRoutePlanner
+instanceKlass org/apache/http/impl/execchain/RetryExec
+instanceKlass org/apache/http/impl/execchain/ProtocolExec
+instanceKlass org/apache/http/client/entity/DeflateInputStreamFactory
+instanceKlass org/apache/http/client/entity/GZIPInputStreamFactory
+instanceKlass org/apache/http/client/entity/InputStreamFactory
+instanceKlass org/apache/http/client/protocol/ResponseContentEncoding
+instanceKlass org/apache/http/client/protocol/ResponseProcessCookies
+instanceKlass org/apache/http/client/protocol/RequestAuthCache
+instanceKlass org/apache/http/client/protocol/RequestAcceptEncoding
+instanceKlass org/apache/http/client/protocol/RequestAddCookies
+instanceKlass org/apache/http/protocol/ChainBuilder
+instanceKlass org/apache/http/client/protocol/RequestExpectContinue
+instanceKlass org/apache/http/client/protocol/RequestClientConnControl
+instanceKlass org/apache/http/protocol/RequestContent
+instanceKlass org/apache/http/client/protocol/RequestDefaultHeaders
+instanceKlass org/apache/http/protocol/HttpProcessorBuilder
+instanceKlass org/apache/http/conn/routing/BasicRouteDirector
+instanceKlass org/apache/http/impl/auth/HttpAuthenticator
+instanceKlass org/apache/http/conn/routing/HttpRouteDirector
+instanceKlass org/apache/http/conn/routing/RouteInfo
+instanceKlass org/apache/http/impl/execchain/MainClientExec
+instanceKlass org/apache/http/protocol/RequestUserAgent
+instanceKlass org/apache/http/protocol/RequestTargetHost
+instanceKlass org/apache/http/protocol/ImmutableHttpProcessor
+instanceKlass org/apache/http/impl/client/DefaultUserTokenHandler
+instanceKlass org/apache/http/impl/client/AuthenticationStrategyImpl
+instanceKlass org/apache/http/HeaderElementIterator
+instanceKlass org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy
+instanceKlass org/apache/http/HeaderIterator
+instanceKlass org/apache/http/TokenIterator
+instanceKlass org/apache/http/impl/DefaultConnectionReuseStrategy
+instanceKlass org/apache/http/protocol/HttpRequestExecutor
+instanceKlass org/apache/http/impl/client/BasicCredentialsProvider
+instanceKlass org/eclipse/aether/transport/http/DeferredCredentialsProvider
+instanceKlass org/apache/http/impl/client/DefaultRedirectStrategy
+instanceKlass org/apache/http/client/methods/Configurable
+instanceKlass org/apache/http/client/CookieStore
+instanceKlass org/apache/http/conn/routing/HttpRoutePlanner
+instanceKlass org/apache/http/protocol/HttpProcessor
+instanceKlass org/apache/http/HttpResponseInterceptor
+instanceKlass org/apache/http/HttpRequestInterceptor
+instanceKlass org/apache/http/client/UserTokenHandler
+instanceKlass org/apache/http/client/AuthenticationStrategy
+instanceKlass org/apache/http/conn/ConnectionKeepAliveStrategy
+instanceKlass org/apache/http/impl/execchain/ClientExecChain
+instanceKlass org/apache/http/impl/client/HttpClientBuilder
+instanceKlass org/eclipse/aether/transport/http/HttpTransporter$ResolverServiceUnavailableRetryStrategy
+instanceKlass org/apache/http/impl/client/DefaultHttpRequestRetryHandler
+instanceKlass org/apache/http/client/config/RequestConfig$Builder
+instanceKlass org/apache/http/client/config/RequestConfig
+instanceKlass org/apache/http/config/SocketConfig$Builder
+instanceKlass org/apache/http/config/SocketConfig
+instanceKlass org/apache/http/impl/auth/KerberosSchemeFactory
+instanceKlass org/apache/http/impl/auth/SPNegoSchemeFactory
+instanceKlass org/apache/http/impl/auth/NTLMSchemeFactory
+instanceKlass org/apache/http/impl/auth/DigestSchemeFactory
+instanceKlass org/apache/http/impl/auth/BasicSchemeFactory
+instanceKlass org/apache/http/auth/AuthSchemeProvider
+instanceKlass org/apache/http/auth/AuthSchemeFactory
+instanceKlass org/eclipse/aether/transport/http/GlobalState$CompoundKey
+instanceKlass org/apache/http/impl/conn/PoolingHttpClientConnectionManager$InternalConnectionFactory
+instanceKlass org/apache/http/pool/RouteSpecificPool
+instanceKlass org/apache/http/pool/AbstractConnPool
+instanceKlass org/apache/http/pool/ConnPool
+instanceKlass org/apache/http/impl/conn/PoolingHttpClientConnectionManager$ConfigData
+instanceKlass org/apache/http/impl/entity/StrictContentLengthStrategy
+instanceKlass org/apache/http/impl/entity/LaxContentLengthStrategy
+instanceKlass org/apache/http/impl/EnglishReasonPhraseCatalog
+instanceKlass org/apache/http/ReasonPhraseCatalog
+instanceKlass org/apache/http/impl/DefaultHttpResponseFactory
+instanceKlass org/apache/http/ProtocolVersion
+instanceKlass org/apache/http/StatusLine
+instanceKlass org/apache/http/RequestLine
+instanceKlass org/apache/http/message/BasicLineParser
+instanceKlass org/apache/http/io/HttpMessageParser
+instanceKlass org/apache/http/HttpResponseFactory
+instanceKlass org/apache/http/message/LineParser
+instanceKlass org/apache/http/impl/conn/DefaultHttpResponseParserFactory
+instanceKlass org/apache/http/message/BasicLineFormatter
+instanceKlass org/apache/http/io/HttpMessageWriter
+instanceKlass org/apache/http/message/LineFormatter
+instanceKlass org/apache/http/impl/io/DefaultHttpRequestWriterFactory
+instanceKlass org/apache/http/impl/BHttpConnectionBase
+instanceKlass org/apache/http/conn/ManagedHttpClientConnection
+instanceKlass org/apache/http/HttpInetConnection
+instanceKlass org/apache/http/HttpClientConnection
+instanceKlass org/apache/http/HttpConnection
+instanceKlass org/apache/http/entity/ContentLengthStrategy
+instanceKlass org/apache/http/io/HttpMessageParserFactory
+instanceKlass org/apache/http/io/HttpMessageWriterFactory
+instanceKlass org/apache/http/impl/conn/ManagedHttpClientConnectionFactory
+instanceKlass org/apache/http/impl/conn/SystemDefaultDnsResolver
+instanceKlass org/apache/http/impl/conn/DefaultSchemePortResolver
+instanceKlass org/apache/http/impl/conn/DefaultHttpClientConnectionOperator
+instanceKlass org/apache/http/pool/PoolEntryCallback
+instanceKlass org/apache/http/pool/ConnFactory
+instanceKlass org/apache/http/conn/ConnectionRequest
+instanceKlass org/apache/http/concurrent/Cancellable
+instanceKlass org/apache/http/pool/PoolEntry
+instanceKlass org/apache/http/conn/util/PublicSuffixMatcher
+instanceKlass org/apache/http/conn/util/PublicSuffixList
+instanceKlass org/apache/http/Consts
+instanceKlass org/apache/http/conn/util/PublicSuffixListParser
+instanceKlass org/apache/http/conn/util/PublicSuffixMatcherLoader
+instanceKlass org/apache/http/conn/ssl/DefaultHostnameVerifier
+instanceKlass org/apache/commons/logging/impl/SLF4JLog
+instanceKlass org/apache/commons/logging/impl/SLF4JLocationAwareLog
+instanceKlass org/apache/commons/logging/Log
+instanceKlass org/apache/commons/logging/LogFactory
+instanceKlass org/apache/http/conn/ssl/AbstractVerifier
+instanceKlass org/apache/http/conn/ssl/X509HostnameVerifier
+instanceKlass org/apache/http/conn/ssl/SSLConnectionSocketFactory
+instanceKlass org/apache/http/conn/socket/LayeredConnectionSocketFactory
+instanceKlass org/apache/http/conn/socket/PlainConnectionSocketFactory
+instanceKlass org/apache/http/conn/socket/ConnectionSocketFactory
+instanceKlass org/apache/http/config/RegistryBuilder
+# instanceKlass org/eclipse/aether/transport/http/GlobalState$$Lambda+0x0000019a3d7e9570
+# instanceKlass org/eclipse/aether/transport/http/GlobalState$$Lambda+0x0000019a3d7e9330
+# instanceKlass org/eclipse/aether/transport/http/GlobalState$$Lambda+0x0000019a3d7e90f0
+instanceKlass @bci org/eclipse/aether/transport/http/GlobalState getConnectionManager (Lorg/eclipse/aether/transport/http/ConnMgrConfig;)Lorg/apache/http/conn/HttpClientConnectionManager; 5 argL0 ; # org/eclipse/aether/transport/http/GlobalState$$Lambda+0x0000019a3d7e8eb0
+instanceKlass org/apache/http/conn/HttpClientConnectionOperator
+instanceKlass org/apache/http/conn/HttpConnectionFactory
+instanceKlass org/apache/http/conn/SchemePortResolver
+instanceKlass org/apache/http/conn/DnsResolver
+instanceKlass org/eclipse/aether/transport/http/GlobalState
+instanceKlass org/eclipse/aether/transport/http/ConnMgrConfig
+instanceKlass org/eclipse/aether/transport/http/LocalState
+instanceKlass org/eclipse/aether/repository/AuthenticationContext
+instanceKlass org/apache/http/util/TextUtils
+instanceKlass org/apache/http/util/Args
+instanceKlass org/apache/http/HttpHost
+instanceKlass org/apache/http/client/utils/URIUtils
+instanceKlass org/apache/http/HttpEntityEnclosingRequest
+instanceKlass org/apache/http/ConnectionReuseStrategy
+instanceKlass org/eclipse/aether/transport/http/DeferredCredentialsProvider$Factory
+instanceKlass org/eclipse/aether/spi/connector/transport/TransportTask
+instanceKlass org/eclipse/aether/spi/connector/transport/AbstractTransporter
+instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$Maven2RepositoryLayout
+# instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e5700
+# instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e54b0
+instanceKlass @bci org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory newInstance (Lorg/eclipse/aether/RepositorySystemSession;Lorg/eclipse/aether/repository/RemoteRepository;)Lorg/eclipse/aether/spi/connector/layout/RepositoryLayout; 141 argL0 ; # org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e5260
+# instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e4dc0
+# instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e5010
+instanceKlass @bci org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory newInstance (Lorg/eclipse/aether/RepositorySystemSession;Lorg/eclipse/aether/repository/RemoteRepository;)Lorg/eclipse/aether/spi/connector/layout/RepositoryLayout; 111 argL0 ; # org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e4b70
+# instanceKlass org/eclipse/aether/internal/impl/Maven2RepositoryLayoutFactory$$Lambda+0x0000019a3d7e4920
+# instanceKlass org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector$$Lambda+0x0000019a3d7e46d8
+# instanceKlass org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector$$Lambda+0x0000019a3d7e4490
+# instanceKlass org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector$$Lambda+0x0000019a3d7e4248
+instanceKlass @bci org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector selectList (Ljava/util/Collection;)Ljava/util/List; 7 member ; # org/eclipse/aether/internal/impl/checksum/DefaultChecksumAlgorithmFactorySelector$$Lambda+0x0000019a3d7e4000
+instanceKlass java/util/stream/DistinctOps
+# instanceKlass org/eclipse/aether/util/ConfigUtils$$Lambda+0x0000019a3d7dfb70
+# instanceKlass org/eclipse/aether/util/ConfigUtils$$Lambda+0x0000019a3d7df920
+# instanceKlass org/eclipse/aether/util/ConfigUtils$$Lambda+0x0000019a3d7df6d0
+instanceKlass @bci org/eclipse/aether/util/ConfigUtils parseCommaSeparatedNames (Ljava/lang/String;)Ljava/util/List; 27 argL0 ; # org/eclipse/aether/util/ConfigUtils$$Lambda+0x0000019a3d7df480
+instanceKlass com/google/common/collect/LinkedHashMultimap$ValueSet$1
+instanceKlass com/google/common/collect/AbstractMapBasedMultimap$WrappedCollection$WrappedIterator
+instanceKlass com/google/common/collect/SortedSetMultimap
+instanceKlass com/google/common/collect/Multimaps
+instanceKlass com/google/common/collect/MultimapBuilder$ArrayListSupplier
+instanceKlass com/google/common/collect/MultimapBuilder$MultimapBuilderWithKeys
+instanceKlass com/google/common/collect/MultimapBuilder
+instanceKlass org/eclipse/aether/spi/connector/transport/TransportListener
+instanceKlass org/eclipse/aether/connector/basic/BasicRepositoryConnector
+instanceKlass org/eclipse/aether/transfer/AbstractTransferListener
+instanceKlass @bci org/eclipse/aether/util/concurrency/RunnableErrorForwarder wrap (Ljava/lang/Runnable;)Ljava/lang/Runnable; 17 member ; # org/eclipse/aether/util/concurrency/RunnableErrorForwarder$$Lambda+0x0000019a3d7dd838
+instanceKlass org/eclipse/aether/util/concurrency/RunnableErrorForwarder
+instanceKlass org/eclipse/aether/internal/impl/DefaultMetadataResolver$ResolveTask
+instanceKlass org/eclipse/aether/repository/AuthenticationDigest
+instanceKlass org/eclipse/aether/repository/LocalMetadataResult
+instanceKlass org/eclipse/aether/repository/LocalMetadataRequest
+instanceKlass org/eclipse/aether/resolution/MetadataResult
+instanceKlass org/eclipse/aether/resolution/MetadataRequest
+instanceKlass org/eclipse/aether/metadata/AbstractMetadata
+instanceKlass org/eclipse/aether/util/version/UnionVersionRange
+instanceKlass org/eclipse/aether/version/VersionRange$Bound
+instanceKlass org/eclipse/aether/util/version/GenericVersionRange
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d9400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d9000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d8c00
+instanceKlass org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$1
+instanceKlass org/eclipse/jdt/internal/compiler/util/Sorting$1
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d8800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d8400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d8000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d3c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d3800
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/SwitchStatement$SwitchTranslator initializeLabels (Lorg/eclipse/jdt/internal/compiler/codegen/CodeStream;)V 27 argL0 ; # org/eclipse/jdt/internal/compiler/ast/SwitchStatement$SwitchTranslator$$Lambda+0x0000019a3d7d43f0
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d3400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d3000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d2c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d2800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d2400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d2000
+instanceKlass @bci org/eclipse/jdt/internal/core/index/MetaIndex addIndexEntry ([C[CLjava/lang/String;)V 18 member ; # org/eclipse/jdt/internal/core/index/MetaIndex$$Lambda+0x0000019a3d797248
+instanceKlass @bci org/eclipse/jdt/internal/core/index/MetaIndex remove (Ljava/lang/String;)V 16 member ; # org/eclipse/jdt/internal/core/index/MetaIndex$$Lambda+0x0000019a3d797010
+instanceKlass org/eclipse/jdt/internal/core/index/MetaIndex
+instanceKlass org/eclipse/jdt/internal/core/index/IndexQualifier
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d1c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d1800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d1400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d1000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d0c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d0800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d0400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7d0000
+instanceKlass @bci org/eclipse/jdt/internal/compiler/lookup/InferenceContext18 addJDK_8153748ConstraintsFromFunctionalExpr (Lorg/eclipse/jdt/internal/compiler/ast/FunctionalExpression;Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/lookup/MethodBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReductionResult; 71 member ; # org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$$Lambda+0x0000019a3d7cef58
+instanceKlass @bci org/eclipse/jdt/internal/compiler/lookup/InferenceContext18 addJDK_8153748ConstraintsFromFunctionalExpr (Lorg/eclipse/jdt/internal/compiler/ast/FunctionalExpression;Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/lookup/MethodBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReductionResult; 41 member ; # org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$$Lambda+0x0000019a3d7ced30
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable markClose (Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;)V 3 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$$Lambda+0x0000019a3d7ceaf8
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7cbc00
+instanceKlass org/eclipse/jdt/internal/compiler/lookup/ParameterizedGenericMethodBinding$LingeringTypeVariableEliminator
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/MessageSend recordFlowUpdateOnResult (Lorg/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding;ZZ)V 4 ; # java/lang/invoke/LambdaForm$MH+0x0000019a3d7cb800
+# instanceKlass java/lang/invoke/LambdaForm$DMH+0x0000019a3d7cb400
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/MessageSend recordFlowUpdateOnResult (Lorg/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding;ZZ)V 4 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7cb000
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/MessageSend recordFlowUpdateOnResult (Lorg/eclipse/jdt/internal/compiler/lookup/LocalVariableBinding;ZZ)V 4 member ; # org/eclipse/jdt/internal/compiler/ast/MessageSend$$Lambda+0x0000019a3d7ce670
+instanceKlass @cpi org/eclipse/jdt/internal/compiler/ast/MessageSend 1504 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7cac00
+instanceKlass @bci org/eclipse/jdt/internal/compiler/lookup/InferenceContext18 addJDK_8153748ConstraintsFromFunctionalExpr (Lorg/eclipse/jdt/internal/compiler/ast/FunctionalExpression;Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/lookup/MethodBinding;)Lorg/eclipse/jdt/internal/compiler/lookup/ReductionResult; 26 member ; # org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$$Lambda+0x0000019a3d7ce448
+instanceKlass org/eclipse/jdt/internal/compiler/lookup/InferenceContext18$InferenceOperation
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7ca800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7ca400
+instanceKlass @bci org/eclipse/jdt/internal/compiler/problem/ProblemReporter deprecatedMethod (Lorg/eclipse/jdt/internal/compiler/lookup/MethodBinding;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;)V 193 member ; # org/eclipse/jdt/internal/compiler/problem/ProblemReporter$$Lambda+0x0000019a3d7ce020
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/SwitchStatement$SwitchTranslator$StringSwitchTranslator initializeLabels (Lorg/eclipse/jdt/internal/compiler/codegen/CodeStream;)V 27 argL0 ; # org/eclipse/jdt/internal/compiler/ast/SwitchStatement$SwitchTranslator$StringSwitchTranslator$$Lambda+0x0000019a3d7cd9c0
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/CaseStatement peeledLabelExpressions ()[Lorg/eclipse/jdt/internal/compiler/ast/Expression; 80 argL0 ; # org/eclipse/jdt/internal/compiler/ast/CaseStatement$$Lambda+0x0000019a3d7cccb8
+instanceKlass org/eclipse/jdt/internal/compiler/ast/CaseStatement$LabelExpression
+instanceKlass org/eclipse/jdt/internal/compiler/ast/SwitchStatement$SwitchTranslator
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement generateCode (Lorg/eclipse/jdt/internal/compiler/lookup/BlockScope;Lorg/eclipse/jdt/internal/compiler/codegen/CodeStream;)V 167 member ; # org/eclipse/jdt/internal/compiler/ast/SynchronizedStatement$$Lambda+0x0000019a3d7c7148
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable reportError (Lorg/eclipse/jdt/internal/compiler/problem/ProblemReporter;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;I)I 108 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$$Lambda+0x0000019a3d7c6f18
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7ca000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c9c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c9800
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable getCloseTrackingVariable (Lorg/eclipse/jdt/internal/compiler/ast/Expression;Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;Z)Lorg/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable; 60 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$$Lambda+0x0000019a3d7c68e0
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable markPassedToOutside (Lorg/eclipse/jdt/internal/compiler/lookup/BlockScope;Lorg/eclipse/jdt/internal/compiler/ast/Expression;Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;Z)Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo; 54 ; # java/lang/invoke/LambdaForm$MH+0x0000019a3d7c9400
+# instanceKlass java/lang/invoke/LambdaForm$DMH+0x0000019a3d7c9000
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable markPassedToOutside (Lorg/eclipse/jdt/internal/compiler/lookup/BlockScope;Lorg/eclipse/jdt/internal/compiler/ast/Expression;Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;Z)Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo; 54 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7c8c00
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable markPassedToOutside (Lorg/eclipse/jdt/internal/compiler/lookup/BlockScope;Lorg/eclipse/jdt/internal/compiler/ast/Expression;Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;Z)Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo; 54 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$$Lambda+0x0000019a3d7c66a8
+instanceKlass @cpi org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable 1056 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7c8800
+instanceKlass org/eclipse/jdt/internal/compiler/codegen/LongCache
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c8400
+instanceKlass org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$IteratorForReporting
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$1 handle (Lorg/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable;Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;Lorg/eclipse/jdt/internal/compiler/lookup/BlockScope;)Z 47 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$1$$Lambda+0x0000019a3d7c59a8
+instanceKlass @cpi org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$1 123 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7c8000
+instanceKlass @bci org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable markNullStatus (Lorg/eclipse/jdt/internal/compiler/flow/FlowInfo;Lorg/eclipse/jdt/internal/compiler/flow/FlowContext;I)V 4 member ; # org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable$$Lambda+0x0000019a3d7c5770
+instanceKlass @cpi org/eclipse/jdt/internal/compiler/ast/FakedTrackingVariable 1046 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7c3c00
+instanceKlass org/eclipse/jdt/internal/compiler/flow/LoopingFlowContext$EscapingExceptionCatchSite
+instanceKlass @bci org/eclipse/jdt/internal/compiler/problem/ProblemReporter deprecatedType (Lorg/eclipse/jdt/internal/compiler/lookup/TypeBinding;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;I)V 78 member ; # org/eclipse/jdt/internal/compiler/problem/ProblemReporter$$Lambda+0x0000019a3d7c5330
+instanceKlass org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider$BasicAnnotationWalker
+instanceKlass org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider$SingleMarkerAnnotation
+instanceKlass org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider
+instanceKlass org/eclipse/jdt/internal/compiler/classfmt/NonNullDefaultAwareTypeAnnotationWalker$1
+instanceKlass org/eclipse/jdt/internal/compiler/lookup/Scope$NullDefaultRange
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c3800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c3400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c3000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c2c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c2800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c2400
+instanceKlass lombok/experimental/Tolerate
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c2000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c1c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c1800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c1400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c1000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c0c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c0800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c0400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7c0000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bdc00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bd800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bd400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bd000
+instanceKlass org/eclipse/jdt/internal/core/builder/BatchImageBuilder$1
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bcc00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bc800
+instanceKlass org/apache/maven/plugins/resources/TestResourcesMojo$$FastClassByGuice$$221072069
+instanceKlass org/sonatype/plexus/build/incremental/EmptyScanner
+instanceKlass @bci org/eclipse/core/internal/resources/Resource accept (Lorg/eclipse/core/resources/IResourceVisitor;II)V 7 member ; # org/eclipse/core/internal/resources/Resource$$Lambda+0x0000019a3d7867d8
+instanceKlass @bci org/eclipse/m2e/core/internal/builder/plexusbuildapi/ResourceScanner scanResource ()V 5 member ; # org/eclipse/m2e/core/internal/builder/plexusbuildapi/ResourceScanner$$Lambda+0x0000019a3d79b1c8
+instanceKlass org/codehaus/plexus/util/SelectorUtils
+instanceKlass org/codehaus/plexus/util/MatchPattern
+instanceKlass org/codehaus/plexus/util/MatchPatterns
+instanceKlass org/codehaus/plexus/util/AbstractScanner
+instanceKlass org/codehaus/plexus/interpolation/RecursionInterceptor
+instanceKlass org/codehaus/plexus/interpolation/AbstractValueSource
+instanceKlass org/apache/maven/plugins/resources/MavenBuildTimestamp
+instanceKlass org/apache/maven/shared/filtering/FilterWrapper
+instanceKlass org/apache/commons/lang3/StringUtils
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bc400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7bc000
+instanceKlass org/codehaus/plexus/util/introspection/MethodMap
+instanceKlass org/codehaus/plexus/util/introspection/ClassMap$CacheMiss
+instanceKlass org/codehaus/plexus/util/introspection/ClassMap
+instanceKlass org/codehaus/plexus/util/introspection/ReflectionValueExtractor$Tokenizer
+instanceKlass org/codehaus/plexus/util/introspection/ReflectionValueExtractor
+instanceKlass org/eclipse/sisu/plexus/TypeArguments
+instanceKlass org/eclipse/sisu/plexus/CompositeBeanHelper$1
+instanceKlass org/eclipse/sisu/plexus/CompositeBeanHelper
+instanceKlass org/apache/maven/plugin/internal/ValidatingConfigurationListener
+instanceKlass org/apache/maven/plugin/DebugConfigurationListener
+instanceKlass org/codehaus/plexus/component/configurator/expression/DefaultExpressionEvaluator
+instanceKlass @bci org/apache/maven/plugin/internal/ReadOnlyPluginParametersValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 35 member ; # org/apache/maven/plugin/internal/ReadOnlyPluginParametersValidator$$Lambda+0x0000019a3d7b8b60
+instanceKlass @bci org/apache/maven/plugin/internal/ReadOnlyPluginParametersValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 17 argL0 ; # org/apache/maven/plugin/internal/ReadOnlyPluginParametersValidator$$Lambda+0x0000019a3d7b8910
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedPluginValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 71 member ; # org/apache/maven/plugin/internal/DeprecatedPluginValidator$$Lambda+0x0000019a3d7b86d8
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedPluginValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 53 argL0 ; # org/apache/maven/plugin/internal/DeprecatedPluginValidator$$Lambda+0x0000019a3d7b8488
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedPluginValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 43 argL0 ; # org/apache/maven/plugin/internal/DeprecatedPluginValidator$$Lambda+0x0000019a3d7b8238
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 43 member ; # org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator$$Lambda+0x0000019a3d7b8000
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 29 member ; # org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator$$Lambda+0x0000019a3d7b5400
+instanceKlass @bci org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator doValidate (Lorg/apache/maven/execution/MavenSession;Lorg/apache/maven/plugin/descriptor/MojoDescriptor;Ljava/lang/Class;Lorg/codehaus/plexus/configuration/PlexusConfiguration;Lorg/codehaus/plexus/component/configurator/expression/ExpressionEvaluator;)V 18 member ; # org/apache/maven/plugin/internal/DeprecatedCoreExpressionValidator$$Lambda+0x0000019a3d7a7d60
+instanceKlass org/apache/maven/monitor/logging/DefaultLog
+instanceKlass org/apache/maven/plugins/resources/ResourcesMojo$$FastClassByGuice$$219164212
+instanceKlass org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering$$FastClassByGuice$$218266212
+instanceKlass org/apache/maven/shared/filtering/DefaultMavenReaderFilter$$FastClassByGuice$$217392382
+instanceKlass org/apache/maven/shared/filtering/DefaultMavenFileFilter$$FastClassByGuice$$216542011
+instanceKlass org/codehaus/plexus/interpolation/Interpolator
+instanceKlass org/codehaus/plexus/interpolation/BasicInterpolator
+instanceKlass org/codehaus/plexus/interpolation/ValueSource
+instanceKlass org/apache/maven/shared/filtering/AbstractMavenFilteringRequest
+instanceKlass org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering
+instanceKlass org/apache/maven/shared/filtering/MavenResourcesFiltering
+instanceKlass org/apache/maven/shared/filtering/MavenReaderFilter
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b5000
+instanceKlass org/apache/maven/shared/filtering/BaseFilter
+instanceKlass org/apache/maven/shared/filtering/MavenFileFilter
+instanceKlass org/apache/maven/shared/filtering/DefaultFilterInfo
+instanceKlass @bci org/apache/maven/project/artifact/DefaultProjectArtifactsCache createKey (Lorg/apache/maven/project/MavenProject;Ljava/util/Collection;Ljava/util/Collection;ZLorg/eclipse/aether/RepositorySystemSession;)Lorg/apache/maven/project/artifact/ProjectArtifactsCache$Key; 26 argL0 ; # org/apache/maven/project/artifact/DefaultProjectArtifactsCache$$Lambda+0x0000019a3d7a7800
+instanceKlass org/apache/maven/project/artifact/DefaultProjectArtifactsCache$CacheKey
+instanceKlass @bci java/util/function/Predicate and (Ljava/util/function/Predicate;)Ljava/util/function/Predicate; 7 member ; # java/util/function/Predicate$$Lambda+0x0000019a3d57b8f0
+instanceKlass @bci org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter (Ljava/util/List;)V 14 argL0 ; # org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter$$Lambda+0x0000019a3d7a73a0
+instanceKlass @bci org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter (Ljava/util/List;)V 5 argL0 ; # org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter$$Lambda+0x0000019a3d7a7150
+instanceKlass org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilter
+instanceKlass @bci org/eclipse/m2e/core/internal/embedder/MavenExecutionContext cloneMojoExecution (Lorg/apache/maven/plugin/MojoExecution;)Lorg/apache/maven/plugin/MojoExecution; 41 member ; # org/eclipse/m2e/core/internal/embedder/MavenExecutionContext$$Lambda+0x0000019a3d79ac98
+instanceKlass @bci org/eclipse/m2e/core/internal/embedder/MavenExecutionContext execute (Lorg/apache/maven/project/MavenProject;Lorg/apache/maven/plugin/MojoExecution;Lorg/eclipse/core/runtime/IProgressMonitor;)V 3 member ; # org/eclipse/m2e/core/internal/embedder/MavenExecutionContext$$Lambda+0x0000019a3d79aa70
+instanceKlass @bci org/eclipse/m2e/core/project/configurator/MojoExecutionKey getKeyString ()Ljava/lang/String; 24 form vmentry ; # java/lang/invoke/LambdaForm$MH+0x0000019a3d7b3000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b2c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b2800
+instanceKlass @bci org/eclipse/m2e/core/project/configurator/MojoExecutionKey getKeyString ()Ljava/lang/String; 24 argL4 form vmentry ; # java/lang/invoke/LambdaForm$MH+0x0000019a3d7b2400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b2000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b1c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b1800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b1400
+instanceKlass @bci org/eclipse/m2e/core/project/configurator/MojoExecutionKey getKeyString ()Ljava/lang/String; 24 argL1 form vmentry ; # java/lang/invoke/LambdaForm$MH+0x0000019a3d7b1000
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b0c00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b0800
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7b0400
+instanceKlass java/io/ObjectOutputStream$ReplaceTable
+instanceKlass java/io/ObjectOutputStream$HandleTable
+instanceKlass org/eclipse/jdt/internal/core/UserLibraryClasspathContainer
+instanceKlass org/eclipse/jdt/internal/core/ClasspathValidation
+instanceKlass org/eclipse/jdt/internal/core/ExternalFolderChange
+instanceKlass @bci org/eclipse/m2e/jdt/internal/ModuleSupport configureClasspath (Lorg/eclipse/m2e/core/project/IMavenProjectFacade;Lorg/eclipse/m2e/jdt/IClasspathDescriptor;Lorg/eclipse/core/runtime/IProgressMonitor;)V 249 member ; # org/eclipse/m2e/jdt/internal/ModuleSupport$$Lambda+0x0000019a3d7aeb28
+instanceKlass @bci org/eclipse/m2e/jdt/internal/ModuleSupport createNeededModulesLookup (Ljava/util/Map;)Ljava/util/function/Function; 105 member ; # org/eclipse/m2e/jdt/internal/ModuleSupport$$Lambda+0x0000019a3d7ae8e0
+instanceKlass @bci org/eclipse/m2e/jdt/internal/ModuleSupport createNeededModulesLookup (Ljava/util/Map;)Ljava/util/function/Function; 62 argL0 ; # org/eclipse/m2e/jdt/internal/ModuleSupport$$Lambda+0x0000019a3d7ae6a0
+instanceKlass org/eclipse/m2e/jdt/internal/InternalModuleInfo
+instanceKlass @bci org/eclipse/m2e/jdt/internal/DefaultClasspathManagerDelegate findClasspathDescriptor (Lorg/eclipse/m2e/jdt/IClasspathDescriptor;Lorg/eclipse/core/runtime/IPath;)Lorg/eclipse/m2e/jdt/IClasspathEntryDescriptor; 12 member ; # org/eclipse/m2e/jdt/internal/DefaultClasspathManagerDelegate$$Lambda+0x0000019a3d7ae238
+instanceKlass @bci org/eclipse/m2e/jdt/internal/DefaultClasspathManagerDelegate addClasspathEntries (Lorg/eclipse/m2e/jdt/IClasspathDescriptor;Lorg/eclipse/m2e/core/project/IMavenProjectFacade;ILorg/eclipse/core/runtime/IProgressMonitor;)V 485 member ; # org/eclipse/m2e/jdt/internal/DefaultClasspathManagerDelegate$$Lambda+0x0000019a3d7ae000
+instanceKlass org/eclipse/m2e/jdt/internal/DefaultClasspathManagerDelegate$ProjectTestAttributes
+instanceKlass org/eclipse/m2e/jdt/internal/ClasspathEntryDescriptor
+instanceKlass org/eclipse/m2e/jdt/internal/ClasspathDescriptor
+instanceKlass org/eclipse/m2e/workspace/WorkspaceState2
+instanceKlass org/eclipse/m2e/core/internal/project/LifecycleMappingConfiguration
+instanceKlass org/eclipse/m2e/core/project/MavenProjectChangedEvent
+instanceKlass @bci org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager diff (Ljava/util/Set;Ljava/util/Set;)Ljava/util/Set; 88 argL0 ; # org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager$$Lambda+0x0000019a3d79a1a0
+instanceKlass @bci java/util/stream/Collectors lambda$groupingBy$55 (Ljava/util/function/Function;Ljava/util/Map;)Ljava/util/Map; 2 member ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57ad38
+instanceKlass @bci java/util/stream/Collectors groupingBy (Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector; 84 member ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57aaf0
+instanceKlass @bci java/util/stream/Collectors groupingBy (Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector; 1 argL0 ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57a8d0
+instanceKlass @bci java/util/stream/Collectors summingLong (Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector; 20 argL0 ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57a690
+instanceKlass @bci java/util/stream/Collectors summingLong (Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector; 15 argL0 ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57a448
+instanceKlass @bci java/util/stream/Collectors summingLong (Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector; 10 member ; # java/util/stream/Collectors$$Lambda+0x0000019a3d57a210
+instanceKlass @bci java/util/stream/Collectors summingLong (Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector; 4 argL0 ; # java/util/stream/Collectors$$Lambda+0x0000019a3d579ff0
+instanceKlass @bci java/util/stream/Collectors counting ()Ljava/util/stream/Collector; 0 argL0 ; # java/util/stream/Collectors$$Lambda+0x0000019a3d579dd0
+instanceKlass @cpi java/util/stream/Collectors 1161 form vmentry ; # java/lang/invoke/LambdaForm$DMH+0x0000019a3d7ac800
+instanceKlass @bci org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager diff (Ljava/util/Set;Ljava/util/Set;)Ljava/util/Set; 62 argL0 ; # org/eclipse/m2e/core/internal/project/registry/ProjectRegistryManager$$Lambda+0x0000019a3d799f60
+instanceKlass @bci org/eclipse/m2e/core/internal/project/registry/MavenProjectFacade setMavenProjectArtifacts (Lorg/apache/maven/project/MavenProject;)V 19 argL0 ; # org/eclipse/m2e/core/internal/project/registry/MavenProjectFacade$$Lambda+0x0000019a3d799d40
+instanceKlass @bci org/eclipse/m2e/core/internal/project/registry/MavenProjectFacade setMavenProjectArtifacts (Lorg/apache/maven/project/MavenProject;)V 9 argL0 ; # org/eclipse/m2e/core/internal/project/registry/MavenProjectFacade$$Lambda+0x0000019a3d799b00
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7ac400
+# instanceKlass java/lang/invoke/LambdaForm$MH+0x0000019a3d7ac000
+instanceKlass org/eclipse/aether/repository/Proxy
+instanceKlass org/eclipse/aether/repository/Authentication
+instanceKlass @bci org/eclipse/m2e/core/internal/project/registry/DefaultMavenDependencyResolver resolveProjectDependencies (Lorg/eclipse/m2e/core/project/IMavenProjectFacade;Ljava/util/Set;Ljava/util/Set;Lorg/eclipse/core/runtime/IProgressMonitor;)V 44 member ; # org/eclipse/m2e/core/internal/project/registry/DefaultMavenDependencyResolver$$Lambda+0x0000019a3d7998d8
+instanceKlass org/eclipse/m2e/core/internal/project/registry/ILifecycleMapping2
+instanceKlass org/apache/maven/plugin/PluginParameterExpressionEvaluator
+instanceKlass org/codehaus/plexus/component/configurator/expression/TypeAwareExpressionEvaluator
+instanceKlass @bci org/eclipse/m2e/core/internal/project/ProjectCachePlunger register (Lorg/apache/maven/project/MavenProject;Ljava/lang/Object;)V 39 argL0 ; # org/eclipse/m2e/core/internal/project/ProjectCachePlunger$$Lambda+0x0000019a3d799498
+instanceKlass @bci org/eclipse/m2e/core/internal/project/ProjectCachePlunger register (Lorg/apache/maven/project/MavenProject;Ljava/lang/Object;)V 14 argL0 ; # org/eclipse/m2e/core/internal/project/ProjectCachePlunger$$Lambda+0x0000019a3d799258
+instanceKlass org/codehaus/plexus/compiler/javac/JavaxToolsCompiler$$FastClassByGuice$$215198004
+instanceKlass org/codehaus/plexus/compiler/javac/JavacCompiler$$FastClassByGuice$$214795138
+instanceKlass org/codehaus/plexus/compiler/manager/DefaultCompilerManager$$FastClassByGuice$$213240134
+instanceKlass org/codehaus/plexus/languages/java/jpms/LocationManager$$FastClassByGuice$$212335605
+instanceKlass org/eclipse/sisu/wire/BeanProviders$2
+instanceKlass com/google/inject/internal/Messages$Converter
+instanceKlass com/google/inject/internal/Messages
+instanceKlass javax/tools/Diagnostic
+instanceKlass javax/tools/JavaCompiler
+instanceKlass javax/tools/Tool
+instanceKlass javax/tools/JavaFileManager
+instanceKlass javax/tools/OptionChecker
+instanceKlass javax/tools/DiagnosticListener
+instanceKlass org/codehaus/plexus/compiler/CompilerMessage
+instanceKlass org/codehaus/plexus/util/cli/StreamConsumer
+instanceKlass org/codehaus/plexus/compiler/CompilerOutputStyle
+instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathRequest
+instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathResult
+instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathsRequest
+instanceKlass org/codehaus/plexus/languages/java/jpms/ManifestModuleNameExtractor
+instanceKlass org/codehaus/plexus/languages/java/jpms/SourceModuleInfoParser
+instanceKlass org/codehaus/plexus/languages/java/jpms/ModuleNameExtractor
+instanceKlass org/codehaus/plexus/languages/java/jpms/ModuleInfoParser
+instanceKlass org/codehaus/plexus/languages/java/jpms/JavaModuleDescriptor
+instanceKlass org/codehaus/plexus/languages/java/jpms/ResolvePathsResult
+instanceKlass org/apache/maven/plugin/compiler/DependencyCoordinate
+instanceKlass org/apache/maven/shared/incremental/IncrementalBuildHelper
+instanceKlass org/codehaus/plexus/compiler/util/scan/SourceInclusionScanner
+instanceKlass org/codehaus/plexus/compiler/CompilerConfiguration
+instanceKlass org/codehaus/plexus/compiler/CompilerResult
+instanceKlass org/apache/maven/shared/utils/logging/MessageBuilder
+instanceKlass org/codehaus/plexus/compiler/util/scan/mapping/SourceMapping
+instanceKlass org/codehaus/plexus/compiler/javac/JavaxToolsCompiler
+instanceKlass org/codehaus/plexus/compiler/javac/InProcessCompiler
+instanceKlass org/codehaus/plexus/compiler/AbstractCompiler
+instanceKlass org/codehaus/plexus/compiler/Compiler
+instanceKlass org/codehaus/plexus/compiler/manager/DefaultCompilerManager
+instanceKlass org/codehaus/plexus/compiler/manager/CompilerManager
+instanceKlass org/codehaus/plexus/languages/java/jpms/LocationManager
+instanceKlass org/eclipse/sisu/space/FileEntryIterator
+instanceKlass org/eclipse/sisu/space/ResourceEnumeration
+instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule$PlexusDescriptorBeanSource
+instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule$ComponentMetadata
+instanceKlass org/apache/maven/plugin/AbstractMojo
+instanceKlass org/apache/maven/plugin/ContextEnabled
+instanceKlass org/apache/maven/plugin/Mojo
+instanceKlass org/eclipse/sisu/plexus/ComponentDescriptorBeanModule
+instanceKlass org/apache/maven/classrealm/ArtifactClassRealmConstituent
+instanceKlass @bci org/apache/maven/RepositoryUtils toArtifacts (Ljava/util/Collection;)Ljava/util/Collection; 6 argL0 ; # org/apache/maven/RepositoryUtils$$Lambda+0x0000019a3d79c690
+instanceKlass org/eclipse/aether/util/graph/visitor/FilteringDependencyVisitor
+instanceKlass org/apache/maven/plugin/internal/WagonExcluder
+instanceKlass org/eclipse/aether/util/filter/ScopeDependencyFilter
+instanceKlass org/eclipse/aether/util/filter/AndDependencyFilter
+instanceKlass @bci org/apache/maven/plugin/DefaultPluginRealmCache get (Lorg/apache/maven/plugin/PluginRealmCache$Key;Lorg/apache/maven/plugin/PluginRealmCache$PluginRealmSupplier;)Lorg/apache/maven/plugin/PluginRealmCache$CacheRecord; 6 member ; # org/apache/maven/plugin/DefaultPluginRealmCache$$Lambda+0x0000019a3d78dac0
+instanceKlass @bci org/apache/maven/plugin/internal/DefaultMavenPluginManager setupPluginRealm (Lorg/apache/maven/plugin/descriptor/PluginDescriptor;Lorg/apache/maven/execution/MavenSession;Ljava/lang/ClassLoader;Ljava/util/List;Lorg/eclipse/aether/graph/DependencyFilter;)V 177 member ; # org/apache/maven/plugin/internal/DefaultMavenPluginManager$$Lambda+0x0000019a3d78d898
+instanceKlass org/apache/maven/plugin/CacheUtils
+instanceKlass org/apache/maven/plugin/DefaultPluginRealmCache$CacheKey
+instanceKlass @bci org/eclipse/m2e/core/internal/embedder/MavenImpl getMojoParameterValue (Lorg/apache/maven/project/MavenProject;Lorg/apache/maven/plugin/MojoExecution;Ljava/lang/String;Ljava/lang/Class;Lorg/eclipse/core/runtime/IProgressMonitor;)Ljava/lang/Object; 10 member ; # org/eclipse/m2e/core/internal/embedder/MavenImpl$$Lambda+0x0000019a3d799030
+instanceKlass @bci org/eclipse/m2e/core/internal/embedder/MavenImpl setupMojoExecution (Lorg/apache/maven/project/MavenProject;Lorg/apache/maven/plugin/MojoExecution;Lorg/eclipse/core/runtime/IProgressMonitor;)Lorg/apache/maven/plugin/MojoExecution; 8 member ; # org/eclipse/m2e/core/internal/embedder/MavenImpl$$Lambda+0x0000019a3d798e08
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter (Ljava/util/List;Lorg/eclipse/m2e/core/project/configurator/MojoExecutionKey;)V 22 member ; # org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter$$Lambda+0x0000019a3d798bb0
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter (Ljava/util/List;Lorg/eclipse/m2e/core/project/configurator/MojoExecutionKey;)V 11 argL0 ; # org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter$$Lambda+0x0000019a3d798970
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter anyFilterMatches (Lorg/osgi/framework/Bundle;Ljava/util/List;)Z 25 member ; # org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter$$Lambda+0x0000019a3d798718
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter anyFilterMatches (Lorg/osgi/framework/Bundle;Ljava/util/List;)Z 14 member ; # org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter$$Lambda+0x0000019a3d7984c0
+instanceKlass org/eclipse/m2e/core/internal/lifecyclemapping/MojoExecutionFilter
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/SimpleMappingMetadataSource getLifecycleMappingMetadata (Ljava/lang/String;Ljava/util/function/Predicate;)Lorg/eclipse/m2e/core/internal/lifecyclemapping/model/LifecycleMappingMetadata; 16 member ; # org/eclipse/m2e/core/internal/lifecyclemapping/SimpleMappingMetadataSource$$Lambda+0x0000019a3d798000
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/PackagingTypeFilter (Ljava/util/List;Ljava/lang/String;)V 22 member ; # org/eclipse/m2e/core/internal/lifecyclemapping/PackagingTypeFilter$$Lambda+0x0000019a3d795c00
+instanceKlass org/eclipse/m2e/core/internal/lifecyclemapping/model/LifecycleMappingFilter
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/PackagingTypeFilter (Ljava/util/List;Ljava/lang/String;)V 11 argL0 ; # org/eclipse/m2e/core/internal/lifecyclemapping/PackagingTypeFilter$$Lambda+0x0000019a3d793a80
+instanceKlass org/eclipse/m2e/core/internal/lifecyclemapping/PackagingTypeFilter
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/LifecycleMappingFactory asList (Ljava/util/Map;)Ljava/util/List; 73 argL0 ; # org/eclipse/m2e/core/internal/lifecyclemapping/LifecycleMappingFactory$$Lambda+0x0000019a3d7935f8
+instanceKlass @bci org/eclipse/m2e/core/internal/lifecyclemapping/LifecycleMappingFactory asList (Ljava/util/Map;)Ljava/util/List; 63