diff --git a/hs_err_pid6216.log b/hs_err_pid6216.log new file mode 100644 index 0000000..dad4b04 --- /dev/null +++ b/hs_err_pid6216.log @@ -0,0 +1,932 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (malloc) failed to allocate 664336 bytes. Error detail: Chunk::new +# Possible reasons: +# The system is out of physical RAM or swap space +# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Zero Based Compressed Oops mode in which the Java heap is +# placed in the first 32GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 32GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (arena.cpp:168), pid=6216, tid=3000 +# +# JRE version: OpenJDK Runtime Environment Temurin-21.0.10+7 (21.0.10+7) (build 21.0.10+7-LTS) +# Java VM: OpenJDK 64-Bit Server VM Temurin-21.0.10+7 (21.0.10+7-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, parallel gc, windows-amd64) +# No core dump will be written. Minidumps are not enabled by default on client versions of Windows +# + +--------------- S U M M A R Y ------------ + +Command Line: --add-modules=ALL-SYSTEM --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED -Declipse.application=org.eclipse.jdt.ls.core.id1 -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Djava.import.generatesMetadataFilesAtProjectRoot=false -DDetectVMInstallationsJob.disabled=true -Dfile.encoding=utf8 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable -javaagent:c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\29470\AppData\Roaming\Cursor\User\workspaceStorage\edbcc896f3fe3d61a54e553c9ad653cc\redhat.java -Daether.dependencyCollector.impl=bf c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\29470\AppData\Roaming\Cursor\User\globalStorage\redhat.java\1.53.0\config_win -data c:\Users\29470\AppData\Roaming\Cursor\User\workspaceStorage\edbcc896f3fe3d61a54e553c9ad653cc\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-1253b08bf80e3a8568169725d2662b44-sock + +Host: 12th Gen Intel(R) Core(TM) i5-12500H, 16 cores, 15G, Windows 11 , 64 bit Build 22621 (10.0.22621.5305) +Time: Mon Apr 13 10:20:20 2026 elapsed time: 261.333619 seconds (0d 0h 4m 21s) + +--------------- T H R E A D --------------- + +Current thread (0x0000019a7d7fc600): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=3000, stack(0x00000034e2c00000,0x00000034e2d00000) (1024K)] + + +Current CompileTask: +C2:261333 22166 % 4 org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding::createTypeVariables @ 54 (359 bytes) + +Stack: [0x00000034e2c00000,0x00000034e2d00000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x6d7a39] +V [jvm.dll+0x8b4b26] +V [jvm.dll+0x8b70de] +V [jvm.dll+0x8b77c3] +V [jvm.dll+0x284346] +V [jvm.dll+0xc66ed] +V [jvm.dll+0xc6c31] +V [jvm.dll+0x3bec01] +V [jvm.dll+0x38b162] +V [jvm.dll+0x38a5aa] +V [jvm.dll+0x24c560] +V [jvm.dll+0x24bb40] +V [jvm.dll+0x1cb34e] +V [jvm.dll+0x25b85d] +V [jvm.dll+0x259dea] +V [jvm.dll+0x3f857e] +V [jvm.dll+0x85f59d] +V [jvm.dll+0x6d626d] +C [ucrtbase.dll+0x29333] +C [KERNEL32.DLL+0x1259d] +C [ntdll.dll+0x5af78] + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x0000019a109240d0, length=95, elements={ +0x0000019a1fe4b990, 0x0000019a1feea690, 0x0000019a1feebea0, 0x0000019a7d7f5ee0, +0x0000019a7d7f7080, 0x0000019a7d7fad60, 0x0000019a7d7fb7c0, 0x0000019a7d7fc600, +0x0000019a7d85e0b0, 0x0000019a7da64ef0, 0x0000019a7f0c80b0, 0x0000019a7d93a260, +0x0000019a7d86d7e0, 0x0000019a7f4e69e0, 0x0000019a7f4e7050, 0x0000019a044fb010, +0x0000019a040d25d0, 0x0000019a041190e0, 0x0000019a7f812370, 0x0000019a7f814440, +0x0000019a7f813090, 0x0000019a7f813720, 0x0000019a7f814ad0, 0x0000019a7f811ce0, +0x0000019a7f813db0, 0x0000019a7f812a00, 0x0000019a7f4c1a30, 0x0000019a7f4c3470, +0x0000019a7f4c13a0, 0x0000019a7f4c4820, 0x0000019a7f4c3b00, 0x0000019a7f4c20c0, +0x0000019a7f4c4190, 0x0000019a7f4c2750, 0x0000019a7f4c2de0, 0x0000019a047e89d0, +0x0000019a047e3b10, 0x0000019a047e8340, 0x0000019a047e7cb0, 0x0000019a047e6f90, +0x0000019a047e2760, 0x0000019a047e9060, 0x0000019a047e7620, 0x0000019a047e3480, +0x0000019a047e20d0, 0x0000019a047e5550, 0x0000019a047e96f0, 0x0000019a06ee5430, +0x0000019a06ede4a0, 0x0000019a06ee1920, 0x0000019a06ee3360, 0x0000019a06ee4da0, +0x0000019a06ee4710, 0x0000019a06ee0570, 0x0000019a06ee2cd0, 0x0000019a06ee2640, +0x0000019a06ee5ac0, 0x0000019a06edeb30, 0x0000019a06ee1290, 0x0000019a06edf850, +0x0000019a06ee39f0, 0x0000019a06ee1fb0, 0x0000019a06ee4080, 0x0000019a047e6900, +0x0000019a047e5be0, 0x0000019a047e6270, 0x0000019a08056290, 0x0000019a08059da0, +0x0000019a08057cd0, 0x0000019a08052e10, 0x0000019a080541c0, 0x0000019a08056fb0, +0x0000019a0805a430, 0x0000019a08053b30, 0x0000019a08057640, 0x0000019a08058360, +0x0000019a08055c00, 0x0000019a080534a0, 0x0000019a08059080, 0x0000019a08054850, +0x0000019a07c1beb0, 0x0000019a07c190c0, 0x0000019a07c1c540, 0x0000019a07c1d260, +0x0000019a07c19750, 0x0000019a07c17680, 0x0000019a07c16ff0, 0x0000019a07c1df80, +0x0000019a07c1d8f0, 0x0000019a07c17d10, 0x0000019a07c183a0, 0x0000019a07c19de0, +0x0000019a07c1a470, 0x0000019a07c1ab00, 0x0000019a07c1b190 +} + +Java Threads: ( => current thread ) + 0x0000019a1fe4b990 JavaThread "main" [_thread_blocked, id=2856, stack(0x00000034e2200000,0x00000034e2300000) (1024K)] + 0x0000019a1feea690 JavaThread "Reference Handler" daemon [_thread_blocked, id=12440, stack(0x00000034e2600000,0x00000034e2700000) (1024K)] + 0x0000019a1feebea0 JavaThread "Finalizer" daemon [_thread_blocked, id=21288, stack(0x00000034e2700000,0x00000034e2800000) (1024K)] + 0x0000019a7d7f5ee0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=4252, stack(0x00000034e2800000,0x00000034e2900000) (1024K)] + 0x0000019a7d7f7080 JavaThread "Attach Listener" daemon [_thread_blocked, id=12828, stack(0x00000034e2900000,0x00000034e2a00000) (1024K)] + 0x0000019a7d7fad60 JavaThread "Service Thread" daemon [_thread_blocked, id=16256, stack(0x00000034e2a00000,0x00000034e2b00000) (1024K)] + 0x0000019a7d7fb7c0 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=12696, stack(0x00000034e2b00000,0x00000034e2c00000) (1024K)] +=>0x0000019a7d7fc600 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=3000, stack(0x00000034e2c00000,0x00000034e2d00000) (1024K)] + 0x0000019a7d85e0b0 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=23824, stack(0x00000034e2d00000,0x00000034e2e00000) (1024K)] + 0x0000019a7da64ef0 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=4688, stack(0x00000034e3000000,0x00000034e3100000) (1024K)] + 0x0000019a7f0c80b0 JavaThread "Notification Thread" daemon [_thread_blocked, id=12040, stack(0x00000034e3300000,0x00000034e3400000) (1024K)] + 0x0000019a7d93a260 JavaThread "Active Thread: Equinox Container: 9b3f6009-1310-4abf-b0b4-b87bddef89ab" [_thread_blocked, id=12664, stack(0x00000034e2f00000,0x00000034e3000000) (1024K)] + 0x0000019a7d86d7e0 JavaThread "Refresh Thread: Equinox Container: 9b3f6009-1310-4abf-b0b4-b87bddef89ab" daemon [_thread_blocked, id=16156, stack(0x00000034e2e00000,0x00000034e2f00000) (1024K)] + 0x0000019a7f4e69e0 JavaThread "Framework Event Dispatcher: Equinox Container: 9b3f6009-1310-4abf-b0b4-b87bddef89ab" daemon [_thread_blocked, id=22704, stack(0x00000034e3900000,0x00000034e3a00000) (1024K)] + 0x0000019a7f4e7050 JavaThread "Start Level: Equinox Container: 9b3f6009-1310-4abf-b0b4-b87bddef89ab" daemon [_thread_blocked, id=6468, stack(0x00000034e3a00000,0x00000034e3b00000) (1024K)] + 0x0000019a044fb010 JavaThread "Bundle File Closer" daemon [_thread_blocked, id=18492, stack(0x00000034e3e00000,0x00000034e3f00000) (1024K)] + 0x0000019a040d25d0 JavaThread "SCR Component Actor" daemon [_thread_blocked, id=16032, stack(0x00000034e4000000,0x00000034e4100000) (1024K)] + 0x0000019a041190e0 JavaThread "Worker-JM" [_thread_blocked, id=20112, stack(0x00000034e4400000,0x00000034e4500000) (1024K)] + 0x0000019a7f812370 JavaThread "JNA Cleaner" daemon [_thread_blocked, id=6856, stack(0x00000034e4200000,0x00000034e4300000) (1024K)] + 0x0000019a7f814440 JavaThread "Worker-0" [_thread_blocked, id=17500, stack(0x00000034e4500000,0x00000034e4600000) (1024K)] + 0x0000019a7f813090 JavaThread "Worker-1" [_thread_blocked, id=2036, stack(0x00000034e4600000,0x00000034e4700000) (1024K)] + 0x0000019a7f813720 JavaThread "Worker-2: Building" [_thread_in_native, id=18696, stack(0x00000034e4700000,0x00000034e4800000) (1024K)] + 0x0000019a7f814ad0 JavaThread "Java indexing" daemon [_thread_blocked, id=1064, stack(0x00000034e4a00000,0x00000034e4b00000) (1024K)] + 0x0000019a7f811ce0 JavaThread "Worker-3" [_thread_blocked, id=10724, stack(0x00000034e4b00000,0x00000034e4c00000) (1024K)] + 0x0000019a7f813db0 JavaThread "Worker-4" [_thread_blocked, id=3328, stack(0x00000034e1f00000,0x00000034e2000000) (1024K)] + 0x0000019a7f812a00 JavaThread "Worker-5" [_thread_blocked, id=15472, stack(0x00000034e2100000,0x00000034e2200000) (1024K)] + 0x0000019a7f4c1a30 JavaThread "Thread-1" daemon [_thread_in_native, id=22648, stack(0x00000034e4c00000,0x00000034e4d00000) (1024K)] + 0x0000019a7f4c3470 JavaThread "Thread-2" daemon [_thread_in_native, id=14300, stack(0x00000034e4d00000,0x00000034e4e00000) (1024K)] + 0x0000019a7f4c13a0 JavaThread "Thread-3" daemon [_thread_in_native, id=23412, stack(0x00000034e4e00000,0x00000034e4f00000) (1024K)] + 0x0000019a7f4c4820 JavaThread "Thread-4" daemon [_thread_in_native, id=7704, stack(0x00000034e4f00000,0x00000034e5000000) (1024K)] + 0x0000019a7f4c3b00 JavaThread "Thread-5" daemon [_thread_in_native, id=18232, stack(0x00000034e5000000,0x00000034e5100000) (1024K)] + 0x0000019a7f4c20c0 JavaThread "Thread-6" daemon [_thread_in_native, id=21328, stack(0x00000034e5100000,0x00000034e5200000) (1024K)] + 0x0000019a7f4c4190 JavaThread "Thread-7" daemon [_thread_in_native, id=17480, stack(0x00000034e5200000,0x00000034e5300000) (1024K)] + 0x0000019a7f4c2750 JavaThread "Thread-8" daemon [_thread_in_native, id=23408, stack(0x00000034e5300000,0x00000034e5400000) (1024K)] + 0x0000019a7f4c2de0 JavaThread "Thread-9" daemon [_thread_in_native, id=16284, stack(0x00000034e5400000,0x00000034e5500000) (1024K)] + 0x0000019a047e89d0 JavaThread "Thread-10" daemon [_thread_in_native, id=21200, stack(0x00000034e5500000,0x00000034e5600000) (1024K)] + 0x0000019a047e3b10 JavaThread "Thread-11" daemon [_thread_in_native, id=17556, stack(0x00000034e5600000,0x00000034e5700000) (1024K)] + 0x0000019a047e8340 JavaThread "Thread-12" daemon [_thread_in_native, id=7336, stack(0x00000034e5700000,0x00000034e5800000) (1024K)] + 0x0000019a047e7cb0 JavaThread "Thread-13" daemon [_thread_in_native, id=8660, stack(0x00000034e5800000,0x00000034e5900000) (1024K)] + 0x0000019a047e6f90 JavaThread "Thread-14" daemon [_thread_in_native, id=18668, stack(0x00000034e5900000,0x00000034e5a00000) (1024K)] + 0x0000019a047e2760 JavaThread "Thread-15" daemon [_thread_in_native, id=13816, stack(0x00000034e5a00000,0x00000034e5b00000) (1024K)] + 0x0000019a047e9060 JavaThread "Thread-16" daemon [_thread_in_native, id=19888, stack(0x00000034e5b00000,0x00000034e5c00000) (1024K)] + 0x0000019a047e7620 JavaThread "Thread-17" daemon [_thread_in_native, id=1196, stack(0x00000034e5c00000,0x00000034e5d00000) (1024K)] + 0x0000019a047e3480 JavaThread "pool-2-thread-1" [_thread_blocked, id=6284, stack(0x00000034e5d00000,0x00000034e5e00000) (1024K)] + 0x0000019a047e20d0 JavaThread "Worker-6" [_thread_blocked, id=18532, stack(0x00000034e6000000,0x00000034e6100000) (1024K)] + 0x0000019a047e5550 JavaThread "WorkspaceEventsHandler" [_thread_blocked, id=16280, stack(0x00000034e6100000,0x00000034e6200000) (1024K)] + 0x0000019a047e96f0 JavaThread "pool-1-thread-1" [_thread_blocked, id=1828, stack(0x00000034e6200000,0x00000034e6300000) (1024K)] + 0x0000019a06ee5430 JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_blocked, id=3264, stack(0x00000034e6600000,0x00000034e6700000) (1024K)] + 0x0000019a06ede4a0 JavaThread "ForkJoinPool.commonPool-worker-2" daemon [_thread_blocked, id=5416, stack(0x00000034e6700000,0x00000034e6800000) (1024K)] + 0x0000019a06ee1920 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=24684, stack(0x00000034e2000000,0x00000034e2100000) (1024K)] + 0x0000019a06ee3360 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=20560, stack(0x00000034e4900000,0x00000034e4a00000) (1024K)] + 0x0000019a06ee4da0 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=3520, stack(0x00000034e5e00000,0x00000034e5f00000) (1024K)] + 0x0000019a06ee4710 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=16808, stack(0x00000034e5f00000,0x00000034e6000000) (1024K)] + 0x0000019a06ee0570 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=21908, stack(0x00000034e6300000,0x00000034e6400000) (1024K)] + 0x0000019a06ee2cd0 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=14788, stack(0x00000034e6500000,0x00000034e6600000) (1024K)] + 0x0000019a06ee2640 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=9396, stack(0x00000034e6800000,0x00000034e6900000) (1024K)] + 0x0000019a06ee5ac0 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=19404, stack(0x00000034e6900000,0x00000034e6a00000) (1024K)] + 0x0000019a06edeb30 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=20952, stack(0x00000034e6a00000,0x00000034e6b00000) (1024K)] + 0x0000019a06ee1290 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=20928, stack(0x00000034e6b00000,0x00000034e6c00000) (1024K)] + 0x0000019a06edf850 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=22360, stack(0x00000034e6c00000,0x00000034e6d00000) (1024K)] + 0x0000019a06ee39f0 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=8892, stack(0x00000034e6d00000,0x00000034e6e00000) (1024K)] + 0x0000019a06ee1fb0 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=10996, stack(0x00000034e6e00000,0x00000034e6f00000) (1024K)] + 0x0000019a06ee4080 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=20440, stack(0x00000034e6f00000,0x00000034e7000000) (1024K)] + 0x0000019a047e6900 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=13404, stack(0x00000034e7000000,0x00000034e7100000) (1024K)] + 0x0000019a047e5be0 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=21668, stack(0x00000034e7100000,0x00000034e7200000) (1024K)] + 0x0000019a047e6270 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=14940, stack(0x00000034e7200000,0x00000034e7300000) (1024K)] + 0x0000019a08056290 JavaThread "Compiler Processing Task" daemon [_thread_blocked, id=20104, stack(0x00000034e7400000,0x00000034e7500000) (1024K)] + 0x0000019a08059da0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=11484, stack(0x00000034e7500000,0x00000034e7600000) (1024K)] + 0x0000019a08057cd0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=3676, stack(0x00000034e7600000,0x00000034e7700000) (1024K)] + 0x0000019a08052e10 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=25556, stack(0x00000034e7700000,0x00000034e7800000) (1024K)] + 0x0000019a080541c0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=3040, stack(0x00000034e7800000,0x00000034e7900000) (1024K)] + 0x0000019a08056fb0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=24024, stack(0x00000034e7900000,0x00000034e7a00000) (1024K)] + 0x0000019a0805a430 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=6264, stack(0x00000034e7a00000,0x00000034e7b00000) (1024K)] + 0x0000019a08053b30 JavaThread "ForkJoinPool.commonPool-worker-4" daemon [_thread_blocked, id=22252, stack(0x00000034e7c00000,0x00000034e7d00000) (1024K)] + 0x0000019a08057640 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=14780, stack(0x00000034e7e00000,0x00000034e7f00000) (1024K)] + 0x0000019a08058360 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=740, stack(0x00000034e7f00000,0x00000034e8000000) (1024K)] + 0x0000019a08055c00 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=8824, stack(0x00000034e8000000,0x00000034e8100000) (1024K)] + 0x0000019a080534a0 JavaThread "LocalFile Deleter" daemon [_thread_blocked, id=5524, stack(0x00000034e8100000,0x00000034e8200000) (1024K)] + 0x0000019a08059080 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=24500, stack(0x00000034e7d00000,0x00000034e7e00000) (1024K)] + 0x0000019a08054850 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=8248, stack(0x00000034e8300000,0x00000034e8400000) (1024K)] + 0x0000019a07c1beb0 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=14500, stack(0x00000034e8400000,0x00000034e8500000) (1024K)] + 0x0000019a07c190c0 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=21784, stack(0x00000034e8500000,0x00000034e8600000) (1024K)] + 0x0000019a07c1c540 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=23928, stack(0x00000034e8600000,0x00000034e8700000) (1024K)] + 0x0000019a07c1d260 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=996, stack(0x00000034e8700000,0x00000034e8800000) (1024K)] + 0x0000019a07c19750 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=948, stack(0x00000034e8800000,0x00000034e8900000) (1024K)] + 0x0000019a07c17680 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=23488, stack(0x00000034e8900000,0x00000034e8a00000) (1024K)] + 0x0000019a07c16ff0 JavaThread "Compiler Source File Reader" daemon [_thread_blocked, id=4244, stack(0x00000034e8a00000,0x00000034e8b00000) (1024K)] + 0x0000019a07c1df80 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=17416, stack(0x00000034e8b00000,0x00000034e8c00000) (1024K)] + 0x0000019a07c1d8f0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=23884, stack(0x00000034e8c00000,0x00000034e8d00000) (1024K)] + 0x0000019a07c17d10 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=24612, stack(0x00000034e8200000,0x00000034e8300000) (1024K)] + 0x0000019a07c183a0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=21516, stack(0x00000034e8d00000,0x00000034e8e00000) (1024K)] + 0x0000019a07c19de0 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=25088, stack(0x00000034e8e00000,0x00000034e8f00000) (1024K)] + 0x0000019a07c1a470 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=17688, stack(0x00000034e8f00000,0x00000034e9000000) (1024K)] + 0x0000019a07c1ab00 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=16752, stack(0x00000034e9000000,0x00000034e9100000) (1024K)] + 0x0000019a07c1b190 JavaThread "Compiler Class File Writer" daemon [_thread_blocked, id=3588, stack(0x00000034e9100000,0x00000034e9200000) (1024K)] +Total: 95 + +Other Threads: + 0x0000019a7d7f4af0 VMThread "VM Thread" [id=24396, stack(0x00000034e2500000,0x00000034e2600000) (1024K)] + 0x0000019a1feb55e0 WatcherThread "VM Periodic Task Thread" [id=19428, stack(0x00000034e2400000,0x00000034e2500000) (1024K)] + 0x0000019a1fe69a70 WorkerThread "GC Thread#0" [id=22568, stack(0x00000034e2300000,0x00000034e2400000) (1024K)] + 0x0000019a7da64b20 WorkerThread "GC Thread#1" [id=2212, stack(0x00000034e3100000,0x00000034e3200000) (1024K)] + 0x0000019a7d8e9d60 WorkerThread "GC Thread#2" [id=15052, stack(0x00000034e3200000,0x00000034e3300000) (1024K)] + 0x0000019a7f2229b0 WorkerThread "GC Thread#3" [id=16528, stack(0x00000034e3400000,0x00000034e3500000) (1024K)] + 0x0000019a7f222d60 WorkerThread "GC Thread#4" [id=19140, stack(0x00000034e3500000,0x00000034e3600000) (1024K)] + 0x0000019a7f223110 WorkerThread "GC Thread#5" [id=25096, stack(0x00000034e3600000,0x00000034e3700000) (1024K)] + 0x0000019a7f2234c0 WorkerThread "GC Thread#6" [id=1300, stack(0x00000034e3700000,0x00000034e3800000) (1024K)] + 0x0000019a7f5902d0 WorkerThread "GC Thread#7" [id=6564, stack(0x00000034e3800000,0x00000034e3900000) (1024K)] + 0x0000019a0437c010 WorkerThread "GC Thread#8" [id=22424, stack(0x00000034e3b00000,0x00000034e3c00000) (1024K)] + 0x0000019a7db483f0 WorkerThread "GC Thread#9" [id=12336, stack(0x00000034e3c00000,0x00000034e3d00000) (1024K)] + 0x0000019a7db487a0 WorkerThread "GC Thread#10" [id=13912, stack(0x00000034e3d00000,0x00000034e3e00000) (1024K)] + 0x0000019a04418d30 WorkerThread "GC Thread#11" [id=3304, stack(0x00000034e4100000,0x00000034e4200000) (1024K)] + 0x0000019a7f1c4910 WorkerThread "GC Thread#12" [id=8964, stack(0x00000034e4800000,0x00000034e4900000) (1024K)] +Total: 15 + +Threads with active compile tasks: +C2 CompilerThread0 261411 22166 % 4 org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding::createTypeVariables @ 54 (359 bytes) +Total: 1 + +VM state: not at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: None + +Heap address: 0x0000000700000000, size: 4096 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x0000019a3c000000-0x0000019a3cba0000-0x0000019a3cba0000), size 12189696, SharedBaseAddress: 0x0000019a3c000000, ArchiveRelocationMode: 1. +Compressed class space mapped at: 0x0000019a3d000000-0x0000019a7d000000, reserved size: 1073741824 +Narrow klass base: 0x0000019a3c000000, Narrow klass shift: 0, Narrow klass range: 0x100000000 + +GC Precious Log: + CardTable entry size: 512 + CPUs: 16 total, 16 available + Memory: 16110M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Alignments: Space 512K, Generation 512K, Heap 2M + Heap Min Capacity: 100M + Heap Initial Capacity: 100M + Heap Max Capacity: 4G + Pre-touch: Disabled + Parallel Workers: 13 + +Heap: + PSYoungGen total 3072K, used 2690K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 85% used [0x00000007aab00000,0x00000007aad20ba0,0x00000007aad80000) + from space 512K, 100% used [0x00000007aae00000,0x00000007aae80000,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 219313K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d62c448,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K + +Card table byte_map: [0x0000019a32040000,0x0000019a32850000] _byte_map_base: 0x0000019a2e840000 + +Marking Bits: (ParMarkBitMap*) 0x00007fff167c3450 + Begin Bits: [0x0000019a32850000, 0x0000019a36850000) + End Bits: [0x0000019a36850000, 0x0000019a3a850000) + +Polling page: 0x0000019a1f600000 + +Metaspace: + +Usage: + Non-class: 67.94 MB used. + Class: 7.53 MB used. + Both: 75.47 MB used. + +Virtual space: + Non-class space: 128.00 MB reserved, 68.81 MB ( 54%) committed, 2 nodes. + Class space: 1.00 GB reserved, 8.25 MB ( <1%) committed, 1 nodes. + Both: 1.12 GB reserved, 77.06 MB ( 7%) committed. + +Chunk freelists: + Non-Class: 10.41 MB + Class: 7.60 MB + Both: 18.01 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 128.38 MB +CDS: on + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 8388608. + - enlarge_chunks_in_place: 1. + - use_allocation_guard: 0. + + +Internal statistics: + +num_allocs_failed_limit: 9. +num_arena_births: 1438. +num_arena_deaths: 34. +num_vsnodes_births: 3. +num_vsnodes_deaths: 0. +num_space_committed: 1233. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 53. +num_chunks_taken_from_freelist: 5030. +num_chunk_merges: 17. +num_chunk_splits: 3024. +num_chunks_enlarged: 1650. +num_inconsistent_stats: 0. + +CodeHeap 'non-profiled nmethods': size=119168Kb used=19623Kb max_used=28128Kb free=99544Kb + bounds [0x0000019a2abe0000, 0x0000019a2c760000, 0x0000019a32040000] +CodeHeap 'profiled nmethods': size=119104Kb used=31795Kb max_used=53987Kb free=87308Kb + bounds [0x0000019a23040000, 0x0000019a26510000, 0x0000019a2a490000] +CodeHeap 'non-nmethods': size=7488Kb used=1476Kb max_used=3187Kb free=6011Kb + bounds [0x0000019a2a490000, 0x0000019a2a880000, 0x0000019a2abe0000] +CodeCache: size=245760Kb, used=52894Kb, max_used=85302Kb, free=192863Kb + total_blobs=16091, nmethods=15298, adapters=695, full_count=0 +Compilation: enabled, stopped_count=0, restarted_count=0 + +Compilation events (20 events): +Event: 260.618 Thread 0x0000019a7d85e0b0 nmethod 22156 0x0000019a231cd590 code [0x0000019a231cd760, 0x0000019a231cda90] +Event: 260.854 Thread 0x0000019a7d85e0b0 22157 3 org.eclipse.core.internal.dtree.DataTreeNode::compareWith (74 bytes) +Event: 260.854 Thread 0x0000019a7d85e0b0 nmethod 22157 0x0000019a23062790 code [0x0000019a23062980, 0x0000019a23062ec0] +Event: 260.857 Thread 0x0000019a7d7fc600 22158 4 org.eclipse.jdt.internal.core.PackageFragmentRoot::resource (17 bytes) +Event: 260.860 Thread 0x0000019a7d7fc600 nmethod 22158 0x0000019a2abea490 code [0x0000019a2abea640, 0x0000019a2abea840] +Event: 260.860 Thread 0x0000019a7d7fc600 22159 4 org.eclipse.jdt.internal.core.JarPackageFragmentRoot::equals (55 bytes) +Event: 260.864 Thread 0x0000019a7d7fc600 nmethod 22159 0x0000019a2ac3ed10 code [0x0000019a2ac3ef00, 0x0000019a2ac3f4a0] +Event: 261.241 Thread 0x0000019a7d7fc600 22160 4 org.eclipse.jdt.internal.core.builder.ClasspathMultiReleaseJar::initializeVersions (99 bytes) +Event: 261.246 Thread 0x0000019a7d85e0b0 22161 3 org.eclipse.jdt.internal.compiler.lookup.SplitPackageBinding::findPackage (231 bytes) +Event: 261.247 Thread 0x0000019a7d85e0b0 nmethod 22161 0x0000019a23c3c210 code [0x0000019a23c3c5c0, 0x0000019a23c3e138] +Event: 261.257 Thread 0x0000019a7d7fc600 nmethod 22160 0x0000019a2bd23890 code [0x0000019a2bd23b20, 0x0000019a2bd24e38] +Event: 261.257 Thread 0x0000019a7d7fc600 22162 4 org.eclipse.jdt.internal.compiler.lookup.MethodScope::checkAndSetModifiersForMethod (713 bytes) +Event: 261.261 Thread 0x0000019a7d7fc600 nmethod 22162 0x0000019a2b390410 code [0x0000019a2b390620, 0x0000019a2b390d28] +Event: 261.278 Thread 0x0000019a7d7fc600 22163 4 org.eclipse.jdt.internal.compiler.util.JRTUtil::getModulesDeclaringPackage (15 bytes) +Event: 261.279 Thread 0x0000019a7d7fc600 nmethod 22163 0x0000019a2abee390 code [0x0000019a2abee520, 0x0000019a2abee5d0] +Event: 261.282 Thread 0x0000019a7d7fc600 22164 4 org.eclipse.jdt.internal.compiler.classfmt.MethodInfo::decodeMethodAnnotations (177 bytes) +Event: 261.283 Thread 0x0000019a7d85e0b0 22165 3 org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding::computeId (3060 bytes) +Event: 261.287 Thread 0x0000019a7d85e0b0 nmethod 22165 0x0000019a24609690 code [0x0000019a2460a740, 0x0000019a24612238] +Event: 261.289 Thread 0x0000019a7d7fc600 nmethod 22164 0x0000019a2b545610 code [0x0000019a2b5457e0, 0x0000019a2b546000] +Event: 261.304 Thread 0x0000019a7d7fc600 22166 % 4 org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding::createTypeVariables @ 54 (359 bytes) + +GC Heap History (20 events): +Event: 260.662 GC heap before +{Heap before GC invocations=3043 (full 5): + PSYoungGen total 3072K, used 3042K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 98% used [0x00000007aab00000,0x00000007aad79238,0x00000007aad80000) + from space 512K, 99% used [0x00000007aae00000,0x00000007aae7f790,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 198723K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 89% used [0x0000000700000000,0x000000070c210e00,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.662 GC heap after +{Heap after GC invocations=3043 (full 5): + PSYoungGen total 3584K, used 1018K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7e928,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 200694K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 90% used [0x0000000700000000,0x000000070c3fd8b0,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.690 GC heap before +{Heap before GC invocations=3044 (full 5): + PSYoungGen total 3584K, used 3578K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 100% used [0x00000007aab00000,0x00000007aad80000,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7e928,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 203162K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 91% used [0x0000000700000000,0x000000070c6668c8,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.692 GC heap after +{Heap after GC invocations=3044 (full 5): + PSYoungGen total 3072K, used 509K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 512K, 99% used [0x00000007aae00000,0x00000007aae7f500,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 206041K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 92% used [0x0000000700000000,0x000000070c9365a0,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.702 GC heap before +{Heap before GC invocations=3045 (full 5): + PSYoungGen total 3072K, used 3046K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 99% used [0x00000007aab00000,0x00000007aad7a5b8,0x00000007aad80000) + from space 512K, 99% used [0x00000007aae00000,0x00000007aae7f500,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 206041K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 92% used [0x0000000700000000,0x000000070c9365a0,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.705 GC heap after +{Heap after GC invocations=3045 (full 5): + PSYoungGen total 3584K, used 1020K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7f118,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 208039K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 93% used [0x0000000700000000,0x000000070cb29ec8,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.732 GC heap before +{Heap before GC invocations=3046 (full 5): + PSYoungGen total 3584K, used 3580K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 100% used [0x00000007aab00000,0x00000007aad80000,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7f118,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 208039K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 93% used [0x0000000700000000,0x000000070cb29ec8,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.733 GC heap after +{Heap after GC invocations=3046 (full 5): + PSYoungGen total 3072K, used 489K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 512K, 95% used [0x00000007aae00000,0x00000007aae7a628,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 210966K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 94% used [0x0000000700000000,0x000000070ce05a18,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.755 GC heap before +{Heap before GC invocations=3047 (full 5): + PSYoungGen total 3072K, used 2981K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 97% used [0x00000007aab00000,0x00000007aad6ef48,0x00000007aad80000) + from space 512K, 95% used [0x00000007aae00000,0x00000007aae7a628,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 210966K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 94% used [0x0000000700000000,0x000000070ce05a18,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.757 GC heap after +{Heap after GC invocations=3047 (full 5): + PSYoungGen total 3584K, used 1017K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7e688,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 212784K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 95% used [0x0000000700000000,0x000000070cfcc008,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.771 GC heap before +{Heap before GC invocations=3048 (full 5): + PSYoungGen total 3584K, used 3570K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 99% used [0x00000007aab00000,0x00000007aad7e570,0x00000007aad80000) + from space 1024K, 99% used [0x00000007aae80000,0x00000007aaf7e688,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 212784K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 95% used [0x0000000700000000,0x000000070cfcc008,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 260.772 GC heap after +{Heap after GC invocations=3048 (full 5): + PSYoungGen total 3072K, used 499K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 512K, 97% used [0x00000007aae00000,0x00000007aae7cd58,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 215706K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 97% used [0x0000000700000000,0x000000070d2a69a0,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.200 GC heap before +{Heap before GC invocations=3049 (full 5): + PSYoungGen total 3072K, used 3050K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 99% used [0x00000007aab00000,0x00000007aad7dc48,0x00000007aad80000) + from space 512K, 97% used [0x00000007aae00000,0x00000007aae7cd58,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 215706K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 97% used [0x0000000700000000,0x000000070d2a69a0,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.201 GC heap after +{Heap after GC invocations=3049 (full 5): + PSYoungGen total 3584K, used 1013K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 1024K, 98% used [0x00000007aae80000,0x00000007aaf7d558,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 217151K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 97% used [0x0000000700000000,0x000000070d40fc18,0x000000070d900000) + Metaspace used 77278K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.249 GC heap before +{Heap before GC invocations=3050 (full 5): + PSYoungGen total 3584K, used 3573K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 100% used [0x00000007aab00000,0x00000007aad80000,0x00000007aad80000) + from space 1024K, 98% used [0x00000007aae80000,0x00000007aaf7d558,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 217151K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 97% used [0x0000000700000000,0x000000070d40fc18,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.249 GC heap after +{Heap after GC invocations=3050 (full 5): + PSYoungGen total 3072K, used 501K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 512K, 98% used [0x00000007aae00000,0x00000007aae7d7e8,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 218448K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d554098,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.282 GC heap before +{Heap before GC invocations=3051 (full 5): + PSYoungGen total 3072K, used 3061K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 100% used [0x00000007aab00000,0x00000007aad80000,0x00000007aad80000) + from space 512K, 98% used [0x00000007aae00000,0x00000007aae7d7e8,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 218448K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d554098,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.283 GC heap after +{Heap after GC invocations=3051 (full 5): + PSYoungGen total 3584K, used 544K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 1024K, 53% used [0x00000007aae80000,0x00000007aaf08000,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 218953K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d5d2448,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.306 GC heap before +{Heap before GC invocations=3052 (full 5): + PSYoungGen total 3584K, used 3104K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 100% used [0x00000007aab00000,0x00000007aad80000,0x00000007aad80000) + from space 1024K, 53% used [0x00000007aae80000,0x00000007aaf08000,0x00000007aaf80000) + to space 512K, 0% used [0x00000007aae00000,0x00000007aae00000,0x00000007aae80000) + ParOldGen total 222208K, used 218953K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d5d2448,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} +Event: 261.306 GC heap after +{Heap after GC invocations=3052 (full 5): + PSYoungGen total 3072K, used 512K [0x00000007aab00000, 0x00000007aaf80000, 0x0000000800000000) + eden space 2560K, 0% used [0x00000007aab00000,0x00000007aab00000,0x00000007aad80000) + from space 512K, 100% used [0x00000007aae00000,0x00000007aae80000,0x00000007aae80000) + to space 1024K, 0% used [0x00000007aae80000,0x00000007aae80000,0x00000007aaf80000) + ParOldGen total 222208K, used 219313K [0x0000000700000000, 0x000000070d900000, 0x00000007aab00000) + object space 222208K, 98% used [0x0000000700000000,0x000000070d62c448,0x000000070d900000) + Metaspace used 77280K, committed 78912K, reserved 1179648K + class space used 7707K, committed 8448K, reserved 1048576K +} + +Dll operation events (12 events): +Event: 0.046 Loaded shared library c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\java.dll +Event: 0.184 Loaded shared library c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\zip.dll +Event: 0.258 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\instrument.dll +Event: 0.263 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\net.dll +Event: 0.267 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\nio.dll +Event: 0.270 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\zip.dll +Event: 0.287 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\jimage.dll +Event: 0.366 Loaded shared library c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\verify.dll +Event: 30.026 Loaded shared library C:\Users\29470\AppData\Roaming\Cursor\User\globalStorage\redhat.java\1.53.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.3.0.v20260203-2149\eclipse_11919.dll +Event: 53.796 Loaded shared library C:\Users\29470\AppData\Local\Temp\jna-47925862\jna6089012982961748806.dll +Event: 60.385 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\sunmscapi.dll +Event: 61.112 Loaded shared library C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\extnet.dll + +Deoptimization events (20 events): +Event: 253.472 Thread 0x0000019a1feebea0 DEOPT PACKING pc=0x0000019a2ae22998 sp=0x00000034e27ff580 +Event: 253.472 Thread 0x0000019a1feebea0 DEOPT UNPACKING pc=0x0000019a2a4e3aa2 sp=0x00000034e27ff500 mode 2 +Event: 257.426 Thread 0x0000019a055a0620 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000019a2b474974 relative=0x00000000000000d4 +Event: 257.426 Thread 0x0000019a055a0620 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000019a2b474974 method=java.util.concurrent.ConcurrentHashMap.sumCount()J @ 41 c2 +Event: 257.426 Thread 0x0000019a055a0620 DEOPT PACKING pc=0x0000019a2b474974 sp=0x00000034e93feb30 +Event: 257.426 Thread 0x0000019a055a0620 DEOPT UNPACKING pc=0x0000019a2a4e3aa2 sp=0x00000034e93feaa0 mode 2 +Event: 259.227 Thread 0x0000019a7f813720 DEOPT PACKING pc=0x0000019a264ba843 sp=0x00000034e47fcd50 +Event: 259.227 Thread 0x0000019a7f813720 DEOPT UNPACKING pc=0x0000019a2a4e4242 sp=0x00000034e47fc250 mode 0 +Event: 259.389 Thread 0x0000019a7f813720 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000019a2be6f5ac relative=0x000000000000234c +Event: 259.389 Thread 0x0000019a7f813720 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000019a2be6f5ac method=org.eclipse.core.internal.dtree.AbstractDataTreeNode.assembleWith([Lorg/eclipse/core/internal/dtree/AbstractDataTreeNode;[Lorg/eclipse/core/internal/dtree/AbstractDataTreeNo +Event: 259.389 Thread 0x0000019a7f813720 DEOPT PACKING pc=0x0000019a2be6f5ac sp=0x00000034e47fdae0 +Event: 259.389 Thread 0x0000019a7f813720 DEOPT UNPACKING pc=0x0000019a2a4e3aa2 sp=0x00000034e47fdab0 mode 2 +Event: 260.854 Thread 0x0000019a047e20d0 Uncommon trap: trap_request=0xffffffd6 fr.pc=0x0000019a2c7257b0 relative=0x0000000000003e70 +Event: 260.854 Thread 0x0000019a047e20d0 Uncommon trap: reason=array_check action=maybe_recompile pc=0x0000019a2c7257b0 method=org.eclipse.core.internal.events.NodeIDMap.put(JLorg/eclipse/core/runtime/IPath;Lorg/eclipse/core/runtime/IPath;)V @ 225 c2 +Event: 260.854 Thread 0x0000019a047e20d0 DEOPT PACKING pc=0x0000019a2c7257b0 sp=0x00000034e60feae0 +Event: 260.854 Thread 0x0000019a047e20d0 DEOPT UNPACKING pc=0x0000019a2a4e3aa2 sp=0x00000034e60fe8a0 mode 2 +Event: 261.252 Thread 0x0000019a7f813720 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000019a2c7337a0 relative=0x00000000000035c0 +Event: 261.252 Thread 0x0000019a7f813720 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000019a2c7337a0 method=org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.computeId()V @ 2907 c2 +Event: 261.252 Thread 0x0000019a7f813720 DEOPT PACKING pc=0x0000019a2c7337a0 sp=0x00000034e47fd3e0 +Event: 261.252 Thread 0x0000019a7f813720 DEOPT UNPACKING pc=0x0000019a2a4e3aa2 sp=0x00000034e47fd360 mode 2 + +Classes loaded (20 events): +Event: 206.735 Loading class sun/security/ssl/PostHandshakeContext +Event: 206.735 Loading class sun/security/ssl/PostHandshakeContext done +Event: 206.736 Loading class sun/security/ssl/NewSessionTicket$T13NewSessionTicketMessage +Event: 206.736 Loading class sun/security/ssl/NewSessionTicket$T13NewSessionTicketMessage done +Event: 206.892 Loading class java/io/SequenceInputStream +Event: 206.892 Loading class java/io/SequenceInputStream done +Event: 206.892 Loading class java/util/zip/GZIPInputStream$1 +Event: 206.892 Loading class java/util/zip/GZIPInputStream$1 done +Event: 230.770 Loading class java/io/CharArrayWriter +Event: 230.786 Loading class java/io/CharArrayWriter done +Event: 230.810 Loading class java/nio/file/attribute/PosixFileAttributes +Event: 230.811 Loading class java/nio/file/attribute/PosixFileAttributes done +Event: 251.321 Loading class jdk/internal/module/IllegalAccessLogger +Event: 251.321 Loading class jdk/internal/module/IllegalAccessLogger done +Event: 251.511 Loading class java/lang/Throwable$WrappedPrintWriter +Event: 251.511 Loading class java/lang/Throwable$PrintStreamOrWriter +Event: 251.511 Loading class java/lang/Throwable$PrintStreamOrWriter done +Event: 251.511 Loading class java/lang/Throwable$WrappedPrintWriter done +Event: 260.460 Loading class jdk/internal/module/IllegalAccessLogger +Event: 260.460 Loading class jdk/internal/module/IllegalAccessLogger done + +Classes unloaded (17 events): +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a8800 'java/lang/invoke/LambdaForm$MH+0x0000019a3d1a8800' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a8400 'java/lang/invoke/LambdaForm$MH+0x0000019a3d1a8400' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a8000 'java/lang/invoke/LambdaForm$MH+0x0000019a3d1a8000' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a7c00 'java/lang/invoke/LambdaForm$MH+0x0000019a3d1a7c00' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a7800 'java/lang/invoke/LambdaForm$BMH+0x0000019a3d1a7800' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a7400 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d1a7400' +Event: 56.721 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d1a6400 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d1a6400' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d4b1400 'jdk/internal/reflect/GeneratedSerializationConstructorAccessor32' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d49c000 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d49c000' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d488c00 'jdk/internal/reflect/GeneratedSerializationConstructorAccessor31' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d488400 'jdk/internal/reflect/GeneratedSerializationConstructorAccessor29' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d485c00 'jdk/internal/reflect/GeneratedSerializationConstructorAccessor26' +Event: 71.171 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d484800 'jdk/internal/reflect/GeneratedSerializationConstructorAccessor25' +Event: 253.253 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d700c00 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d700c00' +Event: 253.253 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d700400 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d700400' +Event: 253.253 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d701400 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d701400' +Event: 253.253 Thread 0x0000019a7d7f4af0 Unloading class 0x0000019a3d701000 'java/lang/invoke/LambdaForm$DMH+0x0000019a3d701000' + +Classes redefined (0 events): +No events + +Internal exceptions (20 events): +Event: 259.422 Thread 0x0000019a7f813720 Exception (0x00000007aad2d4f0) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.424 Thread 0x0000019a7f813720 Exception (0x00000007aad61a80) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.424 Thread 0x0000019a06ee1920 Exception (0x00000007aad6d208) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.424 Thread 0x0000019a06ee2640 Exception (0x00000007aad6f538) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.424 Thread 0x0000019a08058360 Exception (0x00000007aad15198) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.424 Thread 0x0000019a06ee4da0 Exception (0x00000007aad125f8) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.427 Thread 0x0000019a7f813720 Exception (0x00000007aab01f08) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 259.427 Thread 0x0000019a7f813720 Exception (0x00000007aab19110) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.490 Thread 0x0000019a7f813720 Exception (0x00000007aad115d0) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.491 Thread 0x0000019a7f813720 Exception (0x00000007aad6b5a8) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.621 Thread 0x0000019a7f813720 Exception (0x00000007aace9090) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.622 Thread 0x0000019a06ee1920 Exception (0x00000007aacebd68) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.622 Thread 0x0000019a06ee1920 Exception (0x00000007aacedd88) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.622 Thread 0x0000019a08058360 Exception (0x00000007aacee980) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06ee4da0 Exception (0x00000007aacf5018) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06ee1920 Exception (0x00000007aacf1d38) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06ee2640 Exception (0x00000007aacf29d0) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06edeb30 Exception (0x00000007aacf8218) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06ee4710 Exception (0x00000007aacf96f0) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] +Event: 260.623 Thread 0x0000019a06ee2cd0 Exception (0x00000007aacfac90) +thrown [s\src\hotspot\share\prims\jni.cpp, line 520] + +ZGC Phase Switch (0 events): +No events + +VM Operations (20 events): +Event: 260.662 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.662 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 260.690 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.692 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 260.702 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.705 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 260.732 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.733 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 260.755 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.757 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 260.771 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 260.772 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 261.200 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 261.201 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 261.249 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 261.249 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 261.282 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 261.283 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done +Event: 261.306 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) +Event: 261.306 Executing safepoint VM operation: ParallelGCFailedAllocation (Allocation Failure) done + +Memory protections (0 events): +No events + +Nmethod flushes (20 events): +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26445110 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644bb90 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644c090 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644c690 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644d010 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644d490 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644ea90 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2644f190 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26450e10 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26459f90 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2645ac10 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2645e310 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2645ee10 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2645f610 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26460290 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26462d10 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing osr nmethod 0x0000019a2646d510 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a2646dc90 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a26484310 +Event: 259.817 Thread 0x0000019a7d7f4af0 flushing nmethod 0x0000019a264ec890 + +Events (20 events): +Event: 254.355 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a6f20 +Event: 254.356 Thread 0x0000019a055a6f20 Thread exited: 0x0000019a055a6f20 +Event: 254.356 Thread 0x0000019a055a47c0 Thread exited: 0x0000019a055a47c0 +Event: 254.356 Thread 0x0000019a055a4130 Thread exited: 0x0000019a055a4130 +Event: 254.356 Thread 0x0000019a055a3aa0 Thread exited: 0x0000019a055a3aa0 +Event: 254.356 Thread 0x0000019a055a26f0 Thread exited: 0x0000019a055a26f0 +Event: 254.393 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a3410 +Event: 254.393 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a26f0 +Event: 254.393 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a6f20 +Event: 254.393 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a3aa0 +Event: 254.393 Thread 0x0000019a7f813720 Thread added: 0x0000019a055a0620 +Event: 258.744 Thread 0x0000019a055a3aa0 Thread exited: 0x0000019a055a3aa0 +Event: 258.744 Thread 0x0000019a055a6f20 Thread exited: 0x0000019a055a6f20 +Event: 258.744 Thread 0x0000019a055a3410 Thread exited: 0x0000019a055a3410 +Event: 258.744 Thread 0x0000019a055a0620 Thread exited: 0x0000019a055a0620 +Event: 258.744 Thread 0x0000019a055a26f0 Thread exited: 0x0000019a055a26f0 +Event: 259.319 Thread 0x0000019a7d7fc600 Thread added: 0x0000019a13696570 +Event: 260.455 Thread 0x0000019a13696570 Thread exited: 0x0000019a13696570 +Event: 260.533 Thread 0x0000019a7d85e0b0 Thread added: 0x0000019a05e1b160 +Event: 260.854 Thread 0x0000019a05e1b160 Thread exited: 0x0000019a05e1b160 + + +Dynamic libraries: +0x00007ff6ed120000 - 0x00007ff6ed12e000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\java.exe +0x00007fffa6370000 - 0x00007fffa6587000 C:\Windows\SYSTEM32\ntdll.dll +0x00007fffa5eb0000 - 0x00007fffa5f74000 C:\Windows\System32\KERNEL32.DLL +0x00007fffa38e0000 - 0x00007fffa3cb3000 C:\Windows\System32\KERNELBASE.dll +0x00007fffa37c0000 - 0x00007fffa38d1000 C:\Windows\System32\ucrtbase.dll +0x00007fff8d3c0000 - 0x00007fff8d3d8000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\jli.dll +0x00007fff7cb40000 - 0x00007fff7cb5e000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\VCRUNTIME140.dll +0x00007fffa4ea0000 - 0x00007fffa5051000 C:\Windows\System32\USER32.dll +0x00007fffa3fd0000 - 0x00007fffa3ff6000 C:\Windows\System32\win32u.dll +0x00007fffa5e80000 - 0x00007fffa5ea9000 C:\Windows\System32\GDI32.dll +0x00007fff85e50000 - 0x00007fff860eb000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.5240_none_2710eadf7384a318\COMCTL32.dll +0x00007fffa3460000 - 0x00007fffa3584000 C:\Windows\System32\gdi32full.dll +0x00007fffa6080000 - 0x00007fffa6127000 C:\Windows\System32\msvcrt.dll +0x00007fffa3d70000 - 0x00007fffa3e0a000 C:\Windows\System32\msvcp_win.dll +0x00007fffa4b20000 - 0x00007fffa4b51000 C:\Windows\System32\IMM32.DLL +0x00007fff99420000 - 0x00007fff9942c000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\vcruntime140_1.dll +0x00007fff26510000 - 0x00007fff2659d000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\msvcp140.dll +0x00007fff15b00000 - 0x00007fff168a1000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\server\jvm.dll +0x00007fffa5d50000 - 0x00007fffa5e01000 C:\Windows\System32\ADVAPI32.dll +0x00007fffa4cc0000 - 0x00007fffa4d67000 C:\Windows\System32\sechost.dll +0x00007fffa3d40000 - 0x00007fffa3d68000 C:\Windows\System32\bcrypt.dll +0x00007fffa4d70000 - 0x00007fffa4e84000 C:\Windows\System32\RPCRT4.dll +0x00007fffa6000000 - 0x00007fffa6071000 C:\Windows\System32\WS2_32.dll +0x00007fff9a2c0000 - 0x00007fff9a2f4000 C:\Windows\SYSTEM32\WINMM.dll +0x00007fffa3180000 - 0x00007fffa31cd000 C:\Windows\SYSTEM32\POWRPROF.dll +0x00007fff9b750000 - 0x00007fff9b75a000 C:\Windows\SYSTEM32\VERSION.dll +0x00007fffa3160000 - 0x00007fffa3173000 C:\Windows\SYSTEM32\UMPDC.dll +0x00007fffa24a0000 - 0x00007fffa24b8000 C:\Windows\SYSTEM32\kernel.appcore.dll +0x00007fff8a200000 - 0x00007fff8a20a000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\jimage.dll +0x00007fffa0da0000 - 0x00007fffa0fd2000 C:\Windows\SYSTEM32\DBGHELP.DLL +0x00007fffa50b0000 - 0x00007fffa5443000 C:\Windows\System32\combase.dll +0x00007fffa5a90000 - 0x00007fffa5b67000 C:\Windows\System32\OLEAUT32.dll +0x00007fff844e0000 - 0x00007fff84512000 C:\Windows\SYSTEM32\dbgcore.DLL +0x00007fffa3cc0000 - 0x00007fffa3d3b000 C:\Windows\System32\bcryptPrimitives.dll +0x00007fff7cb30000 - 0x00007fff7cb3f000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\instrument.dll +0x00007fff7cb10000 - 0x00007fff7cb30000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\java.dll +0x00007fffa41e0000 - 0x00007fffa4a82000 C:\Windows\System32\SHELL32.dll +0x00007fffa3e10000 - 0x00007fffa3f4f000 C:\Windows\System32\wintypes.dll +0x00007fffa13a0000 - 0x00007fffa1cbd000 C:\Windows\SYSTEM32\windows.storage.dll +0x00007fffa6220000 - 0x00007fffa632b000 C:\Windows\System32\SHCORE.dll +0x00007fffa5ce0000 - 0x00007fffa5d49000 C:\Windows\System32\shlwapi.dll +0x00007fffa3390000 - 0x00007fffa33bb000 C:\Windows\SYSTEM32\profapi.dll +0x00007fff59780000 - 0x00007fff59798000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\zip.dll +0x00007fff78bc0000 - 0x00007fff78bd0000 C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\net.dll +0x00007fff9ba10000 - 0x00007fff9bb3c000 C:\Windows\SYSTEM32\WINHTTP.dll +0x00007fffa2920000 - 0x00007fffa298a000 C:\Windows\system32\mswsock.dll +0x00007fff59760000 - 0x00007fff59776000 C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\nio.dll +0x00007fff749e0000 - 0x00007fff749f0000 c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\verify.dll +0x00007fff54840000 - 0x00007fff54885000 C:\Users\29470\AppData\Roaming\Cursor\User\globalStorage\redhat.java\1.53.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.3.0.v20260203-2149\eclipse_11919.dll +0x00007fffa5450000 - 0x00007fffa55f1000 C:\Windows\System32\ole32.dll +0x00007fffa2b70000 - 0x00007fffa2b8b000 C:\Windows\SYSTEM32\CRYPTSP.dll +0x00007fffa2400000 - 0x00007fffa2437000 C:\Windows\system32\rsaenh.dll +0x00007fffa2a10000 - 0x00007fffa2a38000 C:\Windows\SYSTEM32\USERENV.dll +0x00007fffa2b90000 - 0x00007fffa2b9c000 C:\Windows\SYSTEM32\CRYPTBASE.dll +0x00007fffa1f60000 - 0x00007fffa1f8d000 C:\Windows\SYSTEM32\IPHLPAPI.DLL +0x00007fffa5a80000 - 0x00007fffa5a89000 C:\Windows\System32\NSI.dll +0x00007fff439e0000 - 0x00007fff43a29000 C:\Users\29470\AppData\Local\Temp\jna-47925862\jna6089012982961748806.dll +0x00007fffa6150000 - 0x00007fffa6158000 C:\Windows\System32\PSAPI.DLL +0x00007fff9b760000 - 0x00007fff9b779000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL +0x00007fff9b350000 - 0x00007fff9b36f000 C:\Windows\SYSTEM32\dhcpcsvc.DLL +0x00007fff749d0000 - 0x00007fff749de000 C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\sunmscapi.dll +0x00007fffa3590000 - 0x00007fffa36f7000 C:\Windows\System32\CRYPT32.dll +0x00007fffa2d10000 - 0x00007fffa2d3d000 C:\Windows\SYSTEM32\ncrypt.dll +0x00007fffa2cd0000 - 0x00007fffa2d07000 C:\Windows\SYSTEM32\NTASN1.dll +0x00007fffa1fe0000 - 0x00007fffa20d8000 C:\Windows\SYSTEM32\DNSAPI.dll +0x00000000676a0000 - 0x00000000676c6000 C:\Program Files\Bonjour\mdnsNSP.dll +0x00007fff9a070000 - 0x00007fff9a07a000 C:\Windows\System32\rasadhlp.dll +0x00007fff9a230000 - 0x00007fff9a2b3000 C:\Windows\System32\fwpuclnt.dll +0x00007fff73830000 - 0x00007fff73839000 C:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\extnet.dll +0x00007fffa25b0000 - 0x00007fffa25e4000 C:\Windows\SYSTEM32\ntmarta.dll + +JVMTI agents: +c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\lombok\lombok-1.18.39-4050.jar path:c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\instrument.dll, loaded, initialized, instrumentlib options:none + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.5240_none_2710eadf7384a318;c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\jre\21.0.10-win32-x86_64\bin\server;C:\Users\29470\AppData\Roaming\Cursor\User\globalStorage\redhat.java\1.53.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.3.0.v20260203-2149;C:\Users\29470\AppData\Local\Temp\jna-47925862;C:\Program Files\Bonjour + +VM Arguments: +jvm_args: --add-modules=ALL-SYSTEM --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED -Declipse.application=org.eclipse.jdt.ls.core.id1 -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Djava.import.generatesMetadataFilesAtProjectRoot=false -DDetectVMInstallationsJob.disabled=true -Dfile.encoding=utf8 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable -javaagent:c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\29470\AppData\Roaming\Cursor\User\workspaceStorage\edbcc896f3fe3d61a54e553c9ad653cc\redhat.java -Daether.dependencyCollector.impl=bf +java_command: c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\29470\AppData\Roaming\Cursor\User\globalStorage\redhat.java\1.53.0\config_win -data c:\Users\29470\AppData\Roaming\Cursor\User\workspaceStorage\edbcc896f3fe3d61a54e553c9ad653cc\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-1253b08bf80e3a8568169725d2662b44-sock +java_class_path (initial): c:\Users\29470\.cursor\extensions\redhat.java-1.53.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar +Launcher Type: SUN_STANDARD + +[Global flags] + uintx AdaptiveSizePolicyWeight = 90 {product} {command line} + intx CICompilerCount = 12 {product} {ergonomic} + uintx GCTimeRatio = 4 {product} {command line} + bool HeapDumpOnOutOfMemoryError = true {manageable} {command line} + ccstr HeapDumpPath = c:\Users\29470\AppData\Roaming\Cursor\User\workspaceStorage\edbcc896f3fe3d61a54e553c9ad653cc\redhat.java {manageable} {command line} + size_t InitialHeapSize = 104857600 {product} {command line} + size_t MaxHeapSize = 4294967296 {product} {command line} + size_t MaxNewSize = 1431306240 {product} {ergonomic} + size_t MinHeapDeltaBytes = 524288 {product} {ergonomic} + size_t MinHeapSize = 104857600 {product} {command line} + size_t NewSize = 34603008 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} + size_t OldSize = 70254592 {product} {ergonomic} + uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + size_t SoftMaxHeapSize = 4294967296 {manageable} {ergonomic} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + bool UseParallelGC = true {product} {command line} + +Logging: +Log output configuration: + #0: stdout all=off uptime,level,tags foldmultilines=false + #1: stderr all=off uptime,level,tags foldmultilines=false + +Release file: +JAVA_VERSION="21.0.10" +MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.internal.opt jdk.zipfs jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.crypto.mscapi jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.internal.le jdk.internal.vm.ci jdk.internal.vm.compiler jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported jdk.unsupported.desktop jdk.xml.dom" + +Environment Variables: +JAVA_HOME=C:\Program Files\Java\jdk1.8.0_191 +CLASSPATH=.;C:\Program Files\Java\jdk1.8.0_191\lib;C:\Program Files\Java\jdk1.8.0_191\lib\dt.jar;C:\Program Files\Java\jdk1.8.0_191\lib\tools.jar; +PATH=C:\Users\29470\.local\bin;D:\mysql-9.6.0\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Common Files\Oracle\Java\javapath;G:\oracle11\product\11.2.0\dbhome_1\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\Java\jdk1.8.0_191\bin;C:\Windows\System32\HWAudioDriverLibs;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\½âѹÈí¼þ\Bandizip\;F:\;VN\bin;F:\SDK\platform-tools;F:\SDK\tools;C:\Users\29470\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Java\jdk1.8.0_191\bin;C:\Program Files\Java\jdk1.8.0_191\jre\bin;C:\Program Files (x86)\dotnet\;F:\maven-3.6.3-z\maven3\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\MySQL\MySQL Server 8.0\bin\;C:\Program Files\apache-tomcat-8.5.84\bin\;D:\ChromeDownloads\flutter_windows_3.7.0-stable\flutter\bin\cache\dart-sdk\bin;D:\ChromeDownloads\flutter_windows_3.7.0-stable\flutter\bin\cache\dart-sdk\bin\cache\dart-sdk;C:\Program Files\Tailscale\;C:\Program Files\Redis\;C:\maven3.8.5\maven-3.8.5-רҵ°æMaven˽·þ-4.4-2022-5-15£¬ÄÚ²¿×ÊÁÏ£¬½ûÖ¹Íâй\maven3\bin;C:\Windows\sys;em32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;C:\windows\system32\HWAudioDriver\;C:\Program Files\nodejs\node_global\node_modules;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\MySQL\bin;C:\Program Files\MySQL\MySQL Server 5.7\bin;C:\Program Files\apache-tomcat-8.5.84\bin;F:\Git\cmd;C:\Program Files\TortoiseGit\bin;D:\Ò»¸óVUEÏîÄ¿APP\HBuilderX.4.29.2024093009\HBuilderX\plugins\launcher-tools\tools\adbs;C:\Program Files (x86)\Tencent\΢ÐÅweb¿ª·¢Õß¹¤¾ß\dll;C:\Program Files\nodejs\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SQL Server\160\Tools\Binn\;C:\Program Files\Microsoft SQL Server\160\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files\Microsoft SQL Server\160\DTS\Binn\;C:\Program Files\dotnet\;D:\pgsql\bin;D:\Windows Kits\10\Windows Performance Toolkit\;D:\ÄÚÍø´©Í¸\;C:\Program Files\Huawei\DevEco Studio\bin;C:\Program Files\nodejs\node_global;C:\Program Files\nodejs\node_modules;D:\¿ª·¢Èí¼þ\Microsoft VS Code\bin;C:\Users\29470\AppData\Roaming\npm;C:\Users\29470\.dotnet\tools;C:\Users\29470\AppData\Local\Programs\cursor\resources\app\bin +USERNAME=29470 +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 154 Stepping 3, GenuineIntel +TMP=C:\Users\29470\AppData\Local\Temp +TEMP=C:\Users\29470\AppData\Local\Temp + + + + +Periodic native trim disabled + +--------------- S Y S T E M --------------- + +OS: + Windows 11 , 64 bit Build 22621 (10.0.22621.5305) +OS uptime: 0 days 0:29 hours + +CPU: total 16 (initial active 16) (8 cores per cpu, 2 threads per core) family 6 model 154 stepping 3 microcode 0x41e, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt, clwb, serialize, rdtscp, rdpid, fsrm, f16c, pku, cet_ibt, cet_ss +Processor Information for processor 0 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 1 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 2 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 3 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 4 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 5 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 6 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 7 + Max Mhz: 2500, Current Mhz: 2500, Mhz Limit: 2500 +Processor Information for processor 8 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 9 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 10 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 11 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 12 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 13 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 14 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 +Processor Information for processor 15 + Max Mhz: 2500, Current Mhz: 1800, Mhz Limit: 1800 + +Memory: 4k page, system-wide physical 16110M (655M free) +TotalPageFile size 34275M (AvailPageFile size 0M) +current process WorkingSet (physical memory assigned to process): 578M, peak: 1083M +current process commit charge ("private bytes"): 713M, peak: 3225M + +vm_info: OpenJDK 64-Bit Server VM (21.0.10+7-LTS) for windows-amd64 JRE (21.0.10+7-LTS), built on 2026-01-20T00:00:00Z by "admin" with MS VC++ 17.12 (VS2022) + +END. diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-print/pom.xml b/jeecg-boot/jeecg-boot-module/jeecg-module-print/pom.xml index e43e5e3..b7e4c37 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-print/pom.xml +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-print/pom.xml @@ -18,5 +18,10 @@ org.jeecgframework.boot3 jeecg-boot-base-core + + org.apache.pdfbox + pdfbox + 2.0.30 + diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/INativePrintTemplateImageAnalyzeService.java b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/INativePrintTemplateImageAnalyzeService.java new file mode 100644 index 0000000..9876a01 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/INativePrintTemplateImageAnalyzeService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.print.ai; + +import java.util.Map; + +/** æ ¹æ®ä¸Šä¼ çš„版å¼å›¾ç‰‡ç”ŸæˆåŽŸç”Ÿæ‰“å°è®¾è®¡å™¨å¯ç”¨çš„ templateJson + æ¨¡æ‹Ÿæ•°æ® */ +public interface INativePrintTemplateImageAnalyzeService { + + /** + * @param imageBytes 图片二进制 + * @param mime 如 image/png,å¯ä¸ºç©ºåˆ™æŒ‰æ–‡ä»¶å猜测 + * @param originalFilename 原始文件å(用于猜测 mime) + * @return åŒ…å« templateJsonã€mockDataJsonã€aiUsedã€hint 等字段 + */ + Map analyzeBytes(byte[] imageBytes, String mime, String originalFilename) throws Exception; +} diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/NativePrintTemplateAiProperties.java b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/NativePrintTemplateAiProperties.java new file mode 100644 index 0000000..32c8520 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/NativePrintTemplateAiProperties.java @@ -0,0 +1,32 @@ +package org.jeecg.modules.print.ai; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * åŽŸç”Ÿæ‰“å°æ¨¡æ¿ï¼šä¸Šä¼ å›¾ç‰‡èµ°è§†è§‰å¤§æ¨¡åž‹ç”Ÿæˆ JSON çš„é…置(OpenAI 兼容接å£ï¼Œå¦‚ OpenAI / 通义åƒé—® compatible-mode)。 + */ +@Data +@Component +@ConfigurationProperties(prefix = "print.native-template-ai") +public class NativePrintTemplateAiProperties { + + /** 是å¦å¼€å¯è¯¥èƒ½åŠ›ï¼ˆå…³é—­æ—¶æŽ¥å£ç›´æŽ¥è¿”回错误) */ + private boolean enabled = true; + + /** 为空时走本地å ä½å¸ƒå±€ï¼ˆæŒ‰å›¾ç‰‡å°ºå¯¸ä¼°ç®—纸张),ä¸è°ƒç”¨å¤§æ¨¡åž‹ */ + private String apiKey = ""; + + /** 例如 https://api.openai.com/v1 或 https://dashscope.aliyuncs.com/compatible-mode/v1 */ + private String baseUrl = "https://api.openai.com/v1"; + + /** 例如 gpt-4o-miniã€qwen-vl-plus */ + private String model = "gpt-4o-mini"; + + /** å•张图片大å°ä¸Šé™ï¼ˆMB) */ + private int maxImageMb = 8; + + /** HTTP 调用超时(秒) */ + private int httpTimeoutSeconds = 120; +} diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/impl/NativePrintTemplateImageAnalyzeServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/impl/NativePrintTemplateImageAnalyzeServiceImpl.java new file mode 100644 index 0000000..19110ab --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/ai/impl/NativePrintTemplateImageAnalyzeServiceImpl.java @@ -0,0 +1,1136 @@ +package org.jeecg.modules.print.ai.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.Base64; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import javax.imageio.ImageIO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jeecg.modules.print.ai.INativePrintTemplateImageAnalyzeService; +import org.jeecg.modules.print.ai.NativePrintTemplateAiProperties; +import org.springframework.stereotype.Service; + +/** + * 调用 OpenAI 兼容视觉接å£å°†ç‰ˆå¼å›¾è½¬ä¸ºåŽŸç”Ÿæ¨¡æ¿ JSON;未é…ç½® apiKey 时按图片尺寸生æˆå ä½æ¨¡æ¿ã€‚ + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class NativePrintTemplateImageAnalyzeServiceImpl implements INativePrintTemplateImageAnalyzeService { + + private static final HttpClient HTTP = + HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(30)).build(); + + private static final String VISION_PROMPT = + """ + 你是打å°ç‰ˆå¼è¿˜åŽŸä¸“å®¶ã€‚è¯·æ ¹æ®å›¾ç‰‡ä¸­çš„表å•/标签/票æ®å¸ƒå±€ï¼Œè¾“出**仅一段**åˆæ³• JSON(ä¸è¦ Markdown å›´æ ï¼‰ï¼Œç»“构必须满足: + { + "engine":"native", + "version":"1.0.0", + "page":{"width":æ•°å­—,"height":æ•°å­—,"unit":"mm","margin":[上,å³,下,å·¦],"gridSize":2}, + "elements":[...], + "dataBinding":{ + "fieldMap":{}, + "tableSources":["mainTable","detailList"], + "params":[{"key":"傿•°é”®","label":"中文说明"}], + "detailTables":[{"tableKey":"List1","label":"明细","fields":[{"key":"字段键","label":"列标题"}]}] + } + } + 规则: + 1) åæ ‡ x,y,w,h 使用毫米,相对整张纸左上角;zIndex 从 1 递增。 + 2) elements.type åªèƒ½æ˜¯ï¼štitle,subtitle,text,date,pageNo,image,qrcode,barcode,table,detailTable,freeTable,reportHeader,reportFooter。 + 3) **表格三选一(æžå…¶é‡è¦ï¼‰**: + - **detailTable** 或 **table**:多行**åŒæž„**明细数æ®ï¼ˆè¡¨å¤´ + 多行é‡å¤è®°å½•,如订å•行ã€ç‰©æ–™æ¸…å•ã€BOM 行)。必须有 **source**(如 List1)与 **columns**(列宽ã€bindFieldï¼‰ï¼Œæ•°æ®æŒ‰è¡Œé‡å¤ã€‚ + - **freeTable**:**套打表å•/登记表**——左标签å³å€¼ã€å¤šè¡Œå¤šåˆ—**æ ¼å­å†…容å„ä¸ç›¸åŒ**ã€å­˜åœ¨ **rowspan/colspan åˆå¹¶**ã€æˆ–人员信æ¯å¡/申请å•ç­‰éžé‡å¤è¡Œåˆ—表。必须用 **freeTable**ï¼šå« **rowCount,colCount,borderWidth,borderColor,cells[]**ï¼›æ¯ä¸ª cell å« **row,col,rowspan,colspan,text,bindField**(å¯ç©º)ã€align 等。**ä¸è¦ç”¨ detailTable 模拟登记表**。 + 判断:若图中是「姓å/性别/身高ã€ç­‰å­—段å¡ã€åˆå¹¶å•元格里写「二维ç ã€â†’ **freeTable**;若是「åºå·+产å“+è§„æ ¼+æ•°é‡ã€å¤šè¡Œæ¸…å• â†’ **detailTable**。 + 4) ä»Žå›¾ç‰‡ä¸­è¯»åˆ°çš„é™æ€æ–‡å­—用 text/titleï¼›å¯å˜å­—段用 bindField 或表格列 bindFieldï¼›params/detailTables è¦è¦†ç›–所有用到的绑定键。 + 5) page 宽高与图片长宽比一致,å¯å‡å®šå¸¸è§æ ‡ç­¾çº¸æˆ– A4ï¼›å•ä½ mm,数值åˆç†ã€‚ + 6) 版é¢ä¸Šå•独出现「二维ç ã€æ–‡å­—æ ‡ç­¾ã€æˆ–黑白方å—二维ç å›¾æ¡ˆï¼šå¿…须用 type「qrcodeã€è¡¨è¾¾ï¼ˆvalue å¯ç”¨ç¤ºä¾‹ URL,bindField 建议 qrCodeValue),ä¸è¦ç”¨ text 写「二维ç ã€ï¼Œä¹Ÿä¸è¦ç”¨ç©º src çš„ image å ä½æ–¹å—ç ã€‚ + 7) 「日期ã€ã€Œæ‰“å°æ—¥æœŸã€ã€Œåˆ¶å•日期ã€ç­‰æ ‡ç­¾æˆ–具体年月日:用 type「dateã€ï¼Œå¿…须设 format(YYYY-MM-DD / YYYYå¹´MM月DDæ—¥ 等与版å¼ä¸€è‡´ï¼‰ï¼›éœ€è¦æ•°æ®ç»‘定则设 bindField 如 printDate。 + """; + + private final ObjectMapper objectMapper; + private final NativePrintTemplateAiProperties properties; + + @Override + public Map analyzeBytes(byte[] bytes, String mime, String originalFilename) throws Exception { + if (!properties.isEnabled()) { + throw new IllegalStateException("未开å¯åŽŸç”Ÿæ¨¡æ¿å›¾ç‰‡è¯†åˆ«ï¼ˆprint.native-template-ai.enabled=false)"); + } + if (bytes == null || bytes.length == 0) { + throw new IllegalArgumentException("请上传图片文件"); + } + long maxBytes = (long) properties.getMaxImageMb() * 1024 * 1024; + if (bytes.length > maxBytes) { + throw new IllegalArgumentException("图片超过大å°é™åˆ¶ " + properties.getMaxImageMb() + "MB"); + } + String resolvedMime = resolveMime(mime, originalFilename, bytes); + + boolean aiUsed = StringUtils.isNotBlank(properties.getApiKey()); + String templateJson; + String hint; + if (aiUsed) { + try { + String raw = callVisionModel(bytes, resolvedMime); + String extracted = extractJsonObject(raw); + if (StringUtils.isBlank(extracted)) { + throw new IllegalStateException("模型未返回å¯è§£æžçš„ JSON"); + } + templateJson = normalizeSchemaJson(extracted); + hint = "已使用视觉大模型生æˆï¼Œè¯·åœ¨è®¾è®¡å™¨ä¸­æ ¸å¯¹å标与字段。"; + } catch (Exception ex) { + log.warn("视觉模型调用失败,回退å ä½å¸ƒå±€: {}", ex.getMessage()); + templateJson = buildFallbackSchemaJson(bytes, resolvedMime); + hint = "大模型调用失败,已按图片尺寸生æˆå ä½æ¨¡æ¿ï¼Œå¯æ£€æŸ¥é…ç½®åŽé‡è¯•。原因:" + ex.getMessage(); + aiUsed = false; + } + } else { + templateJson = buildFallbackSchemaJson(bytes, resolvedMime); + hint = + "未检测到有效 API Key(é…置项 print.native-template-ai.api-key è§£æžåŽä¸ºç©ºï¼‰ã€‚" + + "è‹¥ yml 中写的是 ${DASHSCOPE_API_KEY:} ç­‰å ä½ï¼Œè¯·åœ¨ç³»ç»Ÿ/IDE 环境å˜é‡ä¸­è®¾ç½® DASHSCOPE_API_KEY 或 PRINT_NATIVE_TEMPLATE_AI_API_KEY," + + "或改为在 yml 中直接填写 api-key: sk-…(本机勿æäº¤ä»“库)。已按图片尺寸生æˆå ä½æ¨¡æ¿ã€‚"; + aiUsed = false; + } + + String mockJson = buildMockDataJson(templateJson); + Map res = new LinkedHashMap<>(8); + res.put("templateJson", templateJson); + res.put("mockDataJson", mockJson); + res.put("aiUsed", aiUsed); + res.put("hint", hint); + return res; + } + + private String resolveMime(String mime, String originalFilename, byte[] bytes) { + if (StringUtils.isNotBlank(mime) && mime.startsWith("image/")) { + return mime.split(";")[0].trim(); + } + String name = StringUtils.lowerCase(StringUtils.defaultString(originalFilename)); + if (name.endsWith(".png")) { + return "image/png"; + } + if (name.endsWith(".jpg") || name.endsWith(".jpeg")) { + return "image/jpeg"; + } + if (name.endsWith(".webp")) { + return "image/webp"; + } + if (name.endsWith(".gif")) { + return "image/gif"; + } + try { + String probed = java.net.URLConnection.guessContentTypeFromStream(new ByteArrayInputStream(bytes)); + if (StringUtils.isNotBlank(probed) && probed.startsWith("image/")) { + return probed; + } + } catch (Exception ignored) { + } + return "image/png"; + } + + private String callVisionModel(byte[] imageBytes, String mime) throws Exception { + String b64 = Base64.getEncoder().encodeToString(imageBytes); + String url = trimSlash(properties.getBaseUrl()) + "/chat/completions"; + ObjectNode body = objectMapper.createObjectNode(); + body.put("model", properties.getModel()); + ArrayNode messages = body.putArray("messages"); + ObjectNode user = messages.addObject(); + user.put("role", "user"); + ArrayNode content = user.putArray("content"); + ObjectNode textPart = content.addObject(); + textPart.put("type", "text"); + textPart.put("text", VISION_PROMPT); + ObjectNode imgPart = content.addObject(); + imgPart.put("type", "image_url"); + ObjectNode imageUrl = objectMapper.createObjectNode(); + imageUrl.put("url", "data:" + mime + ";base64," + b64); + imgPart.set("image_url", imageUrl); + body.put("max_tokens", 8192); + + HttpRequest request = + HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(properties.getHttpTimeoutSeconds())) + .header("Content-Type", "application/json") + .header("Authorization", "Bearer " + properties.getApiKey().trim()) + .POST(HttpRequest.BodyPublishers.ofString(objectMapper.writeValueAsString(body))) + .build(); + HttpResponse resp = HTTP.send(request, HttpResponse.BodyHandlers.ofString()); + if (resp.statusCode() < 200 || resp.statusCode() >= 300) { + throw new IllegalStateException("HTTP " + resp.statusCode() + ": " + abbreviate(resp.body(), 500)); + } + JsonNode root = objectMapper.readTree(resp.body()); + JsonNode choices = root.path("choices"); + if (!choices.isArray() || choices.isEmpty()) { + throw new IllegalStateException("å“应无 choices: " + abbreviate(resp.body(), 400)); + } + return choices.get(0).path("message").path("content").asText(""); + } + + private static String trimSlash(String u) { + if (u == null) { + return ""; + } + String s = u.trim(); + while (s.endsWith("/")) { + s = s.substring(0, s.length() - 1); + } + return s; + } + + private static String abbreviate(String s, int max) { + if (s == null) { + return ""; + } + return s.length() <= max ? s : s.substring(0, max) + "..."; + } + + private String extractJsonObject(String text) { + if (StringUtils.isBlank(text)) { + return null; + } + String t = text.trim(); + int fence = t.indexOf("```json"); + if (fence >= 0) { + int end = t.indexOf("```", fence + 7); + if (end > fence) { + return t.substring(fence + 7, end).trim(); + } + } + int i = t.indexOf('{'); + int j = t.lastIndexOf('}'); + if (i >= 0 && j > i) { + return t.substring(i, j + 1); + } + return null; + } + + private String normalizeSchemaJson(String json) throws Exception { + JsonNode root = objectMapper.readTree(json); + if (!root.isObject()) { + throw new IllegalArgumentException("根节点必须是对象"); + } + ObjectNode obj = (ObjectNode) root; + obj.put("engine", "native"); + obj.put("version", "1.0.0"); + + ObjectNode page = ensureObject(obj, "page"); + putNumberIfMissing(page, "width", 210); + putNumberIfMissing(page, "height", 297); + page.put("unit", "mm"); + if (!page.has("margin") || !page.get("margin").isArray() || page.get("margin").size() < 4) { + ArrayNode m = objectMapper.createArrayNode(); + m.add(10); + m.add(10); + m.add(10); + m.add(10); + page.set("margin", m); + } + putNumberIfMissing(page, "gridSize", 2); + + ArrayNode elements = ensureArray(obj, "elements"); + int z = 1; + for (JsonNode el : elements) { + if (!el.isObject()) { + continue; + } + ObjectNode e = (ObjectNode) el; + if (!e.has("id") || StringUtils.isBlank(e.get("id").asText())) { + e.put("id", randomId("el")); + } + if (!e.has("zIndex")) { + e.put("zIndex", z); + } + z++; + upgradeElementForSemanticType(e); + String type = e.path("type").asText("text"); + if ("table".equals(type) || "detailTable".equals(type)) { + tryConvertMisclassifiedListTableToFreeTable(e); + type = e.path("type").asText("text"); + } + if ("table".equals(type) || "detailTable".equals(type)) { + ensureTableShape(e); + } else if ("freeTable".equals(type)) { + ensureFreeTableShape(e); + } + if (!e.has("x")) { + e.put("x", 10); + } + if (!e.has("y")) { + e.put("y", 10); + } + if (!e.has("w")) { + e.put("w", 80); + } + if (!e.has("h")) { + e.put("h", 12); + } + } + + // AI å¸¸åŒæ—¶è¾“出「二维ç /æ—¥æœŸã€æ–‡æ¡ˆ + 图形,å‡çº§åŽæ˜“é‡å é‡å¤ï¼Œæ­¤å¤„æŒ‰åŒ…å›´ç›’ä¸Žç»‘å®šé”®åŽ»é‡ + dedupeOverlappingSemanticElements(elements); + + ObjectNode db = ensureObject(obj, "dataBinding"); + if (!db.has("fieldMap") || !db.get("fieldMap").isObject()) { + db.set("fieldMap", objectMapper.createObjectNode()); + } + if (!db.has("tableSources") || !db.get("tableSources").isArray()) { + ArrayNode ts = objectMapper.createArrayNode(); + ts.add("mainTable"); + ts.add("detailList"); + db.set("tableSources", ts); + } + if (!db.has("params")) { + db.set("params", objectMapper.createArrayNode()); + } + if (!db.has("detailTables")) { + db.set("detailTables", objectMapper.createArrayNode()); + } + syncDataBindingFromElements(obj); + return objectMapper.writeValueAsString(obj); + } + + private void syncDataBindingFromElements(ObjectNode root) { + ObjectNode db = (ObjectNode) root.get("dataBinding"); + ArrayNode params = db.withArray("params"); + ArrayNode detailTables = db.withArray("detailTables"); + ArrayNode elements = root.withArray("elements"); + + java.util.Set paramKeys = new java.util.LinkedHashSet<>(); + java.util.Map> tableFields = new LinkedHashMap<>(); + + for (JsonNode el : elements) { + if (!el.isObject()) { + continue; + } + ObjectNode e = (ObjectNode) el; + String type = e.path("type").asText(""); + String bind = e.path("bindField").asText("").trim(); + if (StringUtils.isNotBlank(bind) && !"table".equals(type) && !"detailTable".equals(type)) { + paramKeys.add(bind); + } + if ("freeTable".equals(type)) { + JsonNode cells = e.get("cells"); + if (cells != null && cells.isArray()) { + for (JsonNode cell : cells) { + String bf = cell.path("bindField").asText("").trim(); + if (StringUtils.isNotBlank(bf)) { + paramKeys.add(bf); + } + } + } + } + if ("table".equals(type) || "detailTable".equals(type)) { + String source = e.path("source").asText("List1").trim(); + if (StringUtils.isBlank(source)) { + source = "List1"; + } + tableFields.putIfAbsent(source, new java.util.LinkedHashSet<>()); + JsonNode cols = e.get("columns"); + if (cols != null && cols.isArray()) { + for (JsonNode c : cols) { + String bf = c.path("bindField").asText(c.path("field").asText("")).trim(); + if (StringUtils.isNotBlank(bf)) { + tableFields.get(source).add(bf); + } + } + } + } + } + + mergeParams(params, paramKeys); + mergeDetailTables(detailTables, tableFields); + } + + private void mergeParams(ArrayNode params, java.util.Set keys) { + java.util.Set existing = new java.util.HashSet<>(); + for (JsonNode p : params) { + if (p.isObject()) { + existing.add(p.path("key").asText("")); + } + } + for (String k : keys) { + if (StringUtils.isBlank(k) || existing.contains(k)) { + continue; + } + ObjectNode n = objectMapper.createObjectNode(); + n.put("key", k); + n.put("label", k); + params.add(n); + } + } + + private void mergeDetailTables(ArrayNode detailTables, Map> tableFields) { + java.util.Map byKey = new LinkedHashMap<>(); + for (JsonNode t : detailTables) { + if (t.isObject()) { + String tk = t.path("tableKey").asText(""); + if (StringUtils.isNotBlank(tk)) { + byKey.put(tk, (ObjectNode) t); + } + } + } + for (Map.Entry> en : tableFields.entrySet()) { + String tk = en.getKey(); + ObjectNode tab = byKey.get(tk); + if (tab == null) { + tab = objectMapper.createObjectNode(); + tab.put("tableKey", tk); + tab.put("label", tk); + tab.set("fields", objectMapper.createArrayNode()); + detailTables.add(tab); + byKey.put(tk, tab); + } + ArrayNode fields = tab.withArray("fields"); + java.util.Set have = new java.util.HashSet<>(); + for (JsonNode f : fields) { + if (f.isObject()) { + have.add(f.path("key").asText("")); + } + } + for (String fk : en.getValue()) { + if (StringUtils.isBlank(fk) || have.contains(fk)) { + continue; + } + ObjectNode fn = objectMapper.createObjectNode(); + fn.put("key", fk); + fn.put("label", fk); + fields.add(fn); + } + } + } + + private void ensureTableShape(ObjectNode tableEl) { + if (!tableEl.has("source") || StringUtils.isBlank(tableEl.get("source").asText())) { + tableEl.put("source", "List1"); + } + JsonNode cols = tableEl.get("columns"); + if (cols == null || !cols.isArray() || cols.isEmpty()) { + ArrayNode arr = objectMapper.createArrayNode(); + for (int i = 1; i <= 3; i++) { + ObjectNode c = objectMapper.createObjectNode(); + String k = "field" + i; + c.put("key", randomId("col")); + c.put("title", "列" + i); + c.put("field", k); + c.put("bindField", k); + c.put("width", 30); + c.put("align", "left"); + c.put("contentType", "text"); + arr.add(c); + } + tableEl.set("columns", arr); + } + putBoolIfMissing(tableEl, "showHeader", true); + putNumberIfMissing(tableEl, "rowHeight", 8); + putNumberIfMissing(tableEl, "headerHeight", 10); + } + + private static final Set COMMERCE_DETAIL_HEADERS = + new HashSet<>( + Arrays.asList( + "产å“", + "物料", + "æ–™å·", + "物料编ç ", + "è§„æ ¼", + "åž‹å·", + "æ•°é‡", + "å•ä½", + "å•ä»·", + "金é¢", + "税率", + "åºå·", + "项次", + "批次", + "订å•å·", + "图å·")); + + private static final Set PERSON_FORM_LABELS = + new HashSet<>( + Arrays.asList( + "å§“å", + "åç§°", + "性别", + "年龄", + "生日", + "出生日期", + "身高", + "体é‡", + "爱好", + "学历", + "ç±è´¯", + "æ°‘æ—", + "政治é¢è²Œ", + "身份è¯", + "è¯ä»¶å·", + "è”系电è¯", + "手机å·", + "电è¯", + "地å€", + "邮箱", + "部门", + "èŒåŠ¡", + "å·¥å·", + "å…¥èŒæ—¥æœŸ")); + + private static final Set TABLE_ONLY_KEYS = + new HashSet<>( + Arrays.asList( + "source", + "columns", + "mergeColumnKeys", + "strictGrouping", + "enableMultiHeader", + "tableHeightMode", + "fixedRows", + "showHeader", + "rowHeight", + "headerHeight", + "headerFontSize", + "bodyFontSize", + "headerBgColor", + "headerTextColor", + "footerLabelColumnKey", + "footerLabelText", + "footerLabelCenter", + "footerShowTotal", + "footerTotalMode", + "headerConfig")); + + /** + * 若模型把「人员信æ¯å¡/登记表ã€è¯¯å»ºæˆæ¨ªå‘多列的 detailTable,则改为å•行「标签|值ã€å¯¹çš„ freeTable。 + */ + private void tryConvertMisclassifiedListTableToFreeTable(ObjectNode el) { + String typ = el.path("type").asText(""); + if (!"table".equals(typ) && !"detailTable".equals(typ)) { + return; + } + JsonNode colsNode = el.get("columns"); + if (colsNode == null || !colsNode.isArray()) { + return; + } + ArrayNode cols = (ArrayNode) colsNode; + if (cols.size() < 2 || cols.size() > 14) { + return; + } + if (looksLikeCommerceDetailColumns(cols)) { + return; + } + int personalHits = countPersonalFormLabels(cols); + if (personalHits < 3) { + return; + } + ArrayNode colsCopy = cols.deepCopy(); + stripTableOnlyKeys(el); + el.put("type", "freeTable"); + int n = colsCopy.size(); + el.put("rowCount", 1); + el.put("colCount", n * 2); + el.put("borderWidth", 1); + el.put("borderColor", "#d9d9d9"); + ArrayNode cells = objectMapper.createArrayNode(); + for (int i = 0; i < n; i++) { + JsonNode c = colsCopy.get(i); + String title = c.path("title").asText("").trim(); + String bind = c.path("bindField").asText(c.path("field").asText("")).trim(); + String field = c.path("field").asText("").trim(); + if (StringUtils.isBlank(bind) && StringUtils.isNotBlank(field)) { + bind = field; + } + if (StringUtils.isBlank(bind)) { + bind = "formValue" + (i + 1); + } + ObjectNode left = objectMapper.createObjectNode(); + left.put("row", 0); + left.put("col", i * 2); + left.put("rowspan", 1); + left.put("colspan", 1); + left.put("text", StringUtils.isNotBlank(title) ? title : "项" + (i + 1)); + left.put("align", "left"); + left.put("verticalAlign", "middle"); + left.put("fontSize", 12); + left.put("color", "#111111"); + left.put("backgroundColor", "#ffffff"); + cells.add(left); + ObjectNode right = objectMapper.createObjectNode(); + right.put("row", 0); + right.put("col", i * 2 + 1); + right.put("rowspan", 1); + right.put("colspan", 1); + right.put("text", ""); + right.put("bindField", bind); + right.put("align", "left"); + right.put("verticalAlign", "middle"); + right.put("fontSize", 12); + right.put("color", "#111111"); + right.put("backgroundColor", "#ffffff"); + cells.add(right); + } + el.set("cells", cells); + } + + private static boolean looksLikeCommerceDetailColumns(ArrayNode cols) { + for (JsonNode c : cols) { + String t = c.path("title").asText("").trim(); + if (COMMERCE_DETAIL_HEADERS.contains(t)) { + return true; + } + } + return false; + } + + private static int countPersonalFormLabels(ArrayNode cols) { + int n = 0; + for (JsonNode c : cols) { + String t = c.path("title").asText("").trim(); + if (PERSON_FORM_LABELS.contains(t)) { + n++; + } + } + return n; + } + + private static void stripTableOnlyKeys(ObjectNode el) { + for (String k : TABLE_ONLY_KEYS) { + el.remove(k); + } + } + + /** 补全自由表格缺çœå­—段;无 cells 时按行列铺空白格 */ + private void ensureFreeTableShape(ObjectNode e) { + int rc = Math.max(1, e.path("rowCount").asInt(1)); + int cc = Math.max(1, e.path("colCount").asInt(1)); + e.put("rowCount", rc); + e.put("colCount", cc); + if (!e.has("borderWidth")) { + e.put("borderWidth", 1); + } + if (!e.has("borderColor")) { + e.put("borderColor", "#d9d9d9"); + } + JsonNode cells = e.get("cells"); + if (cells == null || !cells.isArray() || cells.size() == 0) { + ArrayNode arr = objectMapper.createArrayNode(); + for (int r = 0; r < rc; r++) { + for (int c = 0; c < cc; c++) { + ObjectNode cell = objectMapper.createObjectNode(); + cell.put("row", r); + cell.put("col", c); + cell.put("rowspan", 1); + cell.put("colspan", 1); + cell.put("text", ""); + cell.put("bindField", ""); + cell.put("align", "left"); + cell.put("verticalAlign", "middle"); + cell.put("fontSize", 12); + cell.put("color", "#111111"); + cell.put("backgroundColor", "#ffffff"); + arr.add(cell); + } + } + e.set("cells", arr); + } + } + + /** + * 将「二维ç ã€æ–‡æ¡ˆ/类二维ç å ä½å›¾ç»Ÿä¸€ä¸º qrcode 组件;将日期类文案统一为 date 组件(与视觉模型输出互补)。 + */ + private void upgradeElementForSemanticType(ObjectNode e) { + String type = e.path("type").asText(""); + if ("qrcode".equals(type)) { + ensureQrcodeShape(e); + return; + } + if ("barcode".equals(type)) { + if (!e.has("value") || StringUtils.isBlank(e.path("value").asText())) { + e.put("value", "1234567890"); + } + return; + } + if ("date".equals(type)) { + ensureDateShape(e); + return; + } + if ("text".equals(type) || "title".equals(type) || "subtitle".equals(type)) { + String text = e.path("text").asText("").trim(); + if (isQrCodeLabelText(text)) { + convertTextElementToQrcode(e); + return; + } + if (isDateSemanticText(text)) { + convertTextElementToDate(e, text); + } + return; + } + if ("image".equals(type) && looksLikeQrImagePlaceholder(e)) { + convertImageElementToQrcode(e); + } + } + + /** 文案为「二维ç ã€æˆ–æžçŸ­å«äºŒç»´ç æç¤º */ + private boolean isQrCodeLabelText(String text) { + if (StringUtils.isBlank(text)) { + return false; + } + String compact = text.replaceAll("\\s+", ""); + if (!compact.contains("二维ç ")) { + return false; + } + if ("二维ç ".equals(compact) || "二维ç :".equals(compact) || "二维ç ï¼š".equals(compact)) { + return true; + } + return compact.length() <= 20; + } + + /** æ—¥æœŸæ ‡ç­¾æˆ–å¸¸è§æ—¥æœŸä¸² */ + private boolean isDateSemanticText(String text) { + if (StringUtils.isBlank(text)) { + return false; + } + String t = text.trim(); + if ("日期".equals(t) || "æ‰“å°æ—¥æœŸ".equals(t) || "åˆ¶å•æ—¥æœŸ".equals(t) || "啿®æ—¥æœŸ".equals(t) || "填表日期".equals(t)) { + return true; + } + if (t.matches("^(打å°|制å•|啿®|填表)?日期\\s*[::]?\\s*$")) { + return true; + } + if (t.matches("^(打å°|制å•|啿®|填表)?日期\\s*[::].+")) { + return true; + } + if (t.matches("^\\d{4}[-/.]\\d{1,2}[-/.]\\d{1,2}.*")) { + return true; + } + return t.matches("^\\d{4}å¹´\\d{1,2}月\\d{1,2}æ—¥.*"); + } + + /** 近正方形ã€å¸¸è§è¾¹é•¿ã€ä¸”æ—  src çš„ image,多视为版å¼ä¸­çš„二维ç å ä½ */ + private boolean looksLikeQrImagePlaceholder(ObjectNode e) { + double w = e.path("w").asDouble(0); + double h = e.path("h").asDouble(0); + if (w < 12 || h < 12) { + return false; + } + double ratio = w / Math.max(h, 0.001); + if (ratio < 0.82 || ratio > 1.18) { + return false; + } + if (w > 90) { + return false; + } + String src = e.path("src").asText("").trim(); + return StringUtils.isBlank(src); + } + + private void convertTextElementToQrcode(ObjectNode e) { + e.put("type", "qrcode"); + e.remove("text"); + e.remove("format"); + if (!e.has("value") || StringUtils.isBlank(e.path("value").asText())) { + e.put("value", "https://www.qhmes.local/qr/sample"); + } + if (!e.has("bindField") || StringUtils.isBlank(e.path("bindField").asText())) { + e.put("bindField", "qrCodeValue"); + } + ensureQrcodeShape(e); + } + + private void convertImageElementToQrcode(ObjectNode e) { + e.put("type", "qrcode"); + e.remove("src"); + e.remove("fit"); + if (!e.has("value") || StringUtils.isBlank(e.path("value").asText())) { + e.put("value", "https://www.qhmes.local/qr/sample"); + } + if (!e.has("bindField") || StringUtils.isBlank(e.path("bindField").asText())) { + e.put("bindField", "qrCodeValue"); + } + ensureQrcodeShape(e); + } + + private void convertTextElementToDate(ObjectNode e, String oldText) { + e.put("type", "date"); + String t = oldText.trim(); + e.put("format", inferDateFormatFromText(t)); + boolean looksLikeValue = + t.matches("^\\d{4}[-/.]\\d{1,2}[-/.]\\d{1,2}.*") + || t.matches("^\\d{4}å¹´\\d{1,2}月\\d{1,2}æ—¥.*") + || t.matches("^(打å°|制å•|啿®|填表)?日期\\s*[::].+"); + if (looksLikeValue) { + String valuePart = t.replaceFirst("^(打å°|制å•|啿®|填表)?日期\\s*[::]?\\s*", ""); + e.put("text", StringUtils.isNotBlank(valuePart) ? valuePart : "YYYY-MM-DD"); + } else { + e.put("text", "日期"); + } + e.put("bindField", "printDate"); + if (e.has("style") && !e.get("style").isObject()) { + e.remove("style"); + } + } + + private static String inferDateFormatFromText(String t) { + if (t.contains("å¹´") && t.contains("月")) { + return "YYYYå¹´MM月DDæ—¥"; + } + if (t.contains("/") && !t.contains("å¹´")) { + return "YYYY/MM/DD"; + } + return "YYYY-MM-DD"; + } + + private void ensureQrcodeShape(ObjectNode e) { + if (!e.has("value") || StringUtils.isBlank(e.path("value").asText())) { + e.put("value", "https://www.qhmes.local/qr/sample"); + } + if (!e.has("bindField") || StringUtils.isBlank(e.path("bindField").asText())) { + e.put("bindField", "qrCodeValue"); + } + double w = e.path("w").asDouble(24); + double h = e.path("h").asDouble(24); + double side = Math.max(16, Math.min(48, Math.min(Math.max(w, 16), Math.max(h, 16)))); + e.put("w", side); + e.put("h", side); + } + + private void ensureDateShape(ObjectNode e) { + if (!e.has("format") || StringUtils.isBlank(e.path("format").asText())) { + e.put("format", "YYYY-MM-DD"); + } + if (!e.has("text") || StringUtils.isBlank(e.path("text").asText())) { + e.put("text", "日期"); + } + if (!e.has("bindField") || StringUtils.isBlank(e.path("bindField").asText())) { + e.put("bindField", "printDate"); + } + } + + /** 去掉é‡å æˆ–几乎åŒä½ç½®çš„é‡å¤äºŒç»´ç ã€é‡å¤æ—¥æœŸï¼ˆä¿ç•™ zIndex è¾ƒå° / åºå·é å‰çš„一个) */ + private void dedupeOverlappingSemanticElements(ArrayNode elements) { + dedupeByElementType(elements, "qrcode"); + dedupeByElementType(elements, "date"); + } + + private void dedupeByElementType(ArrayNode elements, String type) { + int i = 0; + while (i < elements.size()) { + JsonNode ni = elements.get(i); + if (!ni.isObject() || !type.equals(ni.path("type").asText(""))) { + i++; + continue; + } + ObjectNode a = (ObjectNode) ni; + for (int j = elements.size() - 1; j > i; j--) { + JsonNode nj = elements.get(j); + if (!nj.isObject() || !type.equals(nj.path("type").asText(""))) { + continue; + } + ObjectNode b = (ObjectNode) nj; + if (isRedundantDuplicate(a, b, type)) { + elements.remove(j); + } + } + i++; + } + } + + private boolean isRedundantDuplicate(ObjectNode a, ObjectNode b, String type) { + double overlap = rectOverlapRatio(a, b); + if (overlap >= 0.15) { + return true; + } + String ba = a.path("bindField").asText("").trim(); + String bb = b.path("bindField").asText("").trim(); + if (StringUtils.isNotBlank(ba) && ba.equals(bb) && centerDistanceMm(a, b) < 14.0) { + return true; + } + if ("date".equals(type)) { + String ta = a.path("text").asText("").trim(); + String tb = b.path("text").asText("").trim(); + if (StringUtils.isNotBlank(ta) && ta.equals(tb) && centerDistanceMm(a, b) < 8.0) { + return true; + } + } + if ("qrcode".equals(type) && centerDistanceMm(a, b) < 6.0) { + return true; + } + return false; + } + + /** 交集é¢ç§¯ / min(é¢ç§¯a, é¢ç§¯b),无交集为 0 */ + private static double rectOverlapRatio(ObjectNode a, ObjectNode b) { + double ax = a.path("x").asDouble(); + double ay = a.path("y").asDouble(); + double aw = Math.max(a.path("w").asDouble(), 0.01); + double ah = Math.max(a.path("h").asDouble(), 0.01); + double bx = b.path("x").asDouble(); + double by = b.path("y").asDouble(); + double bw = Math.max(b.path("w").asDouble(), 0.01); + double bh = Math.max(b.path("h").asDouble(), 0.01); + double ix1 = Math.max(ax, bx); + double iy1 = Math.max(ay, by); + double ix2 = Math.min(ax + aw, bx + bw); + double iy2 = Math.min(ay + ah, by + bh); + double iw = ix2 - ix1; + double ih = iy2 - iy1; + if (iw <= 0 || ih <= 0) { + return 0; + } + double inter = iw * ih; + double areaA = aw * ah; + double areaB = bw * bh; + return inter / Math.min(areaA, areaB); + } + + private static double centerDistanceMm(ObjectNode a, ObjectNode b) { + double ax = a.path("x").asDouble() + a.path("w").asDouble() / 2.0; + double ay = a.path("y").asDouble() + a.path("h").asDouble() / 2.0; + double bx = b.path("x").asDouble() + b.path("w").asDouble() / 2.0; + double by = b.path("y").asDouble() + b.path("h").asDouble() / 2.0; + double dx = ax - bx; + double dy = ay - by; + return Math.sqrt(dx * dx + dy * dy); + } + + private String buildFallbackSchemaJson(byte[] bytes, String mime) throws Exception { + double wMm = 100; + double hMm = 150; + try { + BufferedImage img = ImageIO.read(new ByteArrayInputStream(bytes)); + if (img != null && img.getWidth() > 0 && img.getHeight() > 0) { + double ratio = (double) img.getHeight() / (double) img.getWidth(); + wMm = clamp(60, 220, Math.round(img.getWidth() * 25.4 / 96.0 * 10) / 10.0); + hMm = clamp(40, 400, Math.round(wMm * ratio * 10) / 10.0); + } + } catch (Exception ex) { + log.debug("读å–图片尺寸失败: {}", ex.getMessage()); + } + + ObjectNode root = objectMapper.createObjectNode(); + root.put("engine", "native"); + root.put("version", "1.0.0"); + ObjectNode page = objectMapper.createObjectNode(); + page.put("width", wMm); + page.put("height", hMm); + page.put("unit", "mm"); + ArrayNode margin = objectMapper.createArrayNode(); + margin.add(8); + margin.add(8); + margin.add(8); + margin.add(8); + page.set("margin", margin); + page.put("gridSize", 2); + root.set("page", page); + + ArrayNode elements = objectMapper.createArrayNode(); + ObjectNode title = objectMapper.createObjectNode(); + title.put("id", randomId("title")); + title.put("type", "title"); + title.put("text", "版å¼è¯†åˆ«å ä½ï¼ˆè¯·é…ç½® AI)"); + title.put("x", 10); + title.put("y", 8); + title.put("w", Math.max(40, wMm - 20)); + title.put("h", 12); + title.put("zIndex", 1); + title.put("region", "body"); + ObjectNode titleStyle = objectMapper.createObjectNode(); + titleStyle.put("fontSize", 16); + titleStyle.put("fontWeight", 700); + titleStyle.put("textAlign", "center"); + title.set("style", titleStyle); + elements.add(title); + + ObjectNode dateHint = objectMapper.createObjectNode(); + dateHint.put("id", randomId("text")); + dateHint.put("type", "text"); + dateHint.put("text", "æ‰“å°æ—¥æœŸ"); + dateHint.put("x", 10); + dateHint.put("y", 22); + dateHint.put("w", 40); + dateHint.put("h", 8); + dateHint.put("zIndex", 2); + dateHint.put("region", "body"); + elements.add(dateHint); + + ObjectNode qrHint = objectMapper.createObjectNode(); + qrHint.put("id", randomId("text")); + qrHint.put("type", "text"); + qrHint.put("text", "二维ç "); + qrHint.put("x", Math.max(10, wMm - 36)); + qrHint.put("y", 22); + qrHint.put("w", 24); + qrHint.put("h", 8); + qrHint.put("zIndex", 3); + qrHint.put("region", "body"); + elements.add(qrHint); + + ObjectNode tbl = objectMapper.createObjectNode(); + tbl.put("id", randomId("detailTable")); + tbl.put("type", "detailTable"); + tbl.put("source", "List1"); + tbl.put("x", 8); + tbl.put("y", 28); + tbl.put("w", Math.max(30, wMm - 16)); + tbl.put("h", Math.max(40, hMm - 40)); + tbl.put("zIndex", 4); + tbl.put("region", "body"); + tbl.put("showHeader", true); + tbl.put("rowHeight", 8); + tbl.put("headerHeight", 10); + tbl.put("tableHeightMode", "autoPage"); + tbl.put("strictGrouping", true); + ArrayNode cols = objectMapper.createArrayNode(); + for (int i = 1; i <= 4; i++) { + String fk = "col" + i; + ObjectNode c = objectMapper.createObjectNode(); + c.put("key", randomId("col")); + c.put("title", "列" + i); + c.put("field", fk); + c.put("bindField", fk); + c.put("width", 24); + c.put("align", "left"); + c.put("contentType", "text"); + cols.add(c); + } + tbl.set("columns", cols); + elements.add(tbl); + root.set("elements", elements); + + ObjectNode db = objectMapper.createObjectNode(); + db.set("fieldMap", objectMapper.createObjectNode()); + ArrayNode ts = objectMapper.createArrayNode(); + ts.add("mainTable"); + ts.add("detailList"); + db.set("tableSources", ts); + db.set("params", objectMapper.createArrayNode()); + ArrayNode dts = objectMapper.createArrayNode(); + ObjectNode dt = objectMapper.createObjectNode(); + dt.put("tableKey", "List1"); + dt.put("label", "明细"); + ArrayNode fields = objectMapper.createArrayNode(); + for (int i = 1; i <= 4; i++) { + String fk = "col" + i; + ObjectNode f = objectMapper.createObjectNode(); + f.put("key", fk); + f.put("label", "列" + i); + fields.add(f); + } + dt.set("fields", fields); + dts.add(dt); + db.set("detailTables", dts); + root.set("dataBinding", db); + + return normalizeSchemaJson(objectMapper.writeValueAsString(root)); + } + + private static double clamp(double min, double max, double v) { + return Math.max(min, Math.min(max, v)); + } + + private String buildMockDataJson(String templateJson) throws Exception { + JsonNode root = objectMapper.readTree(templateJson); + ObjectNode mock = objectMapper.createObjectNode(); + JsonNode elements = root.path("elements"); + if (elements.isArray()) { + for (JsonNode el : elements) { + String type = el.path("type").asText(""); + if ("table".equals(type) || "detailTable".equals(type)) { + String source = el.path("source").asText("List1"); + ArrayNode rows = objectMapper.createArrayNode(); + for (int r = 0; r < 5; r++) { + ObjectNode row = objectMapper.createObjectNode(); + JsonNode cols = el.path("columns"); + if (cols.isArray()) { + for (JsonNode c : cols) { + String bf = c.path("bindField").asText(c.path("field").asText("")); + if (StringUtils.isNotBlank(bf)) { + row.put(bf, "示例_" + bf + "_" + (r + 1)); + } + } + } + rows.add(row); + } + mock.set(source, rows); + } else if ("freeTable".equals(type)) { + JsonNode cells = el.path("cells"); + if (cells != null && cells.isArray()) { + for (JsonNode cell : cells) { + String bf = cell.path("bindField").asText("").trim(); + if (StringUtils.isNotBlank(bf) && !mock.has(bf)) { + mock.put(bf, "示例_" + bf); + } + } + } + } else { + String bind = el.path("bindField").asText("").trim(); + if (StringUtils.isBlank(bind) || mock.has(bind)) { + continue; + } + if ("date".equals(type)) { + mock.put(bind, "2026-04-14"); + } else if ("qrcode".equals(type)) { + mock.put(bind, "https://www.qhmes.local/qr/mock"); + } else { + mock.put(bind, "示例_" + bind); + } + } + } + } + if (mock.size() == 0) { + mock.put("docNo", "DOC-001"); + } + return objectMapper.writeValueAsString(mock); + } + + private ObjectNode ensureObject(ObjectNode parent, String key) { + JsonNode n = parent.get(key); + if (n != null && n.isObject()) { + return (ObjectNode) n; + } + ObjectNode o = objectMapper.createObjectNode(); + parent.set(key, o); + return o; + } + + private ArrayNode ensureArray(ObjectNode parent, String key) { + JsonNode n = parent.get(key); + if (n != null && n.isArray()) { + return (ArrayNode) n; + } + ArrayNode a = objectMapper.createArrayNode(); + parent.set(key, a); + return a; + } + + private static void putNumberIfMissing(ObjectNode o, String key, double def) { + if (!o.has(key) || !o.get(key).isNumber()) { + o.put(key, def); + } + } + + private static void putBoolIfMissing(ObjectNode o, String key, boolean def) { + if (!o.has(key)) { + o.put(key, def); + } + } + + private static String randomId(String prefix) { + return prefix + "_" + UUID.randomUUID().toString().replace("-", "").substring(0, 10); + } +} diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java index c878873..1f72634 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-print/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java @@ -6,15 +6,46 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; +import javax.print.Doc; +import javax.print.DocFlavor; +import javax.print.DocPrintJob; +import javax.print.PrintException; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.SimpleDoc; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.standard.JobName; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterAbortException; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.io.ByteArrayInputStream; import lombok.extern.slf4j.Slf4j; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.print.ai.INativePrintTemplateImageAnalyzeService; import org.jeecg.modules.print.entity.PrintTemplate; import org.jeecg.modules.print.service.IPrintTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.util.Map; @@ -27,6 +58,11 @@ import java.util.Map; @RestController @RequestMapping("/print/template") public class PrintTemplateController extends JeecgController { + @Value("${print.network-printers:}") + private String networkPrinters; + + @Autowired + private INativePrintTemplateImageAnalyzeService nativePrintTemplateImageAnalyzeService; /** * 分页列表 @@ -161,4 +197,292 @@ public class PrintTemplateController extends JeecgController> analyzeImageForNative(@RequestBody Map body) { + try { + String imageBase64 = body == null ? null : body.get("imageBase64"); + if (StringUtils.isBlank(imageBase64)) { + return Result.error("imageBase64 ä¸èƒ½ä¸ºç©º"); + } + String filename = body.get("filename"); + String mime = body.get("mime"); + byte[] bytes = decodeImageBase64(imageBase64); + return Result.OK(nativePrintTemplateImageAnalyzeService.analyzeBytes(bytes, mime, filename)); + } catch (Exception e) { + log.error("图片分æžå¤±è´¥", e); + return Result.error("图片分æžå¤±è´¥ï¼š" + e.getMessage()); + } + } + + private static byte[] decodeImageBase64(String imageBase64) { + String s = StringUtils.trimToEmpty(imageBase64); + int comma = s.indexOf(','); + if (s.startsWith("data:") && comma > 0) { + s = s.substring(comma + 1); + } + return Base64.getDecoder().decode(s.replaceAll("\\s", "")); + } + + @Operation(summary = "æ‰“å°æ¨¡æ¿-查询å¯ç”¨æ‰“å°æœº") + @GetMapping(value = "/queryPrinters") + @RequiresPermissions("print:template:list") + public Result> queryPrinters() { + Map res = new HashMap<>(8); + List serverPrinters = new ArrayList<>(); + String serverDefaultPrinter = ""; + try { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService service : services) { + if (service != null && StringUtils.isNotBlank(service.getName())) { + serverPrinters.add(service.getName().trim()); + } + } + } + PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); + if (defaultService != null && StringUtils.isNotBlank(defaultService.getName())) { + serverDefaultPrinter = defaultService.getName().trim(); + } + } catch (Exception e) { + log.warn("查询æœåŠ¡å™¨æ‰“å°æœºå¤±è´¥: {}", e.getMessage()); + } + List networkPrinterList = + StringUtils.isBlank(networkPrinters) + ? new ArrayList<>() + : java.util.Arrays.stream(networkPrinters.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + + Map capability = new LinkedHashMap<>(4); + capability.put("localSupported", false); + capability.put("localReason", "æµè§ˆå™¨çŽ¯å¢ƒæ— æ³•ç›´æŽ¥æžšä¸¾å®¢æˆ·ç«¯æœ¬åœ°æ‰“å°æœºï¼Œéœ€è¦æœ¬åœ°ç»„件或客户端程åºé…åˆã€‚"); + capability.put("serverSupported", true); + capability.put("networkSupported", true); + + res.put("capability", capability); + res.put("serverPrinters", serverPrinters); + res.put("serverDefaultPrinter", serverDefaultPrinter); + res.put("networkPrinters", networkPrinterList); + return Result.OK(res); + } + + @AutoLog(value = "æ‰“å°æ¨¡æ¿-æœåŠ¡ç«¯ç›´æ‰“") + @Operation(summary = "æ‰“å°æ¨¡æ¿-æœåŠ¡ç«¯ç›´æ‰“") + @PostMapping(value = "/directPrint") + @RequiresPermissions("print:template:list") + public Result directPrint(@RequestBody Map body) { + String templateCode = String.valueOf(body.getOrDefault("templateCode", "")).trim(); + String printerName = String.valueOf(body.getOrDefault("printerName", "")).trim(); + Object dataJsonObj = body.get("dataJson"); + String dataJsonText = dataJsonObj == null ? "" : String.valueOf(dataJsonObj); + if (StringUtils.isBlank(templateCode)) { + return Result.error("templateCode ä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isBlank(dataJsonText)) { + return Result.error("dataJson ä¸èƒ½ä¸ºç©º"); + } + PrintTemplate tpl = service.getByCode(templateCode); + if (tpl == null) { + return Result.error("模æ¿ä¸å­˜åœ¨: " + templateCode); + } + try { + PrintService target = null; + if (StringUtils.isNotBlank(printerName) && !"__system_default__".equals(printerName)) { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService serviceItem : services) { + if (serviceItem != null && printerName.equalsIgnoreCase(String.valueOf(serviceItem.getName()).trim())) { + target = serviceItem; + break; + } + } + } + if (target == null) { + return Result.error("æœªæ‰¾åˆ°æŒ‡å®šæ‰“å°æœº: " + printerName); + } + } + if (target == null) { + target = PrintServiceLookup.lookupDefaultPrintService(); + } + if (target == null) { + return Result.error("未找到å¯ç”¨æ‰“å°æœºï¼Œè¯·æ£€æŸ¥æœåŠ¡å™¨æ‰“å°æœºé…ç½®"); + } + // è¯´æ˜Žï¼šå½“å‰æŽ¥å£å®žçŽ°çš„æ˜¯æœåŠ¡ç«¯ç›´æ‰“ï¼ˆçº¯æ–‡æœ¬ï¼‰ã€‚è‹¥éœ€æŒ‰ hiprint æ¨¡æ¿æ¸²æŸ“版å¼ï¼Œå»ºè®®æŽ¥å…¥ç‹¬ç«‹æ¸²æŸ“æœåŠ¡ã€‚ + String content = + "QH-MES 快速打å°\n模æ¿ç¼–å·: " + + templateCode + + "\n模æ¿åç§°: " + + String.valueOf(tpl.getTemplateName()) + + "\n\næ•°æ®JSON:\n" + + dataJsonText + + "\n"; + final String[] lines = content.replace("\r\n", "\n").split("\n", -1); + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintService(target); + job.setJobName("QH-MES-" + templateCode); + job.setPrintable( + new Printable() { + @Override + public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { + Graphics2D g2 = (Graphics2D) graphics; + g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + g2.setFont(new Font("Microsoft YaHei", Font.PLAIN, 10)); + int lineHeight = g2.getFontMetrics().getHeight() + 2; + int maxLinesPerPage = Math.max(1, (int) (pageFormat.getImageableHeight() / lineHeight)); + int start = pageIndex * maxLinesPerPage; + if (start >= lines.length) { + return Printable.NO_SUCH_PAGE; + } + int end = Math.min(lines.length, start + maxLinesPerPage); + int y = g2.getFontMetrics().getAscent(); + for (int i = start; i < end; i += 1) { + g2.drawString(lines[i], 0, y); + y += lineHeight; + } + return Printable.PAGE_EXISTS; + } + }); + job.print(); + return Result.OK("å·²æäº¤åˆ°æœåŠ¡å™¨æ‰“å°æœº: " + target.getName()); + } catch (Exception e) { + log.error("æœåŠ¡ç«¯ç›´æ‰“å¤±è´¥", e); + return Result.error("æœåŠ¡ç«¯ç›´æ‰“å¤±è´¥: " + e.getMessage()); + } + } + + @AutoLog(value = "æ‰“å°æ¨¡æ¿-PDFåŽç«¯æ‰“å°") + @Operation(summary = "æ‰“å°æ¨¡æ¿-PDFåŽç«¯æ‰“å°") + @PostMapping(value = "/directPrintPdf") + @RequiresPermissions("print:template:list") + public Result directPrintPdf(@RequestBody Map body) { + String templateCode = String.valueOf(body.getOrDefault("templateCode", "")).trim(); + String printerName = String.valueOf(body.getOrDefault("printerName", "")).trim(); + String pdfBase64 = String.valueOf(body.getOrDefault("pdfBase64", "")).trim(); + String fileName = String.valueOf(body.getOrDefault("fileName", "")).trim(); + if (StringUtils.isBlank(templateCode)) { + return Result.error("templateCode ä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isBlank(pdfBase64)) { + return Result.error("pdfBase64 ä¸èƒ½ä¸ºç©º"); + } + String lastResolvedPrinterLabel = null; + try { + PrintService target = resolvePrintService(printerName); + if (target == null) { + return Result.error("未找到å¯ç”¨æ‰“å°æœºï¼Œè¯·æ£€æŸ¥æœåŠ¡å™¨æ‰“å°æœºé…ç½®"); + } + final String resolvedPrinterLabel = target.getName(); + lastResolvedPrinterLabel = resolvedPrinterLabel; + String base64Body = pdfBase64; + int commaIdx = pdfBase64.indexOf(","); + if (pdfBase64.startsWith("data:") && commaIdx > 0) { + base64Body = pdfBase64.substring(commaIdx + 1); + } + byte[] pdfBytes = Base64.getDecoder().decode(base64Body); + String printJobName = StringUtils.isNotBlank(fileName) ? fileName : ("QH-MES-" + templateCode + ".pdf"); + if (tryPrintPdfBytesWithDocFlavor(target, pdfBytes, printJobName)) { + return Result.OK("å·²æäº¤PDF到æœåŠ¡å™¨æ‰“å°æœº: " + resolvedPrinterLabel); + } + try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) { + PDFRenderer renderer = new PDFRenderer(document); + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintService(target); + job.setJobName(printJobName); + job.setPrintable((graphics, pageFormat, pageIndex) -> { + if (pageIndex >= document.getNumberOfPages()) { + return Printable.NO_SUCH_PAGE; + } + BufferedImage image; + try { + image = renderer.renderImageWithDPI(pageIndex, 150); + } catch (Exception ex) { + throw new PrinterException("PDF页颿¸²æŸ“失败: " + ex.getMessage()); + } + Graphics2D g2 = (Graphics2D) graphics; + double imageableX = pageFormat.getImageableX(); + double imageableY = pageFormat.getImageableY(); + double imageableWidth = pageFormat.getImageableWidth(); + double imageableHeight = pageFormat.getImageableHeight(); + double scale = Math.min(imageableWidth / image.getWidth(), imageableHeight / image.getHeight()); + int drawWidth = (int) Math.round(image.getWidth() * scale); + int drawHeight = (int) Math.round(image.getHeight() * scale); + int drawX = (int) Math.round(imageableX + (imageableWidth - drawWidth) / 2); + int drawY = (int) Math.round(imageableY + (imageableHeight - drawHeight) / 2); + g2.drawImage(image, drawX, drawY, drawWidth, drawHeight, null); + return Printable.PAGE_EXISTS; + }); + HashPrintRequestAttributeSet patts = new HashPrintRequestAttributeSet(); + patts.add(new JobName(printJobName, Locale.getDefault())); + job.print(patts); + } + return Result.OK("å·²æäº¤PDF到æœåŠ¡å™¨æ‰“å°æœº: " + resolvedPrinterLabel); + } catch (PrinterAbortException e) { + log.error("PDFåŽç«¯æ‰“å°å¤±è´¥(PrinterAbortException)", e); + return Result.error(buildPdfPrinterAbortHint(printerName, lastResolvedPrinterLabel)); + } catch (Exception e) { + log.error("PDFåŽç«¯æ‰“å°å¤±è´¥", e); + return Result.error("PDFåŽç«¯æ‰“å°å¤±è´¥: " + e.getMessage()); + } + } + + private boolean tryPrintPdfBytesWithDocFlavor(PrintService printService, byte[] pdfBytes, String jobName) { + DocFlavor flavor = new DocFlavor.INPUT_STREAM("application/pdf"); + if (!printService.isDocFlavorSupported(flavor)) { + return false; + } + try { + DocPrintJob docJob = printService.createPrintJob(); + ByteArrayInputStream in = new ByteArrayInputStream(pdfBytes); + Doc doc = new SimpleDoc(in, flavor, null); + HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); + if (StringUtils.isNotBlank(jobName)) { + attrs.add(new JobName(jobName, Locale.getDefault())); + } + docJob.print(doc, attrs); + return true; + } catch (PrintException e) { + log.warn("PDF DocFlavor ç›´é€å¤±è´¥ï¼Œå°†å›žé€€ä¸ºä½å›¾æ¸²æŸ“: {} - {}", printService.getName(), e.getMessage()); + return false; + } + } + + private static String buildPdfPrinterAbortHint(String requestedPrinterName, String resolvedPrintQueueName) { + StringBuilder sb = new StringBuilder(); + sb.append("打å°ä»»åŠ¡è¢«ç³»ç»Ÿå–æ¶ˆï¼ˆPrinterAbortException)。常è§åŽŸå› ï¼š"); + sb.append("1) 默认或所选为「Microsoft Print to PDFã€ç­‰è™šæ‹Ÿæ‰“å°æœºï¼Œåœ¨ Tomcat ç­‰æœåŠ¡è¿›ç¨‹æ— äº¤äº’æ¡Œé¢æ—¶æ— æ³•弹出ä¿å­˜å¯¹è¯æ¡†ï¼Œä½œä¸šä¼šè¢«ä¸­æ­¢â€”â€”è¯·å®‰è£…å®žä½“æ‰“å°æœºå¹¶åœ¨å‰ç«¯æŒ‡å®š printerNameï¼›"); + sb.append("2) æ‰“å°æœºç¦»çº¿ã€é˜Ÿåˆ—æš‚åœã€ç¼ºçº¸æˆ–驱动报错;"); + sb.append("3) è¿è¡ŒæœåŠ¡çš„ Windows 账户无æƒè®¿é—®æ‰“å°é˜Ÿåˆ—。"); + if (StringUtils.isNotBlank(resolvedPrintQueueName)) { + sb.append(" 当å‰å®žé™…使用的打å°é˜Ÿåˆ—: ").append(resolvedPrintQueueName.trim()).append("。"); + } + if (StringUtils.isNotBlank(requestedPrinterName) && !"__system_default__".equalsIgnoreCase(requestedPrinterName.trim())) { + sb.append(" è¯·æ±‚å‚æ•° printerName: ").append(requestedPrinterName.trim()).append("。"); + } + return sb.toString(); + } + + private PrintService resolvePrintService(String printerName) { + PrintService target = null; + if (StringUtils.isNotBlank(printerName) && !"__system_default__".equals(printerName)) { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService serviceItem : services) { + if (serviceItem != null && printerName.equalsIgnoreCase(String.valueOf(serviceItem.getName()).trim())) { + target = serviceItem; + break; + } + } + } + } + if (target == null) { + target = PrintServiceLookup.lookupDefaultPrintService(); + } + return target; + } } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml index 2f584f2..75f7739 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/pom.xml @@ -61,6 +61,17 @@ jeecg-boot-module-airag ${jeecgboot.version} + + org.apache.pdfbox + pdfbox + 2.0.30 + + + + org.jeecgframework.boot3 + jeecg-module-print + ${jeecgboot.version} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java index c4e66b6..3029843 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/print/controller/PrintTemplateController.java @@ -6,8 +6,36 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.stream.Collectors; +import javax.print.Doc; +import javax.print.DocFlavor; +import javax.print.DocPrintJob; +import javax.print.PrintException; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.SimpleDoc; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.standard.JobName; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.awt.print.PageFormat; +import java.awt.print.Printable; +import java.awt.print.PrinterAbortException; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.io.ByteArrayInputStream; import lombok.extern.slf4j.Slf4j; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; @@ -16,7 +44,10 @@ import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.modules.print.entity.PrintTemplate; import org.jeecg.modules.print.service.IPrintTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; +import org.jeecg.modules.print.ai.INativePrintTemplateImageAnalyzeService; /** * æ‰“å°æ¨¡æ¿ç»´æŠ¤ï¼ˆHiprint) @@ -26,6 +57,11 @@ import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/print/template") public class PrintTemplateController extends JeecgController { + @Value("${print.network-printers:}") + private String networkPrinters; + + @Autowired + private INativePrintTemplateImageAnalyzeService nativePrintTemplateImageAnalyzeService; @Operation(summary = "æ‰“å°æ¨¡æ¿-分页列表") @GetMapping(value = "/list") @@ -128,6 +164,35 @@ public class PrintTemplateController extends JeecgController> analyzeImageForNative(@RequestBody Map body) { + try { + String imageBase64 = body == null ? null : body.get("imageBase64"); + if (StringUtils.isBlank(imageBase64)) { + return Result.error("imageBase64 ä¸èƒ½ä¸ºç©º"); + } + String filename = body.get("filename"); + String mime = body.get("mime"); + byte[] bytes = decodeImageBase64(imageBase64); + return Result.OK(nativePrintTemplateImageAnalyzeService.analyzeBytes(bytes, mime, filename)); + } catch (Exception e) { + log.error("图片分æžå¤±è´¥", e); + return Result.error("图片分æžå¤±è´¥ï¼š" + e.getMessage()); + } + } + + private static byte[] decodeImageBase64(String imageBase64) { + String s = StringUtils.trimToEmpty(imageBase64); + int comma = s.indexOf(','); + if (s.startsWith("data:") && comma > 0) { + s = s.substring(comma + 1); + } + return Base64.getDecoder().decode(s.replaceAll("\\s", "")); + } + @Operation(summary = "æ‰“å°æ¨¡æ¿-é€šè¿‡ç¼–ç æŸ¥è¯¢") @GetMapping(value = "/queryByCode") @RequiresPermissions("print:template:list") @@ -138,4 +203,270 @@ public class PrintTemplateController extends JeecgController> queryPrinters() { + Map res = new HashMap<>(8); + List serverPrinters = new ArrayList<>(); + String serverDefaultPrinter = ""; + try { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService service : services) { + if (service != null && StringUtils.isNotBlank(service.getName())) { + serverPrinters.add(service.getName().trim()); + } + } + } + PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); + if (defaultService != null && StringUtils.isNotBlank(defaultService.getName())) { + serverDefaultPrinter = defaultService.getName().trim(); + } + } catch (Exception e) { + log.warn("查询æœåŠ¡å™¨æ‰“å°æœºå¤±è´¥: {}", e.getMessage()); + } + List networkPrinterList = + StringUtils.isBlank(networkPrinters) + ? new ArrayList<>() + : java.util.Arrays.stream(networkPrinters.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + + Map capability = new LinkedHashMap<>(4); + capability.put("localSupported", false); + capability.put("localReason", "æµè§ˆå™¨çŽ¯å¢ƒæ— æ³•ç›´æŽ¥æžšä¸¾å®¢æˆ·ç«¯æœ¬åœ°æ‰“å°æœºï¼Œéœ€è¦æœ¬åœ°ç»„件或客户端程åºé…åˆã€‚"); + capability.put("serverSupported", true); + capability.put("networkSupported", true); + + res.put("capability", capability); + res.put("serverPrinters", serverPrinters); + res.put("serverDefaultPrinter", serverDefaultPrinter); + res.put("networkPrinters", networkPrinterList); + return Result.OK(res); + } + + @AutoLog(value = "æ‰“å°æ¨¡æ¿-æœåŠ¡ç«¯ç›´æ‰“") + @Operation(summary = "æ‰“å°æ¨¡æ¿-æœåŠ¡ç«¯ç›´æ‰“") + @PostMapping(value = "/directPrint") + @RequiresPermissions("print:template:list") + public Result directPrint(@RequestBody Map body) { + String templateCode = String.valueOf(body.getOrDefault("templateCode", "")).trim(); + String printerName = String.valueOf(body.getOrDefault("printerName", "")).trim(); + Object dataJsonObj = body.get("dataJson"); + String dataJsonText = dataJsonObj == null ? "" : String.valueOf(dataJsonObj); + if (StringUtils.isBlank(templateCode)) { + return Result.error("templateCode ä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isBlank(dataJsonText)) { + return Result.error("dataJson ä¸èƒ½ä¸ºç©º"); + } + PrintTemplate tpl = service.getByCode(templateCode); + if (tpl == null) { + return Result.error("模æ¿ä¸å­˜åœ¨: " + templateCode); + } + try { + PrintService target = null; + if (StringUtils.isNotBlank(printerName) && !"__system_default__".equals(printerName)) { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService serviceItem : services) { + if (serviceItem != null && printerName.equalsIgnoreCase(String.valueOf(serviceItem.getName()).trim())) { + target = serviceItem; + break; + } + } + } + if (target == null) { + return Result.error("æœªæ‰¾åˆ°æŒ‡å®šæ‰“å°æœº: " + printerName); + } + } + if (target == null) { + target = PrintServiceLookup.lookupDefaultPrintService(); + } + if (target == null) { + return Result.error("未找到å¯ç”¨æ‰“å°æœºï¼Œè¯·æ£€æŸ¥æœåŠ¡å™¨æ‰“å°æœºé…ç½®"); + } + // è¯´æ˜Žï¼šå½“å‰æŽ¥å£å®žçŽ°çš„æ˜¯æœåŠ¡ç«¯ç›´æ‰“ï¼ˆçº¯æ–‡æœ¬ï¼‰ã€‚è‹¥éœ€æŒ‰ hiprint æ¨¡æ¿æ¸²æŸ“版å¼ï¼Œå»ºè®®æŽ¥å…¥ç‹¬ç«‹æ¸²æŸ“æœåŠ¡ã€‚ + String content = + "QH-MES 快速打å°\n模æ¿ç¼–å·: " + + templateCode + + "\n模æ¿åç§°: " + + String.valueOf(tpl.getTemplateName()) + + "\n\næ•°æ®JSON:\n" + + dataJsonText + + "\n"; + final String[] lines = content.replace("\r\n", "\n").split("\n", -1); + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintService(target); + job.setJobName("QH-MES-" + templateCode); + job.setPrintable( + new Printable() { + @Override + public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { + Graphics2D g2 = (Graphics2D) graphics; + g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + g2.setFont(new Font("Microsoft YaHei", Font.PLAIN, 10)); + int lineHeight = g2.getFontMetrics().getHeight() + 2; + int maxLinesPerPage = Math.max(1, (int) (pageFormat.getImageableHeight() / lineHeight)); + int start = pageIndex * maxLinesPerPage; + if (start >= lines.length) { + return Printable.NO_SUCH_PAGE; + } + int end = Math.min(lines.length, start + maxLinesPerPage); + int y = g2.getFontMetrics().getAscent(); + for (int i = start; i < end; i += 1) { + g2.drawString(lines[i], 0, y); + y += lineHeight; + } + return Printable.PAGE_EXISTS; + } + }); + job.print(); + return Result.OK("å·²æäº¤åˆ°æœåŠ¡å™¨æ‰“å°æœº: " + target.getName()); + } catch (Exception e) { + log.error("æœåŠ¡ç«¯ç›´æ‰“å¤±è´¥", e); + return Result.error("æœåŠ¡ç«¯ç›´æ‰“å¤±è´¥: " + e.getMessage()); + } + } + + @AutoLog(value = "æ‰“å°æ¨¡æ¿-PDFåŽç«¯æ‰“å°") + @Operation(summary = "æ‰“å°æ¨¡æ¿-PDFåŽç«¯æ‰“å°") + @PostMapping(value = "/directPrintPdf") + @RequiresPermissions("print:template:list") + public Result directPrintPdf(@RequestBody Map body) { + String templateCode = String.valueOf(body.getOrDefault("templateCode", "")).trim(); + String printerName = String.valueOf(body.getOrDefault("printerName", "")).trim(); + String pdfBase64 = String.valueOf(body.getOrDefault("pdfBase64", "")).trim(); + String fileName = String.valueOf(body.getOrDefault("fileName", "")).trim(); + if (StringUtils.isBlank(templateCode)) { + return Result.error("templateCode ä¸èƒ½ä¸ºç©º"); + } + if (StringUtils.isBlank(pdfBase64)) { + return Result.error("pdfBase64 ä¸èƒ½ä¸ºç©º"); + } + String lastResolvedPrinterLabel = null; + try { + PrintService target = resolvePrintService(printerName); + if (target == null) { + return Result.error("未找到å¯ç”¨æ‰“å°æœºï¼Œè¯·æ£€æŸ¥æœåŠ¡å™¨æ‰“å°æœºé…ç½®"); + } + final String resolvedPrinterLabel = target.getName(); + lastResolvedPrinterLabel = resolvedPrinterLabel; + String base64Body = pdfBase64; + int commaIdx = pdfBase64.indexOf(","); + if (pdfBase64.startsWith("data:") && commaIdx > 0) { + base64Body = pdfBase64.substring(commaIdx + 1); + } + byte[] pdfBytes = Base64.getDecoder().decode(base64Body); + String printJobName = StringUtils.isNotBlank(fileName) ? fileName : ("QH-MES-" + templateCode + ".pdf"); + // ä¼˜å…ˆç›´é€ PDF 字节,é¿å…èµ° RasterPrinterJobï¼ˆè™šæ‹Ÿæ‰“å°æœº/无界é¢ä¼šè¯ä¸‹æ˜“è§¦å‘ PrinterAbortException) + if (tryPrintPdfBytesWithDocFlavor(target, pdfBytes, printJobName)) { + return Result.OK("å·²æäº¤PDF到æœåŠ¡å™¨æ‰“å°æœº: " + resolvedPrinterLabel); + } + try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) { + PDFRenderer renderer = new PDFRenderer(document); + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintService(target); + job.setJobName(printJobName); + job.setPrintable( + (graphics, pageFormat, pageIndex) -> { + if (pageIndex >= document.getNumberOfPages()) { + return Printable.NO_SUCH_PAGE; + } + BufferedImage image; + try { + image = renderer.renderImageWithDPI(pageIndex, 150); + } catch (Exception ex) { + throw new PrinterException("PDF页颿¸²æŸ“失败: " + ex.getMessage()); + } + Graphics2D g2 = (Graphics2D) graphics; + double imageableX = pageFormat.getImageableX(); + double imageableY = pageFormat.getImageableY(); + double imageableWidth = pageFormat.getImageableWidth(); + double imageableHeight = pageFormat.getImageableHeight(); + double scale = + Math.min(imageableWidth / image.getWidth(), imageableHeight / image.getHeight()); + int drawWidth = (int) Math.round(image.getWidth() * scale); + int drawHeight = (int) Math.round(image.getHeight() * scale); + int drawX = (int) Math.round(imageableX + (imageableWidth - drawWidth) / 2); + int drawY = (int) Math.round(imageableY + (imageableHeight - drawHeight) / 2); + g2.drawImage(image, drawX, drawY, drawWidth, drawHeight, null); + return Printable.PAGE_EXISTS; + }); + HashPrintRequestAttributeSet patts = new HashPrintRequestAttributeSet(); + patts.add(new JobName(printJobName, Locale.getDefault())); + job.print(patts); + } + return Result.OK("å·²æäº¤PDF到æœåŠ¡å™¨æ‰“å°æœº: " + resolvedPrinterLabel); + } catch (PrinterAbortException e) { + log.error("PDFåŽç«¯æ‰“å°å¤±è´¥(PrinterAbortException)", e); + return Result.error(buildPdfPrinterAbortHint(printerName, lastResolvedPrinterLabel)); + } catch (Exception e) { + log.error("PDFåŽç«¯æ‰“å°å¤±è´¥", e); + return Result.error("PDFåŽç«¯æ‰“å°å¤±è´¥: " + e.getMessage()); + } + } + + /** + * è‹¥æ‰“å°æœºå£°æ˜Žæ”¯æŒ application/pdf,则通过 DocPrintJob æäº¤ï¼Œé€šå¸¸æ¯” AWT 栅格化更稳定。 + */ + private boolean tryPrintPdfBytesWithDocFlavor(PrintService printService, byte[] pdfBytes, String jobName) { + DocFlavor flavor = new DocFlavor.INPUT_STREAM("application/pdf"); + if (!printService.isDocFlavorSupported(flavor)) { + return false; + } + try { + DocPrintJob docJob = printService.createPrintJob(); + ByteArrayInputStream in = new ByteArrayInputStream(pdfBytes); + Doc doc = new SimpleDoc(in, flavor, null); + HashPrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); + if (StringUtils.isNotBlank(jobName)) { + attrs.add(new JobName(jobName, Locale.getDefault())); + } + docJob.print(doc, attrs); + return true; + } catch (PrintException e) { + log.warn("PDF DocFlavor ç›´é€å¤±è´¥ï¼Œå°†å›žé€€ä¸ºä½å›¾æ¸²æŸ“: {} - {}", printService.getName(), e.getMessage()); + return false; + } + } + + private static String buildPdfPrinterAbortHint(String requestedPrinterName, String resolvedPrintQueueName) { + StringBuilder sb = new StringBuilder(); + sb.append("打å°ä»»åŠ¡è¢«ç³»ç»Ÿå–æ¶ˆï¼ˆPrinterAbortException)。常è§åŽŸå› ï¼š"); + sb.append("1) 默认或所选为「Microsoft Print to PDFã€ç­‰è™šæ‹Ÿæ‰“å°æœºï¼Œåœ¨ Tomcat ç­‰æœåŠ¡è¿›ç¨‹æ— äº¤äº’æ¡Œé¢æ—¶æ— æ³•弹出ä¿å­˜å¯¹è¯æ¡†ï¼Œä½œä¸šä¼šè¢«ä¸­æ­¢â€”â€”è¯·å®‰è£…å®žä½“æ‰“å°æœºå¹¶åœ¨å‰ç«¯æŒ‡å®š printerNameï¼›"); + sb.append("2) æ‰“å°æœºç¦»çº¿ã€é˜Ÿåˆ—æš‚åœã€ç¼ºçº¸æˆ–驱动报错;"); + sb.append("3) è¿è¡ŒæœåŠ¡çš„ Windows 账户无æƒè®¿é—®æ‰“å°é˜Ÿåˆ—。"); + if (StringUtils.isNotBlank(resolvedPrintQueueName)) { + sb.append(" 当å‰å®žé™…使用的打å°é˜Ÿåˆ—: ").append(resolvedPrintQueueName.trim()).append("。"); + } + if (StringUtils.isNotBlank(requestedPrinterName) && !"__system_default__".equalsIgnoreCase(requestedPrinterName.trim())) { + sb.append(" è¯·æ±‚å‚æ•° printerName: ").append(requestedPrinterName.trim()).append("。"); + } + return sb.toString(); + } + + private PrintService resolvePrintService(String printerName) { + PrintService target = null; + if (StringUtils.isNotBlank(printerName) && !"__system_default__".equals(printerName)) { + PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); + if (services != null) { + for (PrintService serviceItem : services) { + if (serviceItem != null + && printerName.equalsIgnoreCase(String.valueOf(serviceItem.getName()).trim())) { + target = serviceItem; + break; + } + } + } + } + if (target == null) { + target = PrintServiceLookup.lookupDefaultPrintService(); + } + return target; + } } diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 73ab54c..a55d056 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -355,3 +355,21 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +# æ‰“å°æ¨¡å—é…ç½® +print: + # 预é…ç½®ç½‘ç»œæ‰“å°æœºï¼ˆè‹±æ–‡é€—å·åˆ†éš”),例如:\\192.168.1.100\Zebra01,IPP_Printer_A + network-printers: "" + # åŽŸç”Ÿè®¾è®¡å™¨ã€Œä¸Šä¼ å›¾ç‰‡åˆ†æžæ¨¡æ¿ã€ï¼šOpenAI Chat Completions 兼容接å£ï¼ˆé€šä¹‰ç”¨ compatible-mode 地å€ï¼‰ + native-template-ai: + enabled: true + # api-key 生效方å¼ï¼ˆä»»é€‰å…¶ä¸€ï¼Œå¦åˆ™è§£æžç»“果为空,会走「å ä½æ¨¡æ¿ã€ï¼‰ï¼š + # â‘  环境å˜é‡ DASHSCOPE_API_KEY=sk-xxx + # â‘¡ Spring 对应该项的标准环境å˜é‡å:PRINT_NATIVE_TEMPLATE_AI_API_KEY=sk-xxx(IDE「è¿è¡Œé…ç½®ã€é‡ŒåŠ ï¼‰ + # â‘¢ 本机调试å¯ç›´æŽ¥å†™æ˜Žæ–‡ï¼ˆå‹¿æäº¤ Git):api-key: sk-ä½ çš„DashScope密钥 + api-key: sk-b62f922d63cb420d999a8c8974e00218 + base-url: https://dashscope.aliyuncs.com/compatible-mode/v1 + # 通义视觉:qwen-vl-plus / qwen-vl-max 等;勿填 gpt-4o-mini(那是 OpenAI 模型å,仅 base-url=api.openai.com æ—¶å¯ç”¨ï¼‰ + model: qwen-vl-plus + max-image-mb: 8 + http-timeout-seconds: 120 \ No newline at end of file diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.1_8__print_template_dict.sql b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.1_8__print_template_dict.sql new file mode 100644 index 0000000..2acd5e1 --- /dev/null +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/main/resources/flyway/sql/mysql/V3.9.1_8__print_template_dict.sql @@ -0,0 +1,169 @@ +-- æ‰“å°æ¨¡æ¿ï¼šåˆ†ç±»å­—å…¸ + 纸张规格字典(幂等åˆå§‹åŒ–) + +-- 分类字典 +INSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `type`, `tenant_id`) +SELECT REPLACE(UUID(), '-', ''), 'æ‰“å°æ¨¡æ¿åˆ†ç±»', 'print_template_category', 'æ‰“å°æ¨¡æ¿åˆ†ç±»', 0, 'admin', NOW(), 0, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM `sys_dict` WHERE `dict_code` = 'print_template_category' AND `del_flag` = 0 +); + +-- 纸张规格字典 +INSERT INTO `sys_dict` (`id`, `dict_name`, `dict_code`, `description`, `del_flag`, `create_by`, `create_time`, `type`, `tenant_id`) +SELECT REPLACE(UUID(), '-', ''), '打å°çº¸å¼ è§„æ ¼', 'print_paper_preset', '打å°çº¸å¼ è§„格预设', 0, 'admin', NOW(), 0, 0 +WHERE NOT EXISTS ( + SELECT 1 FROM `sys_dict` WHERE `dict_code` = 'print_paper_preset' AND `del_flag` = 0 +); + +-- 分类字典项 +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'æ¡ç ', 'barcode', 1, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'barcode'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '标签', 'label', 2, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'label'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '快递é¢å•', 'waybill', 3, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'waybill'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'åŠç‰Œ', 'hangtag', 4, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'hangtag'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '物料å¡', 'materialCard', 5, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'materialCard'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '箱唛', 'cartonMark', 6, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'cartonMark'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '质检å•', 'qc', 7, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'qc'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '入库å•', 'inbound', 8, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'inbound'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '出库å•', 'outbound', 9, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'outbound'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'å·¥å•', 'workOrder', 10, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'workOrder'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '表å•套打', 'form', 11, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'form'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '报表', 'report', 12, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_template_category' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'report'); + +-- 纸张规格字典项 +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'A4(210×297)', 'A4', 1, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'A4'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'A5(148×210)', 'A5', 2, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'A5'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'A6(105×148)', 'A6', 3, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'A6'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'B5(176×250)', 'B5', 4, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'B5'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, 'B6(125×176)', 'B6', 5, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'B6'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '10×12mmï¼ˆè¶…å°æ¡ç ï¼‰', 'L_10_12', 6, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_10_12'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '20×10mm(ç å®æ ‡ç­¾ï¼‰', 'L_20_10', 7, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_20_10'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '25×15mmï¼ˆå°æ ‡ç­¾ï¼‰', 'L_25_15', 8, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_25_15'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '30×20mmï¼ˆå°æ ‡ç­¾ï¼‰', 'L_30_20', 9, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_30_20'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '40×30mmï¼ˆå°æ¡ç ï¼‰', 'L_40_30', 10, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_40_30'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '50×30mm(è¯ç›’/资产)', 'L_50_30', 11, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_50_30'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '60×40mm(常用æ¡ç ï¼‰', 'L_60_40', 12, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_60_40'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '70×50mmï¼ˆç‰©æµæ ‡ç­¾ï¼‰', 'L_70_50', 13, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_70_50'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '80×50mmï¼ˆç‰©æµæ ‡ç­¾ï¼‰', 'L_80_50', 14, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_80_50'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '90×60mmï¼ˆç‰©æµæ ‡ç­¾ï¼‰', 'L_90_60', 15, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_90_60'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '100×70mmï¼ˆç‰©æµæ ‡ç­¾ï¼‰', 'L_100_70', 16, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_100_70'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '100×150mm(快递热æ•)', 'L_100_150', 17, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_100_150'); +INSERT INTO `sys_dict_item` (`id`, `dict_id`, `item_text`, `item_value`, `sort_order`, `status`, `create_by`, `create_time`) +SELECT REPLACE(UUID(), '-', ''), d.id, '100×180mm(快递热æ•)', 'L_100_180', 18, 1, 'admin', NOW() +FROM `sys_dict` d +WHERE d.`dict_code` = 'print_paper_preset' + AND NOT EXISTS (SELECT 1 FROM `sys_dict_item` i WHERE i.`dict_id` = d.id AND i.`item_value` = 'L_100_180'); diff --git a/jeecgboot-vue3/package-lock.json b/jeecgboot-vue3/package-lock.json index b58869c..1e0e095 100644 --- a/jeecgboot-vue3/package-lock.json +++ b/jeecgboot-vue3/package-lock.json @@ -39,8 +39,10 @@ "enquire.js": "^2.1.6", "event-source-polyfill": "^1.0.31", "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", "intro.js": "^7.2.0", "jquery": "^3.7.1", + "jspdf": "^4.2.1", "lodash-es": "^4.17.21", "lodash.get": "^4.4.2", "markdown-it": "^14.1.0", @@ -4721,6 +4723,11 @@ "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", "dev": true }, + "node_modules/@types/pako": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", + "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==" + }, "node_modules/@types/pinyin": { "version": "2.10.2", "resolved": "https://registry.npmjs.org/@types/pinyin/-/pinyin-2.10.2.tgz", @@ -4833,7 +4840,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true + "devOptional": true }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", @@ -8744,10 +8751,13 @@ } }, "node_modules/dompurify": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", - "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==", - "optional": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/domutils": { "version": "3.2.2", @@ -10259,6 +10269,16 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-png": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", + "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", + "dependencies": { + "@types/pako": "^2.0.3", + "iobuffer": "^5.3.2", + "pako": "^2.1.0" + } + }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -11647,7 +11667,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "optional": true, "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" @@ -11942,6 +11961,11 @@ "resolved": "https://registry.npmjs.org/intro.js/-/intro.js-7.2.0.tgz", "integrity": "sha512-qbMfaB70rOXVBceIWNYnYTpVTiZsvQh/MIkfdQbpA9di9VBfj1GigUPfcCv3aOfsbrtPcri8vTLTA4FcEDcHSQ==" }, + "node_modules/iobuffer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==" + }, "node_modules/is-accessor-descriptor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", @@ -13472,19 +13496,18 @@ } }, "node_modules/jspdf": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz", - "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz", + "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==", "dependencies": { - "@babel/runtime": "^7.23.2", - "atob": "^2.1.2", - "btoa": "^1.2.1", + "@babel/runtime": "^7.28.6", + "fast-png": "^6.2.0", "fflate": "^0.8.1" }, "optionalDependencies": { - "canvg": "^3.0.6", + "canvg": "^3.0.11", "core-js": "^3.6.0", - "dompurify": "^2.5.4", + "dompurify": "^3.3.1", "html2canvas": "^1.0.0-rc.5" } }, @@ -15761,6 +15784,11 @@ "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", "dev": true }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -21826,6 +21854,29 @@ "node": ">=16" } }, + "node_modules/vue-plugin-hiprint/node_modules/dompurify": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", + "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==", + "optional": true + }, + "node_modules/vue-plugin-hiprint/node_modules/jspdf": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.2.tgz", + "integrity": "sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "atob": "^2.1.2", + "btoa": "^1.2.1", + "fflate": "^0.8.1" + }, + "optionalDependencies": { + "canvg": "^3.0.6", + "core-js": "^3.6.0", + "dompurify": "^2.5.4", + "html2canvas": "^1.0.0-rc.5" + } + }, "node_modules/vue-print-nb-jeecg": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/vue-print-nb-jeecg/-/vue-print-nb-jeecg-1.0.13.tgz", diff --git a/jeecgboot-vue3/package.json b/jeecgboot-vue3/package.json index b35618d..06d6500 100644 --- a/jeecgboot-vue3/package.json +++ b/jeecgboot-vue3/package.json @@ -25,6 +25,10 @@ "dependencies": { "@ant-design/colors": "^7.2.1", "@ant-design/icons-vue": "^7.0.1", + "@fontsource/noto-sans-sc": "^5.2.9", + "@fontsource/noto-serif-sc": "^5.2.9", + "@fontsource/open-sans": "^5.2.7", + "@fontsource/roboto": "^5.2.10", "@iconify/iconify": "^3.1.1", "@jeecg/aiflow": "3.9.1-beta", "@jeecg/online": "3.9.1-beta", @@ -53,8 +57,11 @@ "enquire.js": "^2.1.6", "event-source-polyfill": "^1.0.31", "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", "intro.js": "^7.2.0", "jquery": "^3.7.1", + "jsbarcode": "^3.12.3", + "jspdf": "^4.2.1", "lodash-es": "^4.17.21", "lodash.get": "^4.4.2", "markdown-it": "^14.1.0", diff --git a/jeecgboot-vue3/pnpm-lock.yaml b/jeecgboot-vue3/pnpm-lock.yaml index b6cb4d1..49050c5 100644 --- a/jeecgboot-vue3/pnpm-lock.yaml +++ b/jeecgboot-vue3/pnpm-lock.yaml @@ -14,6 +14,18 @@ importers: '@ant-design/icons-vue': specifier: ^7.0.1 version: 7.0.1(vue@3.5.32(typescript@5.9.3)) + '@fontsource/noto-sans-sc': + specifier: ^5.2.9 + version: 5.2.9 + '@fontsource/noto-serif-sc': + specifier: ^5.2.9 + version: 5.2.9 + '@fontsource/open-sans': + specifier: ^5.2.7 + version: 5.2.7 + '@fontsource/roboto': + specifier: ^5.2.10 + version: 5.2.10 '@iconify/iconify': specifier: ^3.1.1 version: 3.1.1 @@ -98,12 +110,21 @@ importers: highlight.js: specifier: ^11.11.1 version: 11.11.1 + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 intro.js: specifier: ^7.2.0 version: 7.2.0 jquery: specifier: ^3.7.1 version: 3.7.1 + jsbarcode: + specifier: ^3.12.3 + version: 3.12.3 + jspdf: + specifier: ^4.2.1 + version: 4.2.1 lodash-es: specifier: ^4.17.21 version: 4.18.1 @@ -1590,6 +1611,18 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fontsource/noto-sans-sc@5.2.9': + resolution: {integrity: sha512-bTUIWGBgJDpwi5qAr+x0/lcgv80IHTB9vl6s2f6EymZEa7qYV99yNRBZuKFT+SYDKVunZrjCEhWtpxqmbXWl5Q==} + + '@fontsource/noto-serif-sc@5.2.9': + resolution: {integrity: sha512-+wosdNmyrtRjnqJ/4A6i99jApm6ye34n8Nh7jUO3P/+6Hd1ZBY1gB9yGaI5jVxb56RS1lM2kTc0DzX1ifRO2MA==} + + '@fontsource/open-sans@5.2.7': + resolution: {integrity: sha512-8yfgDYjE5O0vmTPdrcjV35y4yMnctsokmi9gN49Gcsr0sjzkMkR97AnKDe6OqZh2SFkYlR28fxOvi21bYEgMSw==} + + '@fontsource/roboto@5.2.10': + resolution: {integrity: sha512-8HlA5FtSfz//oFSr2eL7GFXAiE7eIkcGOtx7tjsLKq+as702x9+GU7K95iDeWFapHC4M2hv9RrpXKRTGGBI8Zg==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1906,67 +1939,56 @@ packages: resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.52.5': resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.52.5': resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.52.5': resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.52.5': resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.52.5': resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.52.5': resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.52.5': resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.52.5': resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.52.5': resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.52.5': resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openharmony-arm64@4.52.5': resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} @@ -2127,6 +2149,9 @@ packages: '@types/nprogress@0.2.3': resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + '@types/pako@2.0.4': + resolution: {integrity: sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==} + '@types/pinyin@2.10.2': resolution: {integrity: sha512-jLzlRkaLRLg+lgYPjOuP3HX2cozUkhXls5GTXopsKuKJ9lDGlIAb88OoIztH6TbNUsoJnl/7e/kjaumA5IKKJg==} @@ -3486,6 +3511,9 @@ packages: dompurify@2.5.9: resolution: {integrity: sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==} + dompurify@3.3.3: + resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + domutils@1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} @@ -3969,6 +3997,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-png@6.4.0: + resolution: {integrity: sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} @@ -4194,6 +4225,7 @@ packages: glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: @@ -4491,6 +4523,9 @@ packages: intro.js@7.2.0: resolution: {integrity: sha512-qbMfaB70rOXVBceIWNYnYTpVTiZsvQh/MIkfdQbpA9di9VBfj1GigUPfcCv3aOfsbrtPcri8vTLTA4FcEDcHSQ==} + iobuffer@5.4.0: + resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} + is-accessor-descriptor@1.0.1: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} @@ -5003,6 +5038,9 @@ packages: jspdf@2.5.2: resolution: {integrity: sha512-myeX9c+p7znDWPk0eTrujCzNjT+CXdXyk7YmJq5nD5V7uLLKmSXnlQ/Jn/kuo3X09Op70Apm0rQSnFWyGK8uEQ==} + jspdf@4.2.1: + resolution: {integrity: sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==} + katex@0.16.45: resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} hasBin: true @@ -5624,6 +5662,9 @@ packages: package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -8653,6 +8694,14 @@ snapshots: '@eslint/js@8.57.1': {} + '@fontsource/noto-sans-sc@5.2.9': {} + + '@fontsource/noto-serif-sc@5.2.9': {} + + '@fontsource/open-sans@5.2.7': {} + + '@fontsource/roboto@5.2.10': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -9290,6 +9339,8 @@ snapshots: '@types/nprogress@0.2.3': {} + '@types/pako@2.0.4': {} + '@types/pinyin@2.10.2': {} '@types/qrcode@1.5.6': @@ -10886,6 +10937,11 @@ snapshots: dompurify@2.5.9: optional: true + dompurify@3.3.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + optional: true + domutils@1.7.0: dependencies: dom-serializer: 0.2.2 @@ -11471,6 +11527,12 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-png@6.4.0: + dependencies: + '@types/pako': 2.0.4 + iobuffer: 5.4.0 + pako: 2.1.0 + fast-uri@3.1.0: {} fastest-levenshtein@1.0.16: {} @@ -11916,7 +11978,6 @@ snapshots: dependencies: css-line-break: 2.1.0 text-segmentation: 1.0.3 - optional: true htmlparser2@10.1.0: dependencies: @@ -12068,6 +12129,8 @@ snapshots: intro.js@7.2.0: {} + iobuffer@5.4.0: {} + is-accessor-descriptor@1.0.1: dependencies: hasown: 2.0.2 @@ -12731,6 +12794,17 @@ snapshots: dompurify: 2.5.9 html2canvas: 1.4.1 + jspdf@4.2.1: + dependencies: + '@babel/runtime': 7.29.2 + fast-png: 6.4.0 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.49.0 + dompurify: 3.3.3 + html2canvas: 1.4.1 + katex@0.16.45: dependencies: commander: 8.3.0 @@ -13368,6 +13442,8 @@ snapshots: package-manager-detector@1.6.0: {} + pako@2.1.0: {} + param-case@3.0.4: dependencies: dot-case: 3.0.4 diff --git a/jeecgboot-vue3/src/router/routes/staticRouter.ts b/jeecgboot-vue3/src/router/routes/staticRouter.ts index e7e95e1..33ef954 100644 --- a/jeecgboot-vue3/src/router/routes/staticRouter.ts +++ b/jeecgboot-vue3/src/router/routes/staticRouter.ts @@ -20,4 +20,50 @@ export const AI_ROUTE: AppRouteRecordRaw = { ], }; -export const staticRoutesList = [AI_ROUTE]; +export const PRINT_DESIGNER_ROUTE: AppRouteRecordRaw = { + path: '', + name: 'print-designer-parent', + component: LAYOUT, + meta: { + title: 'print-designer', + hideMenu: true, + hideChildrenInMenu: true, + }, + children: [ + { + path: '/print/designer', + name: 'print-designer', + component: () => import('/@/views/print/template/PrintDesigner.vue'), + meta: { + title: '打å°è®¾è®¡å™¨', + hideMenu: true, + hideTab: false, + }, + }, + ], +}; + +export const PRINT_NATIVE_DESIGNER_ROUTE: AppRouteRecordRaw = { + path: '', + name: 'print-native-designer-parent', + component: LAYOUT, + meta: { + title: 'print-native-designer', + hideMenu: true, + hideChildrenInMenu: true, + }, + children: [ + { + path: '/print/native-designer', + name: 'print-native-designer', + component: () => import('/@/views/print/template/native/NativePrintDesigner.vue'), + meta: { + title: '原生打å°è®¾è®¡å™¨', + hideMenu: true, + hideTab: false, + }, + }, + ], +}; + +export const staticRoutesList = [AI_ROUTE, PRINT_DESIGNER_ROUTE, PRINT_NATIVE_DESIGNER_ROUTE]; diff --git a/jeecgboot-vue3/src/views/print/template/PrintDesigner.vue b/jeecgboot-vue3/src/views/print/template/PrintDesigner.vue index c0f3a09..11b7366 100644 --- a/jeecgboot-vue3/src/views/print/template/PrintDesigner.vue +++ b/jeecgboot-vue3/src/views/print/template/PrintDesigner.vue @@ -1,112 +1,183 @@ - 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 @@ +