Browse Source

补交

master
“wangzihua” 3 months ago
parent
commit
a3b0a86182
  1. 1416
      hs_err_pid14612.log
  2. 491
      hs_err_pid18068.log
  3. 0
      replay_pid18068.log
  4. 14
      src/api/business/cost/firm-reports-api.js
  5. 10
      src/api/business/service-applications/service-applications-api.js
  6. 21
      src/components/support/file-upload/index.vue
  7. 6
      src/components/system/service-count/excel-statistics-detail.vue
  8. 292
      src/components/system/service-count/firm-statistics-detail.vue
  9. 291
      src/components/system/service-count/law-firm.vue
  10. 166
      src/views/business/erp/cost/firm-reports-form.vue
  11. 74
      src/views/business/erp/cost/firm-reports-list.vue
  12. 45
      src/views/business/erp/letter/letter-form.vue
  13. 85
      src/views/business/erp/service/law-firm-statistics.vue
  14. 4
      src/views/business/erp/service/service-applications-count.vue
  15. 74
      src/views/business/erp/service/service-applications-form.vue
  16. 73
      src/views/business/erp/service/service-applications-list.vue
  17. 2
      src/views/business/oa/notice/components/notice-form-drawer.vue

1416
hs_err_pid14612.log

File diff suppressed because it is too large

491
hs_err_pid18068.log

@ -0,0 +1,491 @@
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 573600 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 Unscaled Compressed Oops mode in which the Java heap is
# placed in the first 4GB 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 4GB virtual address.
# This output file may be truncated or incomplete.
#
# Out of Memory Error (arena.cpp:168), pid=18068, tid=20172
#
# JRE version: OpenJDK Runtime Environment Temurin-21.0.9+10 (21.0.9+10) (build 21.0.9+10-LTS)
# Java VM: OpenJDK 64-Bit Server VM Temurin-21.0.9+10 (21.0.9+10-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 -Xmx2G -Xms100m -Xlog:disable -javaagent:c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\zihua\AppData\Roaming\Trae CN\User\workspaceStorage\7d416d056ae4bc965ae90fe6f6cc01b9\redhat.java -Daether.dependencyCollector.impl=bf c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\zihua\AppData\Roaming\Trae CN\User\globalStorage\redhat.java\1.51.0\config_win -data c:\Users\zihua\AppData\Roaming\Trae CN\User\workspaceStorage\7d416d056ae4bc965ae90fe6f6cc01b9\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-eb30c34586510cda58517c9b1076e37e-sock
Host: AMD Ryzen 5 5600H with Radeon Graphics , 12 cores, 13G, Windows 11 , 64 bit Build 22621 (10.0.22621.5415)
Time: Mon Jan 12 12:01:29 2026 elapsed time: 0.582197 seconds (0d 0h 0m 0s)
--------------- T H R E A D ---------------
Current thread (0x00000278f7ce2670): JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=20172, stack(0x000000eaf9100000,0x000000eaf9200000) (1024K)]
Current CompileTask:
C2:582 966 ! 4 java.util.jar.Attributes::read (494 bytes)
Stack: [0x000000eaf9100000,0x000000eaf9200000]
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x6d6e29]
V [jvm.dll+0x8b4b76]
V [jvm.dll+0x8b712e]
V [jvm.dll+0x8b7813]
V [jvm.dll+0x283d86]
V [jvm.dll+0xc66ed]
V [jvm.dll+0xc6c31]
V [jvm.dll+0x3be53b]
V [jvm.dll+0x38ab92]
V [jvm.dll+0x389fda]
V [jvm.dll+0x24bfa0]
V [jvm.dll+0x24b580]
V [jvm.dll+0x1cb13e]
V [jvm.dll+0x25b29d]
V [jvm.dll+0x25982a]
V [jvm.dll+0x3f7ea6]
V [jvm.dll+0x85e9ad]
V [jvm.dll+0x6d565d]
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=0x00000278f7cc1880, length=13, elements={
0x00000278ebfa7020, 0x00000278ee20d4e0, 0x00000278ee20e240, 0x00000278f7af59d0,
0x00000278f7af6c90, 0x00000278f7af84f0, 0x00000278f7afabd0, 0x00000278f7b09440,
0x00000278f7b0a850, 0x00000278f7ce2670, 0x00000278f7d25640, 0x00000278f7dff4c0,
0x00000278fc143ca0
}
Java Threads: ( => current thread )
0x00000278ebfa7020 JavaThread "main" [_thread_in_Java, id=21896, stack(0x000000eaf8500000,0x000000eaf8600000) (1024K)]
0x00000278ee20d4e0 JavaThread "Reference Handler" daemon [_thread_blocked, id=11140, stack(0x000000eaf8900000,0x000000eaf8a00000) (1024K)]
0x00000278ee20e240 JavaThread "Finalizer" daemon [_thread_blocked, id=21312, stack(0x000000eaf8a00000,0x000000eaf8b00000) (1024K)]
0x00000278f7af59d0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=11940, stack(0x000000eaf8b00000,0x000000eaf8c00000) (1024K)]
0x00000278f7af6c90 JavaThread "Attach Listener" daemon [_thread_blocked, id=5588, stack(0x000000eaf8c00000,0x000000eaf8d00000) (1024K)]
0x00000278f7af84f0 JavaThread "Service Thread" daemon [_thread_blocked, id=648, stack(0x000000eaf8d00000,0x000000eaf8e00000) (1024K)]
0x00000278f7afabd0 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=23352, stack(0x000000eaf8e00000,0x000000eaf8f00000) (1024K)]
0x00000278f7b09440 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=15288, stack(0x000000eaf8f00000,0x000000eaf9000000) (1024K)]
0x00000278f7b0a850 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=2368, stack(0x000000eaf9000000,0x000000eaf9100000) (1024K)]
=>0x00000278f7ce2670 JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=20172, stack(0x000000eaf9100000,0x000000eaf9200000) (1024K)]
0x00000278f7d25640 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=14264, stack(0x000000eaf9200000,0x000000eaf9300000) (1024K)]
0x00000278f7dff4c0 JavaThread "Notification Thread" daemon [_thread_blocked, id=18908, stack(0x000000eaf9300000,0x000000eaf9400000) (1024K)]
0x00000278fc143ca0 JavaThread "C2 CompilerThread2" daemon [_thread_in_vm, id=4084, stack(0x000000eaf9400000,0x000000eaf9500000) (1024K)]
Total: 13
Other Threads:
0x00000278ee1f6890 VMThread "VM Thread" [id=18340, stack(0x000000eaf8800000,0x000000eaf8900000) (1024K)]
0x00000278ee2ca890 WatcherThread "VM Periodic Task Thread" [id=21472, stack(0x000000eaf8700000,0x000000eaf8800000) (1024K)]
0x00000278ee27dce0 WorkerThread "GC Thread#0" [id=12044, stack(0x000000eaf8600000,0x000000eaf8700000) (1024K)]
Total: 3
Threads with active compile tasks:
C2 CompilerThread0 620 1056 4 java.util.concurrent.ConcurrentHashMap::setTabAt (20 bytes)
C2 CompilerThread1 620 966 ! 4 java.util.jar.Attributes::read (494 bytes)
C2 CompilerThread2 620 1063 % 4 java.math.BigInteger::implMultiplyToLen @ 135 (216 bytes)
Total: 3
VM state: not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap address: 0x0000000080000000, size: 2048 MB, Compressed Oops mode: 32-bit
CDS archive(s) mapped at: [0x000002788f000000-0x000002788fba0000-0x000002788fba0000), size 12189696, SharedBaseAddress: 0x000002788f000000, ArchiveRelocationMode: 1.
Compressed class space mapped at: 0x0000027890000000-0x00000278d0000000, reserved size: 1073741824
Narrow klass base: 0x000002788f000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
GC Precious Log:
CardTable entry size: 512
CPUs: 12 total, 12 available
Memory: 14198M
Large Page Support: Disabled
NUMA Support: Disabled
Compressed Oops: Enabled (32-bit)
Alignments: Space 512K, Generation 512K, Heap 2M
Heap Min Capacity: 100M
Heap Initial Capacity: 100M
Heap Max Capacity: 2G
Pre-touch: Disabled
Parallel Workers: 10
Heap:
PSYoungGen total 29696K, used 25413K [0x00000000d5580000, 0x00000000d7680000, 0x0000000100000000)
eden space 25600K, 99% used [0x00000000d5580000,0x00000000d6e51708,0x00000000d6e80000)
from space 4096K, 0% used [0x00000000d7280000,0x00000000d7280000,0x00000000d7680000)
to space 4096K, 0% used [0x00000000d6e80000,0x00000000d6e80000,0x00000000d7280000)
ParOldGen total 68608K, used 0K [0x0000000080000000, 0x0000000084300000, 0x00000000d5580000)
object space 68608K, 0% used [0x0000000080000000,0x0000000080000000,0x0000000084300000)
Metaspace used 4185K, committed 4416K, reserved 1114112K
class space used 467K, committed 576K, reserved 1048576K
Card table byte_map: [0x00000278edc00000,0x00000278ee010000] _byte_map_base: 0x00000278ed800000
Marking Bits: (ParMarkBitMap*) 0x00007ff86fe32460
Begin Bits: [0x00000278f1710000, 0x00000278f3710000)
End Bits: [0x00000278f3710000, 0x00000278f5710000)
Polling page: 0x00000278ec1c0000
Metaspace:
Usage:
Non-class: 3.63 MB used.
Class: 467.69 KB used.
Both: 4.09 MB used.
Virtual space:
Non-class space: 64.00 MB reserved, 3.75 MB ( 6%) committed, 1 nodes.
Class space: 1.00 GB reserved, 576.00 KB ( <1%) committed, 1 nodes.
Both: 1.06 GB reserved, 4.31 MB ( <1%) committed.
Chunk freelists:
Non-Class: 11.22 MB
Class: 15.44 MB
Both: 26.66 MB
MaxMetaspaceSize: unlimited
CompressedClassSpaceSize: 1.00 GB
Initial GC threshold: 21.00 MB
Current GC threshold: 21.00 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: 0.
num_arena_births: 184.
num_arena_deaths: 0.
num_vsnodes_births: 2.
num_vsnodes_deaths: 0.
num_space_committed: 69.
num_space_uncommitted: 0.
num_chunks_returned_to_freelist: 0.
num_chunks_taken_from_freelist: 247.
num_chunk_merges: 0.
num_chunk_splits: 157.
num_chunks_enlarged: 89.
num_inconsistent_stats: 0.
CodeHeap 'non-profiled nmethods': size=120000Kb used=410Kb max_used=410Kb free=119589Kb
bounds [0x0000027887ad0000, 0x0000027887d40000, 0x000002788f000000]
CodeHeap 'profiled nmethods': size=120000Kb used=1646Kb max_used=1646Kb free=118353Kb
bounds [0x0000027880000000, 0x0000027880270000, 0x0000027887530000]
CodeHeap 'non-nmethods': size=5760Kb used=1194Kb max_used=1212Kb free=4565Kb
bounds [0x0000027887530000, 0x00000278877a0000, 0x0000027887ad0000]
CodeCache: size=245760Kb, used=3250Kb, max_used=3268Kb, free=242507Kb
total_blobs=1514, nmethods=1059, adapters=362, full_count=0
Compilation: enabled, stopped_count=0, restarted_count=0
Compilation events (20 events):
Event: 0.568 Thread 0x00000278f7b0a850 997 3 jdk.internal.org.objectweb.asm.AnnotationWriter::create (34 bytes)
Event: 0.569 Thread 0x00000278f7b0a850 nmethod 997 0x0000027880184410 code [0x0000027880184600, 0x0000027880184a80]
Event: 0.569 Thread 0x00000278f7b0a850 998 3 jdk.internal.org.objectweb.asm.AnnotationWriter::<init> (60 bytes)
Event: 0.569 Thread 0x00000278f7b0a850 nmethod 998 0x0000027880184c90 code [0x0000027880184e40, 0x0000027880185118]
Event: 0.570 Thread 0x00000278f7b0a850 999 3 java.util.WeakHashMap::getTable (9 bytes)
Event: 0.570 Thread 0x00000278f7b0a850 nmethod 999 0x0000027880185290 code [0x0000027880185440, 0x0000027880185590]
Event: 0.570 Thread 0x00000278f7b0a850 1000 ! 3 java.util.WeakHashMap::expungeStaleEntries (139 bytes)
Event: 0.570 Thread 0x00000278f7b0a850 nmethod 1000 0x0000027880185610 code [0x0000027880185820, 0x0000027880185fe8]
Event: 0.571 Thread 0x00000278f7b0a850 1001 3 java.util.Arrays::equals (43 bytes)
Event: 0.571 Thread 0x00000278f7b0a850 nmethod 1001 0x0000027880186390 code [0x0000027880186560, 0x0000027880186828]
Event: 0.573 Thread 0x00000278f7b0a850 1002 3 java.lang.ClassLoader::loadClass (7 bytes)
Event: 0.573 Thread 0x00000278f7b0a850 nmethod 1002 0x0000027880186910 code [0x0000027880186ac0, 0x0000027880186c98]
Event: 0.574 Thread 0x00000278f7b0a850 1003 3 jdk.internal.ref.CleanerImpl::getCleanerImpl (13 bytes)
Event: 0.574 Thread 0x00000278f7b0a850 nmethod 1003 0x0000027880186d10 code [0x0000027880186ec0, 0x0000027880187180]
Event: 0.574 Thread 0x00000278f7b0a850 1006 3 jdk.internal.misc.Unsafe::putIntUnaligned (79 bytes)
Event: 0.574 Thread 0x00000278f7b0a850 nmethod 1006 0x0000027880187290 code [0x0000027880187460, 0x00000278801877f0]
Event: 0.574 Thread 0x00000278f7b0a850 1004 3 java.lang.ref.Cleaner$1::apply (9 bytes)
Event: 0.574 Thread 0x00000278f7b0a850 nmethod 1004 0x0000027880187910 code [0x0000027880187ac0, 0x0000027880187d30]
Event: 0.574 Thread 0x00000278f7b0a850 1005 3 java.lang.ref.Cleaner$1::apply (5 bytes)
Event: 0.574 Thread 0x00000278f7b0a850 nmethod 1005 0x0000027880187e10 code [0x0000027880187fa0, 0x00000278801880b8]
GC Heap History (0 events):
No events
Dll operation events (8 events):
Event: 0.011 Loaded shared library c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.dll
Event: 0.033 Loaded shared library c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
Event: 0.084 Loaded shared library C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\instrument.dll
Event: 0.089 Loaded shared library C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\net.dll
Event: 0.092 Loaded shared library C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\nio.dll
Event: 0.096 Loaded shared library C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
Event: 0.110 Loaded shared library C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jimage.dll
Event: 0.178 Loaded shared library c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\verify.dll
Deoptimization events (20 events):
Event: 0.414 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x00000278800f5004 sp=0x000000eaf85fd530
Event: 0.414 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887584242 sp=0x000000eaf85fc988 mode 0
Event: 0.415 Thread 0x00000278ebfa7020 Uncommon trap: trap_request=0xffffff6e fr.pc=0x0000027887b0eb1c relative=0x00000000000001fc
Event: 0.415 Thread 0x00000278ebfa7020 Uncommon trap: reason=loop_limit_check action=maybe_recompile pc=0x0000027887b0eb1c method=java.math.BigInteger.implMulAdd([I[IIII)I @ 26 c2
Event: 0.415 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x0000027887b0eb1c sp=0x000000eaf85fd540
Event: 0.415 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887583aa2 sp=0x000000eaf85fd490 mode 2
Event: 0.459 Thread 0x00000278ebfa7020 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000027887afec28 relative=0x00000000000004c8
Event: 0.459 Thread 0x00000278ebfa7020 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000027887afec28 method=java.lang.AbstractStringBuilder.inflateIfNeededFor(Ljava/lang/String;)V @ 14 c2
Event: 0.459 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x0000027887afec28 sp=0x000000eaf85fe310
Event: 0.459 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887583aa2 sp=0x000000eaf85fe1c0 mode 2
Event: 0.459 Thread 0x00000278ebfa7020 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000027887afda0c relative=0x00000000000000ec
Event: 0.459 Thread 0x00000278ebfa7020 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000027887afda0c method=java.lang.String.getBytes([BIB)V @ 5 c2
Event: 0.459 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x0000027887afda0c sp=0x000000eaf85fe240
Event: 0.459 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887583aa2 sp=0x000000eaf85fe1e8 mode 2
Event: 0.462 Thread 0x00000278ebfa7020 Uncommon trap: trap_request=0xffffff45 fr.pc=0x0000027887b1412c relative=0x000000000000008c
Event: 0.462 Thread 0x00000278ebfa7020 Uncommon trap: reason=unstable_if action=reinterpret pc=0x0000027887b1412c method=jdk.internal.misc.Unsafe.convEndian(ZI)I @ 4 c2
Event: 0.462 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x0000027887b1412c sp=0x000000eaf85fd8a0
Event: 0.462 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887583aa2 sp=0x000000eaf85fd7d0 mode 2
Event: 0.480 Thread 0x00000278ebfa7020 DEOPT PACKING pc=0x000002788010485d sp=0x000000eaf85fd0e0
Event: 0.480 Thread 0x00000278ebfa7020 DEOPT UNPACKING pc=0x0000027887584242 sp=0x000000eaf85fc558 mode 0
Classes loaded (20 events):
Event: 0.577 Loading class java/lang/annotation/Inherited done
Event: 0.577 Loading class java/lang/annotation/RetentionPolicy
Event: 0.577 Loading class java/lang/annotation/RetentionPolicy done
Event: 0.577 Loading class sun/reflect/annotation/AnnotationTypeMismatchExceptionProxy
Event: 0.578 Loading class sun/reflect/annotation/ExceptionProxy
Event: 0.578 Loading class sun/reflect/annotation/ExceptionProxy done
Event: 0.578 Loading class sun/reflect/annotation/AnnotationTypeMismatchExceptionProxy done
Event: 0.578 Loading class sun/reflect/annotation/AnnotationParser$1
Event: 0.578 Loading class sun/reflect/annotation/AnnotationParser$1 done
Event: 0.578 Loading class sun/reflect/annotation/AnnotationInvocationHandler
Event: 0.578 Loading class java/lang/reflect/InvocationHandler
Event: 0.578 Loading class java/lang/reflect/InvocationHandler done
Event: 0.578 Loading class sun/reflect/annotation/AnnotationInvocationHandler done
Event: 0.578 Loading class java/lang/reflect/Proxy
Event: 0.578 Loading class java/lang/reflect/Proxy done
Event: 0.578 Loading class java/lang/reflect/Proxy$1
Event: 0.578 Loading class java/lang/reflect/Proxy$1 done
Event: 0.578 Loading class jdk/internal/loader/AbstractClassLoaderValue$Sub
Event: 0.578 Loading class jdk/internal/loader/AbstractClassLoaderValue$Sub done
Event: 0.579 Loading class java/lang/reflect/Proxy$ProxyBuilder
Classes unloaded (0 events):
No events
Classes redefined (0 events):
No events
Internal exceptions (20 events):
Event: 0.141 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a13f68}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x00000000d5a13f68)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.142 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a1f3a8}: 'void java.lang.invoke.DelegatingMethodHandle$Holder.reinvoke_L(java.lang.Object, java.lang.Object, java.lang.Object, int, java.lang.Object)'> (0x00000000d5a1f3a8)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.142 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a22de0}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000d5a22de0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.145 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a3bad0}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, int)'> (0x00000000d5a3bad0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.146 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a40420}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, int, java.lang.Object)'> (0x00000000d5a40420)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.146 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a43fb0}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, int, java.lang.Object)'> (0x00000000d5a43fb0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.146 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5a47420}: 'void java.lang.invoke.DelegatingMethodHandle$Holder.delegate(java.lang.Object, java.lang.Object, int, java.lang.Object)'> (0x00000000d5a47420)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.205 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d5c061c8}: 'void java.lang.invoke.DelegatingMethodHandle$Holder.reinvoke_L(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x00000000d5c061c8)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.347 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d608c568}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object)'> (0x00000000d608c568)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.440 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d646b9c0}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object)'> (0x00000000d646b9c0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.444 Thread 0x00000278ebfa7020 Exception <a 'java/lang/ClassNotFoundException'{0x00000000d6493ab8}: sun/net/www/protocol/c/Handler> (0x00000000d6493ab8)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 312]
Event: 0.459 Thread 0x00000278ebfa7020 Exception <a 'java/io/FileNotFoundException'{0x00000000d64f2bb0}> (0x00000000d64f2bb0)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 0.460 Thread 0x00000278ebfa7020 Exception <a 'java/io/FileNotFoundException'{0x00000000d64f4018}> (0x00000000d64f4018)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 0.460 Thread 0x00000278ebfa7020 Exception <a 'java/io/FileNotFoundException'{0x00000000d64f4de8}> (0x00000000d64f4de8)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 0.460 Thread 0x00000278ebfa7020 Exception <a 'java/io/FileNotFoundException'{0x00000000d64f5a80}> (0x00000000d64f5a80)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 0.467 Thread 0x00000278ebfa7020 Exception <a 'java/io/FileNotFoundException'{0x00000000d652fd50}> (0x00000000d652fd50)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 0.479 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d656cc10}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeInterface(java.lang.Object, java.lang.Object)'> (0x00000000d656cc10)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.483 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d6580680}: 'java.lang.Object java.lang.invoke.Invokers$Holder.invokeExact_MT(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000d6580680)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.486 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d6597758}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000000d6597758)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
Event: 0.506 Thread 0x00000278ebfa7020 Exception <a 'java/lang/NoSuchMethodError'{0x00000000d662d138}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.invokeInterface(java.lang.Object, java.lang.Object, int)'> (0x00000000d662d138)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 773]
ZGC Phase Switch (0 events):
No events
VM Operations (8 events):
Event: 0.066 Executing VM operation: HandshakeAllThreads (Deoptimize)
Event: 0.066 Executing VM operation: HandshakeAllThreads (Deoptimize) done
Event: 0.119 Executing VM operation: HandshakeAllThreads (Deoptimize)
Event: 0.119 Executing VM operation: HandshakeAllThreads (Deoptimize) done
Event: 0.421 Executing VM operation: HandshakeAllThreads (Deoptimize)
Event: 0.421 Executing VM operation: HandshakeAllThreads (Deoptimize) done
Event: 0.436 Executing VM operation: HandshakeAllThreads (Deoptimize)
Event: 0.436 Executing VM operation: HandshakeAllThreads (Deoptimize) done
Memory protections (0 events):
No events
Nmethod flushes (0 events):
No events
Events (13 events):
Event: 0.022 Thread 0x00000278ebfa7020 Thread added: 0x00000278ebfa7020
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278ee20d4e0
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278ee20e240
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7af59d0
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7af6c90
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7af84f0
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7afabd0
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7b09440
Event: 0.042 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7b0a850
Event: 0.073 Thread 0x00000278f7b0a850 Thread added: 0x00000278f7ce2670
Event: 0.085 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7d25640
Event: 0.286 Thread 0x00000278ebfa7020 Thread added: 0x00000278f7dff4c0
Event: 0.376 Thread 0x00000278f7b0a850 Thread added: 0x00000278fc143ca0
Dynamic libraries:
0x00007ff77ccf0000 - 0x00007ff77ccfe000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.exe
0x00007ff8c4d70000 - 0x00007ff8c4f88000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x00007ff8c3fe0000 - 0x00007ff8c40a4000 C:\WINDOWS\System32\KERNEL32.DLL
0x00007ff8c1e80000 - 0x00007ff8c2253000 C:\WINDOWS\System32\KERNELBASE.dll
0x00007ff8c26a0000 - 0x00007ff8c27b1000 C:\WINDOWS\System32\ucrtbase.dll
0x00007ff8b2cc0000 - 0x00007ff8b2cd8000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jli.dll
0x00007ff8b2ad0000 - 0x00007ff8b2aee000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\VCRUNTIME140.dll
0x00007ff8c4a20000 - 0x00007ff8c4bd2000 C:\WINDOWS\System32\USER32.dll
0x00007ff8c2840000 - 0x00007ff8c2866000 C:\WINDOWS\System32\win32u.dll
0x00007ff8c2ab0000 - 0x00007ff8c2ad9000 C:\WINDOWS\System32\GDI32.dll
0x00007ff8c28f0000 - 0x00007ff8c2a0b000 C:\WINDOWS\System32\gdi32full.dll
0x00007ff8a0ea0000 - 0x00007ff8a113c000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.6060_none_2712eda17382d24b\COMCTL32.dll
0x00007ff8c23d0000 - 0x00007ff8c246a000 C:\WINDOWS\System32\msvcp_win.dll
0x00007ff8c4960000 - 0x00007ff8c4a07000 C:\WINDOWS\System32\msvcrt.dll
0x00007ff8c4380000 - 0x00007ff8c43b1000 C:\WINDOWS\System32\IMM32.DLL
0x00007ff8b2d70000 - 0x00007ff8b2d7c000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\vcruntime140_1.dll
0x00007ff8adec0000 - 0x00007ff8adf4d000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\msvcp140.dll
0x00007ff86f170000 - 0x00007ff86ff10000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\server\jvm.dll
0x00007ff8c4760000 - 0x00007ff8c4811000 C:\WINDOWS\System32\ADVAPI32.dll
0x00007ff8c4890000 - 0x00007ff8c4938000 C:\WINDOWS\System32\sechost.dll
0x00007ff8c2260000 - 0x00007ff8c2288000 C:\WINDOWS\System32\bcrypt.dll
0x00007ff8c3ad0000 - 0x00007ff8c3be8000 C:\WINDOWS\System32\RPCRT4.dll
0x00007ff8c4c90000 - 0x00007ff8c4d01000 C:\WINDOWS\System32\WS2_32.dll
0x00007ff8c0cd0000 - 0x00007ff8c0d1d000 C:\WINDOWS\SYSTEM32\POWRPROF.dll
0x00007ff8bb4f0000 - 0x00007ff8bb524000 C:\WINDOWS\SYSTEM32\WINMM.dll
0x00007ff8b7560000 - 0x00007ff8b756a000 C:\WINDOWS\SYSTEM32\VERSION.dll
0x00007ff8c0cb0000 - 0x00007ff8c0cc3000 C:\WINDOWS\SYSTEM32\UMPDC.dll
0x00007ff8c0f50000 - 0x00007ff8c0f68000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll
0x00007ff8b2cb0000 - 0x00007ff8b2cba000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jimage.dll
0x00007ff8bf120000 - 0x00007ff8bf353000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL
0x00007ff8c3c40000 - 0x00007ff8c3fd1000 C:\WINDOWS\System32\combase.dll
0x00007ff8c40b0000 - 0x00007ff8c4188000 C:\WINDOWS\System32\OLEAUT32.dll
0x00007ff8b4870000 - 0x00007ff8b48a2000 C:\WINDOWS\SYSTEM32\dbgcore.DLL
0x00007ff8c2870000 - 0x00007ff8c28eb000 C:\WINDOWS\System32\bcryptPrimitives.dll
0x00007ff8b2ac0000 - 0x00007ff8b2acf000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\instrument.dll
0x00007ff8b22f0000 - 0x00007ff8b2310000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.dll
0x00007ff8c2f60000 - 0x00007ff8c37fc000 C:\WINDOWS\System32\SHELL32.dll
0x00007ff8c2290000 - 0x00007ff8c23cf000 C:\WINDOWS\System32\wintypes.dll
0x00007ff8bfd90000 - 0x00007ff8c06aa000 C:\WINDOWS\SYSTEM32\windows.storage.dll
0x00007ff8c3810000 - 0x00007ff8c3914000 C:\WINDOWS\System32\SHCORE.dll
0x00007ff8c4820000 - 0x00007ff8c4889000 C:\WINDOWS\System32\shlwapi.dll
0x00007ff8c1db0000 - 0x00007ff8c1dd5000 C:\WINDOWS\SYSTEM32\profapi.dll
0x00007ff8b1300000 - 0x00007ff8b1318000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
0x00007ff8b2a30000 - 0x00007ff8b2a40000 C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\net.dll
0x00007ff8bc9c0000 - 0x00007ff8bcaec000 C:\WINDOWS\SYSTEM32\WINHTTP.dll
0x00007ff8c1430000 - 0x00007ff8c1499000 C:\WINDOWS\system32\mswsock.dll
0x00007ff8b12e0000 - 0x00007ff8b12f6000 C:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\nio.dll
0x00007ff8b12d0000 - 0x00007ff8b12e0000 c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\verify.dll
JVMTI agents:
c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar path:c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-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\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.6060_none_2712eda17382d24b;c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\server
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 -Xmx2G -Xms100m -Xlog:disable -javaagent:c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\zihua\AppData\Roaming\Trae CN\User\workspaceStorage\7d416d056ae4bc965ae90fe6f6cc01b9\redhat.java -Daether.dependencyCollector.impl=bf
java_command: c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\zihua\AppData\Roaming\Trae CN\User\globalStorage\redhat.java\1.51.0\config_win -data c:\Users\zihua\AppData\Roaming\Trae CN\User\workspaceStorage\7d416d056ae4bc965ae90fe6f6cc01b9\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-eb30c34586510cda58517c9b1076e37e-sock
java_class_path (initial): c:\Users\zihua\.trae-cn\extensions\redhat.java-1.51.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 = 4 {product} {ergonomic}
uintx GCTimeRatio = 4 {product} {command line}
bool HeapDumpOnOutOfMemoryError = true {manageable} {command line}
ccstr HeapDumpPath = c:\Users\zihua\AppData\Roaming\Trae CN\User\workspaceStorage\7d416d056ae4bc965ae90fe6f6cc01b9\redhat.java {manageable} {command line}
size_t InitialHeapSize = 104857600 {product} {command line}
size_t MaxHeapSize = 2147483648 {product} {command line}
size_t MaxNewSize = 715653120 {product} {ergonomic}
size_t MinHeapDeltaBytes = 524288 {product} {ergonomic}
size_t MinHeapSize = 104857600 {product} {command line}
size_t NewSize = 34603008 {product} {ergonomic}
uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic}
uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
size_t OldSize = 70254592 {product} {ergonomic}
uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
bool SegmentedCodeCache = true {product} {ergonomic}
size_t SoftMaxHeapSize = 2147483648 {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.9"
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=E:\Program Files\Java\jdk-11.0.12
CLASSPATH=;E:\Program Files\Java\jdk-11.0.12\bin;E:\Program Files\Java\jdk-11.0.12\jre\bin;
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;E:\Program Files\Java\jdk-11.0.12\bin;C:\Program Files\MySQL\MySQL Server 5.7\bin;E:\Program Files\Microsoft VS Code\bin;E:\JavaSoftUtil\Yarn\bin\;E:\JavaSoftUtil\Redis\;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;E:\JavaSoftUtil\NodeJS\;E:\JavaSoftUtil\Tsvn\bin;C:\Users\zihua\AppData\Local\Microsoft\WindowsApps;E:\Program Files\Bandizip\;E:\Program Files\Microsoft VS CodeUser\bin;E:\Program Files\DataGrip 2022.1.5\bin;;E:\Program Files\WebStorm 2021.2.2\bin;;C:\Users\zihua\AppData\Local\Yarn\bin;C:\Users\zihua\AppData\Roaming\npm;;e:\JavaSoftUtil\c\Trae CN\resources\app\bin\lib
USERNAME=zihua wang
OS=Windows_NT
PROCESSOR_IDENTIFIER=AMD64 Family 25 Model 80 Stepping 0, AuthenticAMD
TMP=C:\Users\zihua\AppData\Local\Temp
TEMP=C:\Users\zihua\AppData\Local\Temp
Periodic native trim disabled
--------------- S Y S T E M ---------------
OS:
Windows 11 , 64 bit Build 22621 (10.0.22621.5415)
OS uptime: 0 days 3:05 hours
CPU: total 12 (initial active 12) (12 cores per cpu, 2 threads per core) family 25 model 80 stepping 0 microcode 0x0, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4a, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt, rdtscp, rdpid, fsrm, f16c, pku, cet_ss
Processor Information for the first 12 processors :
Max Mhz: 3301, Current Mhz: 3301, Mhz Limit: 3301
Memory: 4k page, system-wide physical 14198M (2774M free)
TotalPageFile size 18294M (AvailPageFile size 4M)
current process WorkingSet (physical memory assigned to process): 79M, peak: 79M
current process commit charge ("private bytes"): 244M, peak: 244M
vm_info: OpenJDK 64-Bit Server VM (21.0.9+10-LTS) for windows-amd64 JRE (21.0.9+10-LTS), built on 2025-10-21T00:00:00Z by "admin" with unknown MS VC++:1942
END.

0
replay_pid18068.log

14
src/api/business/cost/firm-reports-api.js

@ -45,4 +45,18 @@ export const firmReportsApi = {
return postRequest('/firmReports/batchDelete', idList);
},
/**
* 提交 @author wzh
*/
commit: (idList) => {
return postRequest('/firmReports/commit', idList);
},
/**
* 审核 @author wzh
*/
review: (param) => {
return postRequest('/firmReports/review', param);
},
};

10
src/api/business/service-applications/service-applications-api.js

@ -49,6 +49,9 @@ export const serviceApplicationsApi = {
return postRequest('/serviceApplications/batchReview', param);
},
batchReviewByDepartmentId: (param) => {
return postRequest('/serviceApplications/batchReviewByDepartmentId', param);
},
/**
* 批量上报到协会审核 @author wzh
*/
@ -140,4 +143,11 @@ export const serviceApplicationsApi = {
reportStatistics: (params) => {
return postRequest('/serviceApplications/reportStatistics', params);
},
/**
* 统计当前机构的公益成本 @author wzh
*/
getServiceApplicationsCost: (queryForm) => {
return postRequest('/serviceApplications/statistics/cost', queryForm);
},
};

21
src/components/support/file-upload/index.vue

@ -21,8 +21,10 @@
@change="handleChange"
@preview="handlePreview"
@remove="handleRemove"
:disabled="props.readonly"
:class="{ 'readonly-upload': props.readonly }"
>
<div v-if="fileList.length < props.maxUploadSize">
<div v-if="!props.readonly && fileList.length < props.maxUploadSize">
<template v-if="listType === 'picture-card'">
<PlusOutlined />
<div class="ant-upload-text">
@ -42,6 +44,16 @@
</a-modal>
</div>
</template>
<style scoped>
.readonly-upload :deep(.ant-upload-list-item-actions) {
display: none !important;
}
.readonly-upload :deep(.ant-upload-select) {
display: none !important;
}
</style>
<script setup>
import { computed, ref, watch } from 'vue';
import { Modal } from 'ant-design-vue';
@ -71,7 +83,7 @@
//
maxUploadSize: {
type: Number,
default: 10,
default: 5,
},
maxSize: {
type: Number,
@ -92,6 +104,11 @@
type: String,
default: 'picture-card',
},
//
readonly: {
type: Boolean,
default: false,
},
});
//

6
src/components/system/service-count/excel-statistics-detail.vue

@ -52,7 +52,7 @@
<div class="statistics-report-container">
<!-- 报表标题 -->
<div class="report-header">
<h1>律师服务统计</h1>
<h1>律师事务所律师参与公益法律服务统计表</h1>
<div class="report-subtitle">统计时间{{ localQueryForm.year }}<span v-if="localQueryForm.quarter != null">{{ localQueryForm.quarter }}季度</span></div>
</div>
@ -62,6 +62,7 @@
<div class="report-row header-row">
<div class="report-cell">序号</div>
<div class="report-cell">律师姓名</div>
<div class="report-cell">执业证号</div>
<div class="report-cell">季度累计服务时长</div>
<div class="report-cell">季度累计服务成本</div>
<div class="report-cell">年度累计服务时长</div>
@ -72,6 +73,7 @@
<div v-for="(item, index) in tableData" :key="index" class="report-row data-row">
<div class="report-cell">{{ index + 1 }}</div>
<div class="report-cell">{{ item.lawyerName || '-' }}</div>
<div class="report-cell">{{ item.certificateNumber || '-' }}</div>
<div class="report-cell">{{ formatNumber(item.quarterlyServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(item.quarterlyServiceCost) }}</div>
<div class="report-cell">{{ formatNumber(item.annualServiceDuration) }}</div>
@ -82,6 +84,7 @@
<div v-if="summaryData" class="report-row summary-row">
<div class="report-cell">汇总</div>
<div class="report-cell">-</div>
<div class="report-cell">-</div>
<div class="report-cell">{{ formatNumber(summaryData.totalQuarterlyDuration) }}</div>
<div class="report-cell">{{ formatCurrency(summaryData.totalQuarterlyCost) }}</div>
<div class="report-cell">{{ formatNumber(summaryData.totalAnnualDuration) }}</div>
@ -211,7 +214,6 @@ async function handleQuery() {
// message.success(` ${res.data.total} `);
} else {
tableData.value = [];
message.warning('暂无数据');
}
} catch (error) {
message.error('查询失败');

292
src/components/system/service-count/firm-statistics-detail.vue

@ -1,12 +1,5 @@
<template>
<div class="firm-statistics-detail">
<!-- 返回按钮 -->
<div class="detail-header">
<a-button type="link" @click="handleBack" class="back-btn">
<ArrowLeftOutlined />
返回查询
</a-button>
</div>
<!-- 导出按钮 -->
<div class="export-section">
@ -19,37 +12,77 @@
<!-- 统计报表 -->
<div class="statistics-report-container">
<!-- 报表标题 -->
<div class="report-header">
<h1>律所服务统计报表</h1>
<div class="report-subtitle">统计时间{{ queryParams.year }}<span v-if="queryParams.quarter != null">{{ queryParams.quarter }}季度</span></div>
<div class="report-header">
<h1>律师事务所律师参与公益法律服务统计表</h1>
<div class="report-subtitle">统计时间{{ params.year }}<span v-if="params.quarter != null">{{ params.quarter }}季度</span></div>
</div>
<!-- 加载状态 -->
<div v-if="loading" class="loading-section">
<a-spin size="large" />
<div>正在加载数据...</div>
</div>
<!-- 报表表格 -->
<div v-else class="report-table">
<!-- 表头 -->
<div class="report-row header-row">
<div class="report-cell">序号</div>
<div class="report-cell">律所名称</div>
<div class="report-cell">律师名称</div>
<div class="report-cell">执业证号</div>
<div class="report-cell">季度累计服务时长</div>
<div class="report-cell">季度累计服务成本</div>
<div class="report-cell">年度累计服务时长</div>
<div class="report-cell">年度累计服务成本</div>
</div>
<!-- 报表表格 -->
<div class="report-table">
<!-- 表头 -->
<div class="report-row header-row">
<div class="report-cell">序号</div>
<div class="report-cell">律所名称</div>
<div class="report-cell">季度累计服务时长</div>
<div class="report-cell">季度累计服务成本</div>
<div class="report-cell">年度累计服务时长</div>
<div class="report-cell">年度累计服务成本</div>
<!-- 数据行 -->
<div v-for="(item, index) in tableData" :key="index" class="report-row data-row">
<div class="report-cell">{{ index + 1 }}</div>
<div class="report-cell">
<div class="firm-name-cell">
<span @click="toggleExpand(index)" class="expand-icon" v-if="hasLawyerData(item)">
<RightOutlined v-if="!expandedRows.has(index)" />
<DownOutlined v-else />
</span>
{{ item.firmName || '-' }}
</div>
</div>
<!-- 数据行 -->
<div v-for="(item, index) in tableData" :key="index" class="report-row data-row">
<div class="report-cell">{{ index + 1 }}</div>
<div class="report-cell">{{ item.firmName || '-' }}</div>
<div class="report-cell">{{ formatNumber(item.quarterlyServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(item.quarterlyServiceCost) }}</div>
<div class="report-cell">{{ formatNumber(item.annualServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(item.annualServiceCost) }}</div>
<div class="report-cell">
{{ item.certificateNumber || '-' }}
</div>
<div class="report-cell">{{ item.lawyerName || '-' }}</div>
<div class="report-cell">{{ formatNumber(item.quarterlyServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(item.quarterlyServiceCost) }}</div>
<div class="report-cell">{{ formatNumber(item.annualServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(item.annualServiceCost) }}</div>
</div>
<!-- 展开的律师数据行 -->
<template v-for="(item, index) in tableData" :key="`lawyer-container-${index}`">
<div v-if="expandedRows.has(index) && hasLawyerData(item)" class="expanded-content">
<!-- 律师数据行 -->
<div v-for="(lawyerItem, lawyerIndex) in item.lawyerServiceVOList" :key="`lawyer-${index}-${lawyerIndex}`" class="report-row lawyer-data-row">
<div class="report-cell"></div>
<div class="report-cell"></div>
<div class="report-cell">{{ lawyerItem.lawyerName || '-' }}</div>
<div class="report-cell">{{ lawyerItem.certificateNumber || '-' }}</div>
<div class="report-cell">{{ formatNumber(lawyerItem.quarterlyServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(lawyerItem.quarterlyServiceCost) }}</div>
<div class="report-cell">{{ formatNumber(lawyerItem.annualServiceDuration) }}</div>
<div class="report-cell">{{ formatCurrency(lawyerItem.annualServiceCost) }}</div>
</div>
</div>
</template>
<!-- 汇总行 -->
<div v-if="summaryData" class="report-row summary-row">
<div class="report-cell">汇总</div>
<div class="report-cell">-</div>
<div class="report-cell">-</div>
<div class="report-cell">-</div>
<div class="report-cell">{{ formatNumber(summaryData.totalQuarterlyDuration) }}</div>
<div class="report-cell">{{ formatCurrency(summaryData.totalQuarterlyCost) }}</div>
<div class="report-cell">{{ formatNumber(summaryData.totalAnnualDuration) }}</div>
@ -61,30 +94,51 @@
</template>
<script setup>
import { ref, computed, onMounted } from 'vue';
import { ExportOutlined, ArrowLeftOutlined } from '@ant-design/icons-vue';
import { ref, computed, onMounted, watch } from 'vue';
import { ExportOutlined, ArrowLeftOutlined, DownOutlined, RightOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import { serviceApplicationsApi } from '/@/api/business/service-applications/service-applications-api';
// /
const expandedRows = ref(new Set());
// /
function toggleExpand(index) {
console.log(`切换第${index}行展开状态`);
console.log(`当前展开状态:`, Array.from(expandedRows.value));
if (expandedRows.value.has(index)) {
expandedRows.value.delete(index);
} else {
expandedRows.value.add(index);
}
console.log(`切换后展开状态:`, Array.from(expandedRows.value));
console.log(`${index}行是否有律师数据:`, hasLawyerData(tableData.value[index]));
}
//
function hasLawyerData(item) {
return item && item.lawyerServiceVOList && Array.isArray(item.lawyerServiceVOList) && item.lawyerServiceVOList.length > 0;
}
//
const props = defineProps({
queryParams: {
params: {
type: Object,
required: true
},
tableData: {
type: Array,
required: true
}
});
const emit = defineEmits(['back']);
const exportLoading = ref(false);
const tableData = ref([]);
const loading = ref(false);
//
const summaryData = computed(() => {
if (!props.tableData || props.tableData.length === 0) {
if (!tableData.value || tableData.value.length === 0) {
return null;
}
@ -95,7 +149,7 @@ const summaryData = computed(() => {
totalAnnualCost: 0
};
props.tableData.forEach(item => {
tableData.value.forEach(item => {
summary.totalQuarterlyDuration += Number(item.quarterlyServiceDuration) || 0;
summary.totalQuarterlyCost += Number(item.quarterlyServiceCost) || 0;
summary.totalAnnualDuration += Number(item.annualServiceDuration) || 0;
@ -124,9 +178,42 @@ function handleBack() {
emit('back');
}
//
async function fetchStatisticsData() {
if (!props.params || !props.params.year) {
tableData.value = [];
return;
}
loading.value = true;
try {
const params = {
year: props.params.year,
quarter: props.params.quarter,
firmId: props.params.firmId
};
// API
const response = await serviceApplicationsApi.statisticsDepartment(params);
tableData.value = response.data || [];
console.log('API返回的数据:', tableData.value);
//
tableData.value.forEach((item, index) => {
console.log(`${index}行数据:`, item);
console.log(`lawyerServiceVOList:`, item.lawyerServiceVOList);
console.log(`hasLawyerData:`, hasLawyerData(item));
});
} catch (error) {
message.error('获取统计数据失败');
tableData.value = [];
} finally {
loading.value = false;
}
}
// Excel
async function handleExport() {
if (!props.tableData || props.tableData.length === 0) {
if (!tableData.value || tableData.value.length === 0) {
message.warning('暂无数据可导出');
return;
}
@ -135,14 +222,14 @@ async function handleExport() {
try {
console.log('开始导出律所统计详情...');
const exportParams = {
quarter: props.queryParams.quarter,
year: props.queryParams.year,
firmName: props.queryParams.firmName,
quarter: props.params.quarter,
year: props.params.year,
firmId: props.params.firmId,
pageNum: 1,
pageSize: 500
};
await serviceApplicationsApi.exportLawyerByDepartment(exportParams);
await serviceApplicationsApi.exportLawyer(exportParams);
message.success('导出成功');
console.log('律所统计详情导出成功');
} catch (error) {
@ -153,8 +240,15 @@ async function handleExport() {
}
}
//
watch(() => props.params, (newParams) => {
if (newParams) {
fetchStatisticsData();
}
}, { immediate: true, deep: true });
onMounted(() => {
console.log('律所统计详情组件已加载,数据量:', props.tableData.length);
console.log('律所统计详情组件已加载,数:', props.params);
});
</script>
<style scoped>
@ -201,6 +295,17 @@ onMounted(() => {
color: #666;
}
.loading-section {
padding: 60px 20px;
text-align: center;
background: #fff;
}
.loading-section div:last-child {
margin-top: 16px;
color: #666;
}
.report-table {
width: 100%;
border-collapse: collapse;
@ -212,7 +317,6 @@ onMounted(() => {
}
.report-cell {
flex: 1;
padding: 12px;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
@ -220,6 +324,57 @@ onMounted(() => {
min-height: 50px;
box-sizing: border-box;
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
}
/* 序号列 - 最窄 */
.report-cell:nth-child(1) {
flex: 0 0 60px;
min-width: 60px;
}
/* 律所名称列 */
.report-cell:nth-child(2) {
flex: 0 0 150px;
min-width: 150px;
}
/* 律师名称列 */
.report-cell:nth-child(3) {
flex: 0 0 120px;
min-width: 120px;
}
/* 执业证号列 - 最宽 */
.report-cell:nth-child(4) {
flex: 0 0 200px;
min-width: 200px;
}
/* 季度累计服务时长 */
.report-cell:nth-child(5) {
flex: 0 0 140px;
min-width: 140px;
}
/* 季度累计服务成本 */
.report-cell:nth-child(6) {
flex: 0 0 140px;
min-width: 140px;
}
/* 年度累计服务时长 */
.report-cell:nth-child(7) {
flex: 0 0 140px;
min-width: 140px;
}
/* 年度累计服务成本 */
.report-cell:nth-child(8) {
flex: 0 0 140px;
min-width: 140px;
}
.report-cell:last-child {
@ -247,4 +402,51 @@ onMounted(() => {
.report-row:last-child .report-cell {
border-bottom: none;
}
/* 展开/折叠功能样式 */
.firm-name-cell {
display: flex;
align-items: center;
cursor: pointer;
}
.expand-icon {
cursor: pointer;
margin-right: 8px;
color: #1890ff;
font-size: 12px;
width: 16px;
height: 16px;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* 展开内容样式 */
.expanded-content {
display: block !important;
padding: 0;
margin: 0;
background: white;
border: none;
border-radius: 0;
}
/* 律师数据行样式 */
.lawyer-data-row {
background-color: white;
border-left: none;
}
.lawyer-data-row:hover {
background-color: #f9f9f9;
}
/* 律师数据行标题样式 */
.lawyer-header-row {
background-color: #f0f0f0;
color: #333;
font-weight: 600;
border-bottom: 1px solid #ddd;
}
</style>

291
src/components/system/service-count/law-firm.vue

@ -0,0 +1,291 @@
<!--
* 律所统计概览组件CEO专用
*
* @Author: Assistant
* @Date: 2026-01-11
* @Description: CEO角色查看各律所服务申报统计概览
-->
<template>
<div class="law-firm-statistics">
<!-- 查询视图 -->
<div v-if="!showDetailView">
<!-- 提示信息 -->
<div class="info-section">
<p>作为协会您可以查看机构级别的统计数据数据以Excel表格样式展示</p>
<p>请选择需要查看的季度和年度然后点击查询按钮</p>
</div>
<!-- 查询条件 -->
<div class="query-section">
<a-form :model="queryForm" layout="horizontal">
<div class="query-row">
<a-form-item label="年度" class="query-item">
<a-select v-model:value="queryForm.year" placeholder="请选择年度" style="width: 300px">
<a-select-option v-for="year in yearOptions" :key="year" :value="year">{{ year }}</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="季度" class="query-item">
<a-select v-model:value="queryForm.quarter" placeholder="请选择季度" style="width: 300px">
<a-select-option v-for="quarter in quarterOptions" :key="quarter.value" :value="quarter.value">
{{ quarter.label }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="机构名称" class="query-item">
<DepartmentTreeSelect
v-model:value="queryForm.firmId"
placeholder="请选择部门"
style="width: 300px"
/>
</a-form-item>
</div>
<div class="button-row">
<a-button type="primary" @click="handleQuery" :loading="loading" class="query-button">
查询数据
</a-button>
<a-button @click="handleReset" class="reset-button">
重置
</a-button>
</div>
</a-form>
</div>
</div>
<!-- 详情视图 -->
<div v-else>
<!-- 返回按钮 -->
<div class="back-section">
<a-button @click="showDetailView = false" class="back-button">
<ArrowLeftOutlined />
返回查询
</a-button>
</div>
<!-- 详情组件 -->
<FirmStatisticsDetail :params="detailParams" />
</div>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { SearchOutlined, ReloadOutlined, DownloadOutlined, ArrowLeftOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import { serviceApplicationsApi } from '/@/api/business/service-applications/service-applications-api';
import DepartmentTreeSelect from '/@/components/system/department-tree-select/index.vue';
import FirmStatisticsDetail from './firm-statistics-detail.vue'; // detail
//
const loading = ref(false);
const exportLoading = ref(false);
const showDetailView = ref(false); //
const detailParams = ref(null); //
//
const yearOptions = ref([]);
const quarterOptions = ref([
{ value: 1, label: '第一季度' },
{ value: 2, label: '第二季度' },
{ value: 3, label: '第三季度' },
{ value: 4, label: '第四季度' }
]);
//
const queryForm = reactive({
year: new Date().getFullYear(),
quarter: null,
firmId: null
});
//
function initYearOptions() {
const currentYear = new Date().getFullYear();
const years = [];
for (let i = currentYear - 5; i <= currentYear + 1; i++) {
years.push(i);
}
yearOptions.value = years;
}
//
async function handleQuery() {
try {
loading.value = true;
//
detailParams.value = {
year: queryForm.year,
quarter: queryForm.quarter,
firmId: queryForm.firmId
};
//
showDetailView.value = true;
} catch (error) {
message.error('查询失败');
console.error('查询失败:', error);
} finally {
loading.value = false;
}
}
//
function handleReset() {
queryForm.year = new Date().getFullYear();
queryForm.quarter = null;
queryForm.firmId = null;
}
// Excel
async function handleExportExcel() {
try {
exportLoading.value = true;
const params = {
year: queryForm.year,
quarter: queryForm.quarter,
firmId: queryForm.firmId
};
// API
await serviceApplicationsApi.exportLawyer(params);
message.success('导出成功');
} catch (error) {
message.error('导出失败');
console.error('导出失败:', error);
} finally {
exportLoading.value = false;
}
}
//
onMounted(() => {
initYearOptions();
});
</script>
<style scoped>
.law-firm-statistics {
padding: 20px;
background: #fff;
min-height: 600px;
}
/* 页面标题 */
.page-title {
font-size: 18px;
font-weight: 600;
color: #1890ff;
margin-bottom: 16px;
}
/* 提示信息 */
.info-section {
background: #e6f7ff;
border: 1px solid #91d5ff;
border-radius: 4px;
padding: 16px;
margin-bottom: 24px;
line-height: 1.5;
color: #333;
}
.info-section p {
margin: 0;
font-size: 14px;
}
.info-section p:first-child {
margin-bottom: 8px;
}
/* 查询条件区域 */
.query-section {
margin-bottom: 24px;
}
/* 查询行 */
.query-row {
display: flex;
flex-direction: column;
gap: 16px;
margin-bottom: 24px;
}
/* 查询项 */
.query-item {
margin-bottom: 0 !important;
}
.query-item :deep(.ant-form-item-label) {
font-weight: 400;
color: #333;
width: 100px;
text-align: left;
padding-right: 16px;
}
.query-item :deep(.ant-form-item-control) {
flex: 1;
min-width: 200px;
}
.query-item :deep(.ant-select-selector),
.query-item :deep(.ant-input) {
border-radius: 4px;
border: 1px solid #d9d9d9;
}
/* 按钮行 */
.button-row {
display: flex;
gap: 16px;
justify-content: flex-start;
margin-top: 24px;
}
/* 按钮通用样式 */
.button-row .ant-btn {
border-radius: 4px;
font-weight: 500;
height: 32px;
padding: 0 16px;
}
/* 查询按钮 */
.query-button {
background: #1890ff;
border-color: #1890ff;
color: white;
}
.query-button:hover {
background: #40a9ff;
border-color: #40a9ff;
}
/* 重置按钮 */
.reset-button {
background: white;
border-color: #d9d9d9;
color: #666;
}
.reset-button:hover {
border-color: #40a9ff;
color: #1890ff;
}
/* 返回按钮区域 */
.back-section {
margin-bottom: 20px;
}
/* 返回按钮 */
.back-button {
background: white;
border-color: #d9d9d9;
color: #666;
margin-bottom: 16px;
}
</style>

166
src/views/business/erp/cost/firm-reports-form.vue

@ -33,7 +33,7 @@
dict-code="QUARTER"
v-model:value="form.declareQuarter"
placeholder="请选择季度"
@change="calculateCosts"
@change="onQuarterChange"
style="width: 100%"
/>
</a-form-item>
@ -54,16 +54,28 @@
<a-input-number
style="width: 100%"
v-model:value="form.publicWelfareCost"
placeholder="请输入公益活动成本"
:min="0"
:precision="2"
@change="calculateCosts"
disabled
addon-after="万元"
/>
<div style="font-size: 12px; color: #666; margin-top: 4px;">
系统自动计算不可修改
</div>
</a-form-item>
<!-- 成本比例警告信息 -->
<a-form-item v-if="showCostWarning" :wrapper-col="{ offset: 8 }">
<div style="color: #ff4d4f; font-size: 12px;">
<span v-if="costRatio <= 25"> 系统计算的公益成本已经达到收入20%</span>
<span v-else> 系统计算的公益成本超过收入25%上限上限为25%将按上限值</span>
<span v-if="costRatio > 25" style="font-weight: bold;">{{ calculatedPublicWelfareCost }}万元</span>
<span v-if="costRatio > 25">进行保存按25%比例计算</span>
</div>
</a-form-item>
<a-row>
<a-col :span="12">
<!--<a-col :span="12">
<a-form-item label="总成本(万元)" :label-col="{ span: 12 }" :wrapper-col="{ span: 12 }">
<a-input-number
style="width: 100%"
@ -73,7 +85,7 @@
addon-after="万元"
/>
</a-form-item>
</a-col>
</a-col>-->
<a-col :span="12">
<a-form-item label="成本/收入比例" :label-col="{ span: 12 }" :wrapper-col="{ span: 12 }">
<a-input
@ -97,11 +109,12 @@
</a-modal>
</template>
<script setup>
import { reactive, ref, nextTick, computed } from 'vue';
import { reactive, ref, nextTick, computed, onMounted } from 'vue';
import _ from 'lodash';
import { message } from 'ant-design-vue';
import { SmartLoading } from '/@/components/framework/smart-loading';
import { firmReportsApi } from '/@/api/business/cost/firm-reports-api';
import { serviceApplicationsApi } from '/@/api/business/service-applications/service-applications-api';
import { smartSentry } from '/@/lib/smart-sentry';
import { useUserStore } from '/@/store/modules/system/user';
import DictSelect from '/@/components/support/dict-select/index.vue';
@ -123,14 +136,71 @@
//
const visibleFlag = ref(false);
//
async function getPublicWelfareCost() {
console.log('开始获取公益成本,部门ID:', departmentId.value, '年份:', form.declareYear, '季度:', form.declareQuarter);
if (!departmentId.value) {
message.warning('无法获取机构信息,请重新登录');
console.error('部门ID为空,无法获取公益成本');
return;
}
if (!form.declareYear) {
console.log('年份未设置,跳过API调用');
return;
}
if (!form.declareQuarter) {
console.log('季度未选择,跳过API调用');
return;
}
try {
// Q1 -> 1, Q2 -> 2, Q3 -> 3, Q4 -> 4
const quarterNumber = form.declareQuarter.replace('Q', '');
// ID
const queryForm = {
firmId: departmentId.value,
year: form.declareYear, // year
quarter: parseInt(quarterNumber) //
};
console.log('调用接口: /serviceApplications/statistics/cost, 参数:', queryForm);
const response = await serviceApplicationsApi.getServiceApplicationsCost(queryForm);
console.log('接口返回数据:', response);
// API
const costInYuan = response.data; //
//const costInWanYuan = costInYuan / 10000; //
form.publicWelfareCost = costInYuan.toFixed(2);
console.log('转换后的公益成本:', form.publicWelfareCost, '万元');
calculateCosts();
} catch (error) {
message.error('获取公益成本失败');
console.error('获取公益成本失败:', error);
form.publicWelfareCost = 0;
calculateCosts();
}
}
function show(rowData) {
console.log('表单show函数被调用,rowData:', rowData);
Object.assign(form, formDefault);
// IDID
form.firmId = departmentId.value;
if (rowData && !_.isEmpty(rowData)) {
// rowDataid
if (rowData && typeof rowData === 'object' && rowData.id) {
console.log('编辑模式,使用现有数据');
Object.assign(form, rowData);
} else {
console.log('新建模式,等待用户选择季度后获取公益成本');
//
}
visibleFlag.value = true;
@ -168,25 +238,70 @@
declareQuarter: [{ required: true, message: '请选择季度' }],
declareYear: [{ required: true, message: '请输入报表年份' }],
revenue: [{ required: true, message: '请输入律所收入' }],
publicWelfareCost: [{ required: true, message: '请输入公益活动成本' }],
publicWelfareCost: [{ required: true, message: '系统正在计算公益成本,请稍后' }],
};
// 25%
const calculatedPublicWelfareCost = ref(0);
const showCostWarning = ref(false);
const costRatio = ref(0); //
//
function onQuarterChange() {
console.log('季度选择变化:', form.declareQuarter);
//
if (form.declareQuarter) {
getPublicWelfareCost();
}
//
calculateCosts();
}
// /
function calculateCosts() {
const revenue = parseFloat(form.revenue) || 0;
const publicWelfareCost = parseFloat(form.publicWelfareCost) || 0;
//
const totalCost = publicWelfareCost;
form.totalCost = totalCost;
// /
//
if (revenue > 0) {
const ratio = (totalCost / revenue) * 100;
form.costIncomeRatio = ratio.toFixed(2);
costRatio.value = (publicWelfareCost / revenue) * 100;
// 20%
if (costRatio.value >= 20) {
showCostWarning.value = true;
// 25%25%
if (costRatio.value > 25) {
const maxAllowedCost = revenue * 0.25; // 25%
calculatedPublicWelfareCost.value = maxAllowedCost.toFixed(2);
// /使
const ratio = (maxAllowedCost / revenue) * 100;
form.costIncomeRatio = ratio.toFixed(2);
} else {
// 20%25%使
calculatedPublicWelfareCost.value = publicWelfareCost;
form.costIncomeRatio = costRatio.value.toFixed(2);
}
} else {
// 20%
showCostWarning.value = false;
calculatedPublicWelfareCost.value = publicWelfareCost;
form.costIncomeRatio = costRatio.value.toFixed(2);
}
} else {
// 0
showCostWarning.value = false;
costRatio.value = 0;
form.costIncomeRatio = '0.00';
calculatedPublicWelfareCost.value = publicWelfareCost;
}
//
const totalCost = showCostWarning.value ? parseFloat(calculatedPublicWelfareCost.value) : publicWelfareCost;
form.totalCost = totalCost;
}
// 稿
@ -220,10 +335,25 @@
//
calculateCosts();
if (form.id) {
await firmReportsApi.update(form);
// 使
const saveData = { ...form };
if (showCostWarning.value) {
// 使
saveData.publicWelfareCost = parseFloat(calculatedPublicWelfareCost.value);
saveData.totalCost = saveData.publicWelfareCost;
//
const revenue = parseFloat(saveData.revenue) || 0;
if (revenue > 0) {
saveData.costIncomeRatio = ((saveData.publicWelfareCost / revenue) * 100).toFixed(2);
}
}
if (saveData.id) {
await firmReportsApi.update(saveData);
} else {
await firmReportsApi.add(form);
await firmReportsApi.add(saveData);
}
emits('reloadList');
onClose();

74
src/views/business/erp/cost/firm-reports-list.vue

@ -45,13 +45,13 @@
<!---------- 表格操作行 begin ----------->
<a-row class="smart-table-btn-block">
<div class="smart-table-operate-block">
<a-button @click="showForm" type="primary" >
<a-button v-if="isCto" @click="showForm" type="primary" >
<template #icon>
<PlusOutlined />
</template>
新建
</a-button>
<a-button @click="confirmBatchDelete" type="primary" danger :disabled="selectedRowKeyList.length == 0">
<a-button v-if="isCto" @click="confirmBatchDelete" type="primary" danger :disabled="selectedRowKeyList.length == 0">
<template #icon>
<DeleteOutlined />
</template>
@ -80,9 +80,9 @@
<template v-if="column.dataIndex === 'action'">
<div class="smart-table-operate">
<!--<a-button v-if="record.approvalStatus === 0 || record.approvalStatus === 4" @click="showForm(record)" type="link">编辑</a-button>-->
<a-button v-if="record.approvalStatus === 0" @click="onSubmit(record)" type="link">提交</a-button>
<a-button v-if="isCto && record.approvalStatus === 0 && (record.userId == currentUserId || !record.userId)" @click="onSubmit(record)" type="link">提交</a-button>
<a-button v-if="record.approvalStatus === 1 || record.approvalStatus === 2" @click="showAuditModal(record)" type="link">审核</a-button>
<a-button @click="onDelete(record)" danger type="link">删除</a-button>
<a-button v-if="isCto && record.approvalStatus === 0 && (record.userId == currentUserId || !record.userId)" @click="onDelete(record)" danger type="link">删除</a-button>
</div>
</template>
</template>
@ -121,6 +121,29 @@
import { REVIEW_STATUS_ENUM } from '/@/constants/business/erp/cost-const';
import DepartmentTreeSelect from '/@/components/system/department-tree-select/index.vue';
import DictSelect from '/@/components/support/dict-select/index.vue';
import { loginApi } from '/@/api/system/login-api';
// ---------------------------- ----------------------------
const loginInfo = ref(null);
const currentUserId = ref(null);
const isCto = ref(false);
//
async function getLoginInfo() {
try {
const res = await loginApi.getLoginInfo();
loginInfo.value = res.data;
currentUserId.value = res.data.employeeId;
// CTO
const role = (res.data?.roleCode || res.data?.roleName || '').toLowerCase();
isCto.value = role === 'cto';
} catch (e) {
smartSentry.captureError(e);
}
}
// ---------------------------- ----------------------------
@ -254,9 +277,17 @@
//
async function requestSubmit(data){
//
// 使==ID
if (data.approvalStatus !== 0 || (data.userId && data.userId != currentUserId.value)) {
message.warning('没有权限提交该数据');
return;
}
try {
SmartLoading.show();
await firmReportsApi.submit(data.reportId);
// idListID
await firmReportsApi.commit([data.id]);
message.success('提交成功');
queryData();
} catch (e) {
@ -319,7 +350,10 @@
auditForm.auditRemark = '';
}
onMounted(queryData);
onMounted(async () => {
await getLoginInfo();
await queryData();
});
// ---------------------------- / ----------------------------
const formRef = ref();
@ -346,6 +380,13 @@
//
async function requestDelete(data){
//
// 使==ID
if (!isCto.value || data.approvalStatus !== 0 || (data.userId && data.userId != currentUserId.value)) {
message.warning('没有权限删除该数据');
return;
}
SmartLoading.show();
try {
await firmReportsApi.delete(data.id);
@ -374,6 +415,21 @@
//
function confirmBatchDelete() {
// CTO
if (!isCto.value) {
message.warning('只有CTO角色有批量删除权限');
return;
}
//
const selectedRecords = tableData.value.filter(item => selectedRowKeyList.value.includes(item.id));
const invalidRecords = selectedRecords.filter(item => item.approvalStatus !== 0 || (item.userId && item.userId != currentUserId.value));
if (invalidRecords.length > 0) {
message.warning('只能批量删除自己未提交的数据');
return;
}
Modal.confirm({
title: '提示',
content: '确定要批量删除这些数据吗?',
@ -389,6 +445,12 @@
//
async function requestBatchDelete() {
//
if (!isCto.value) {
message.warning('只有CTO角色有批量删除权限');
return;
}
try {
SmartLoading.show();
await firmReportsApi.batchDelete(selectedRowKeyList.value);

45
src/views/business/erp/letter/letter-form.vue

@ -15,8 +15,11 @@
:destroyOnClose="true"
>
<a-form ref="formRef" :model="form" :rules="rules" :label-col="{ span: 5 }" >
<a-form-item label="承诺书id" name="letterId">
<a-input-number style="width: 100%" v-model:value="form.letterId" placeholder="承诺书id" />
<a-form-item label="承诺书文号" name="letterId">
<a-input-number style="width: 100%" v-model:value="form.letterId" placeholder="承诺书文号" disabled />
<div style="font-size: 12px; color: #666; margin-top: 4px;">
当前用户角色{{ isCtoRole ? 'CTO' : '普通用户' }}显示承诺书{{ form.letterId === 1 ? '001号' : '002号' }}
</div>
</a-form-item>
<a-form-item label="排序" name="sort">
<a-input-number style="width: 100%" v-model:value="form.sort" placeholder="排序" />
@ -44,17 +47,32 @@
</a-modal>
</template>
<script setup>
import { reactive, ref, nextTick } from 'vue';
import { reactive, ref, nextTick, computed } from 'vue';
import _ from 'lodash';
import { message } from 'ant-design-vue';
import { SmartLoading } from '/@/components/framework/smart-loading';
import { letterApi } from '/@/api/business/letter/letter-api';
import { smartSentry } from '/@/lib/smart-sentry';
import { useUserStore } from '/@/store/modules/system/user';
// ------------------------ ------------------------
const emits = defineEmits(['reloadList']);
// ------------------------ ------------------------
const userStore = useUserStore();
//
const isUserRole = computed(() => {
// true
return true; //
});
const isCtoRole = computed(() => {
// CTO
return false; // false
});
// ------------------------ ------------------------
//
const visibleFlag = ref(false);
@ -63,11 +81,24 @@
Object.assign(form, formDefault);
if (rowData && !_.isEmpty(rowData)) {
Object.assign(form, rowData);
//
if (isCtoRole.value) {
// CTO002
form.letterId = 2; //
} else {
// 001
form.letterId = 1; //
}
} else {
//
if (isCtoRole.value) {
form.letterId = 2; // CTO002
} else {
form.letterId = 1; // 001
}
}
// 使
// if (form.status && form.status.length > 0) {
// form.status = form.status.map((e) => e.valueCode);
// }
visibleFlag.value = true;
nextTick(() => {
formRef.value.clearValidate();

85
src/views/business/erp/service/law-firm-statistics.vue

@ -59,6 +59,14 @@
<!-- 查看详情按钮 -->
<template v-if="column.dataIndex === 'action'">
<a-button type="link" @click="handleViewDetail(record)">查看详情</a-button>
<!-- 如果未通过数大于0显示审核按钮 -->
<a-button
v-if="record.pendingCount > 0"
type="link"
@click="handleApprove(record)"
>
审核
</a-button>
</template>
<!-- 服务时长 -->
@ -69,16 +77,39 @@
</a-table>
</div>
</a-card>
<!-- 审核弹框 -->
<a-modal
v-model:visible="approveModalVisible"
title="律所服务申报审核"
:confirm-loading="approveLoading"
@ok="handleApproveConfirm"
@cancel="approveModalVisible = false"
>
<a-form :model="approveForm" layout="vertical">
<a-form-item label="审核结果" required>
<a-radio-group v-model:value="approveForm.auditResult">
<a-radio :value="3">同意</a-radio>
<a-radio :value="4">拒绝</a-radio>
</a-radio-group>
</a-form-item>
<div v-if="currentFirm" style="color: #666; font-size: 12px;">
<p>律所{{ currentFirm.firmName }}</p>
<p>待审核记录数{{ currentFirm.pendingCount }} </p>
</div>
</a-form>
</a-modal>
</div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { SearchOutlined, ReloadOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import { serviceApplicationsApi } from '/@/api/business/service-applications/service-applications-api';
import DepartmentTreeSelect from '/@/components/system/department-tree-select/index.vue';
import { router } from '/@/router'; // router
//
const emit = defineEmits(['firm-selected']);
@ -112,6 +143,8 @@ const columns = ref([
{ title: '律师人数', dataIndex: 'lawyerCount', key: 'lawyerCount', width: 120 },
{ title: '申报总数', dataIndex: 'reportCount', key: 'reportCount', width: 120 },
{ title: '已通过数', dataIndex: 'approvedCount', key: 'approvedCount', width: 120 },
{ title: '未通过数', dataIndex: 'pendingCount', key: 'pendingCount', width: 120 },
{ title: '拒绝数', dataIndex: 'rejectCount', key: 'rejectCount', width: 120 },
{ title: '服务时长(小时)', dataIndex: 'totalServiceDuration', key: 'totalServiceDuration', width: 120 },
{ title: '操作', dataIndex: 'action', key: 'action', width: 120, fixed: 'right' }
]);
@ -123,6 +156,15 @@ const queryForm = reactive({
firmId: null
});
//
const approveModalVisible = ref(false);
const approveLoading = ref(false);
const currentFirm = ref(null);
const approveForm = reactive({
auditResult: undefined,
auditRemark: ''
});
//
function initYearOptions() {
const currentYear = new Date().getFullYear();
@ -186,6 +228,47 @@ function handleViewDetail(record) {
});
}
//
function handleApprove(record) {
console.log('审核律所:', record);
//
currentFirm.value = record;
//
approveModalVisible.value = true;
}
//
async function handleApproveConfirm() {
if (!approveForm.auditResult) {
message.warning('请选择审核结果');
return;
}
approveLoading.value = true;
try {
// ID
await serviceApplicationsApi.batchReviewByDepartmentId({
firmId: currentFirm.value.firmId, // ID
associationAuditStatus: approveForm.auditResult,
auditRemark: approveForm.auditRemark
});
message.success('审核成功');
approveModalVisible.value = false;
handleQuery(); //
//
approveForm.auditResult = undefined;
approveForm.auditRemark = '';
currentFirm.value = null;
} catch (error) {
console.error('审核失败:', error);
message.error('审核失败');
} finally {
approveLoading.value = false;
}
}
//
onMounted(() => {
initYearOptions();

4
src/views/business/erp/service/service-applications-count.vue

@ -44,7 +44,7 @@ import { ref, onMounted, reactive, watch } from 'vue';
import { ExportOutlined, SearchOutlined, ReloadOutlined, ArrowLeftOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import QuarterStatistics from '/@/components/system/service-count/quarter-statistics.vue';
import LawFirmStatistics from '/@/components/system/service-count/law-firm-statistics.vue';
import LawFirmStatistics from '/@/components/system/service-count/law-firm.vue';
import ExcelStatisticsDetail from '/@/components/system/service-count/excel-statistics-detail.vue';
import DepartmentTreeSelect from '/@/components/system/department-tree-select/index.vue';
import { loginApi } from '/@/api/system/login-api';
@ -172,12 +172,10 @@ async function handleQuery() {
tableData.value = [];
summaryData.value = null;
showResultView.value = false;
message.warning('暂无数据');
}
} else {
tableData.value = [];
summaryData.value = null;
message.warning('暂无数据');
}
} catch (error) {
console.error('查询机构数据失败:', error);

74
src/views/business/erp/service/service-applications-form.vue

@ -73,7 +73,7 @@
<a-form-item label="服务时长(小时)" name="serviceDuration">
<a-input-number style="width: 100%" v-model:value="form.serviceDuration" placeholder="服务时长(小时)" :disabled="readonlyMode" />
</a-form-item>
<div style="font-size: 12px; color: #999; margin-top: -12px; margin-bottom: 12px;">不足30分钟不含本数不计入时长超过30分钟不足1个小时的含本数按照一个小时填报</div>
<div style="font-size: 12px; color: #f00d0dff; margin-top: -12px; margin-bottom: 12px;">:不足30分钟不含本数不计入时长超过30分钟不足1个小时的含本数按照一个小时填报</div>
</a-col>
</a-row>
@ -123,8 +123,8 @@
<!-- 联系人信息 -->
<a-row :gutter="16">
<a-col :span="8">
<a-form-item label="负责人姓名" name="organizerContact">
<a-input style="width: 100%" v-model:value="form.organizerContact" placeholder="负责人姓名" :disabled="readonlyMode" />
<a-form-item label="服务对象负责人姓名" name="organizerContact">
<a-input style="width: 100%" v-model:value="form.organizerContact" placeholder="服务对象负责人姓名" :disabled="readonlyMode" />
</a-form-item>
</a-col>
<a-col :span="16">
@ -141,20 +141,32 @@
<a-form-item name="proofMaterials" required>
<template #label>
<span class="ant-form-item-required">证明材料</span>
<span style="font-size: 12px; color: #999;">请上传活动方案活动记录照片新闻报道等材料支持图片(JPG/PNG)文档(PDF/Word/PPT)格式单文件最大10MB最多上传5个文件</span>
<span style="font-size: 12px; color: #f00d0dff;"> :请上传活动方案活动记录照片新闻报道等材料支持图片(JPG/PNG)文档(PDF/Word/PPT)格式单文件最大10MB最多上传5个文件</span>
</template>
<template v-if="readonlyMode">
<div v-if="defaultFileList.length > 0">
<a-typography-paragraph v-for="file in defaultFileList" :key="file.uid" style="margin: 4px 0;">
<Link :href="file.url || file.fileUrl" target="_blank">{{ file.name || file.fileName }}</Link>
</a-typography-paragraph>
<Upload
:defaultFileList="defaultFileList"
:maxUploadSize="5"
:maxSize="10"
:multiple="true"
accept=".jpg,.jpeg,.png,.gif,.pdf,.doc,.docx,.ppt,.pptx,.PNG,.JPG,.GIF"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
buttonText=""
listType="text"
:showUploadBtn="false"
readonly
/>
</div>
<div v-else>无证明材料</div>
<div v-else>无证明材料 (defaultFileList长度: {{ defaultFileList.length }})</div>
</template>
<Upload
v-else
:defaultFileList="defaultFileList"
:maxUploadSize="10"
:maxUploadSize="5"
:maxSize="10"
:multiple="true"
accept=".jpg,.jpeg,.png,.gif,.pdf,.doc,.docx,.ppt,.pptx,.PNG,.JPG,.GIF"
:folder="FILE_FOLDER_TYPE_ENUM.COMMON.value"
@ -340,25 +352,30 @@
// attachmentIds
const result = await fileApi.getFileList(attachmentIds);
if (result.data && result.data.length > 0) {
// Upload
defaultFileList.value = result.data.map(file => ({
fileId: file.fileId,
fileName: file.fileName, //
fileUrl: file.fileUrl,
fileType: file.fileType,
fileKey: file.fileKey, //
uid: file.fileId,
name: file.fileName,
status: 'done',
url: file.fileUrl
}));
// UploadURL
defaultFileList.value = result.data.map(file => {
const cleanUrl = file.fileUrl ? file.fileUrl.replace(/[`\s]/g, '') : '';
return {
fileId: file.fileId,
fileName: file.fileName, //
fileUrl: cleanUrl,
fileType: file.fileType,
fileKey: file.fileKey, //
uid: file.fileId,
name: file.fileName,
status: 'done',
url: cleanUrl
};
});
// proofMaterials
form.proofMaterials = result.data.map(file => ({
fileName: file.fileName,
fileUrl: file.fileUrl,
fileUrl: file.fileUrl ? file.fileUrl.replace(/[`\s]/g, '') : '',
fileType: file.fileType
}));
console.log('文件列表已清理URL:', defaultFileList.value);
} else {
defaultFileList.value = [];
form.proofMaterials = [];
@ -596,4 +613,17 @@
defineExpose({
show,
});
// URL
function getFileUrl(file) {
const url = file.fileUrl;
return url;
}
//
function getFileName(file) {
return file.fileName;
}
</script>

73
src/views/business/erp/service/service-applications-list.vue

@ -38,10 +38,7 @@
<a-form-item label="组织单位名称" class="smart-query-form-item">
<a-input style="width: 150px" v-model:value="queryForm.organizerName" placeholder="组织单位名称" />
</a-form-item>
<a-form-item label="服务对象负责人姓名" class="smart-query-form-item">
<a-input style="width: 150px" v-model:value="queryForm.managerName" placeholder="服务对象负责人姓名" />
</a-form-item>
<a-form-item label="执业机构审核状态" class="smart-query-form-item">
<a-form-item label="执业机构审核状态" v-if="isAssociationRole" class="smart-query-form-item">
<a-select style="width: 150px" v-model:value="queryForm.firmAuditStatus" placeholder="请选择审核状态">
<a-select-option v-for="status in Object.values(REVIEW_ENUM)" :key="status.value" :value="status.value">
{{ status.desc }}
@ -78,13 +75,16 @@
<a-row class="smart-table-btn-block">
<div class="smart-table-operate-block">
<a-button v-if="isNotUser" @click="showForm" type="primary">
<!-- 新建申报按钮非协会角色且非CEO角色显示 -->
<a-button v-if="!isAssociationRole && !isCeo" @click="showForm" type="primary">
<template #icon>
<PlusOutlined />
</template>
新建申报
</a-button>
<a-button @click="batchSubmit" type="primary" :disabled="selectedRowKeyList.length == 0">
<!-- 批量提交按钮非CEO角色显示 -->
<a-button v-if="!isCeo" @click="batchSubmit" type="primary" :disabled="selectedRowKeyList.length == 0">
<template #icon>
<SendOutlined />
</template>
@ -117,7 +117,7 @@
批量上报
</a-button>
<a-button @click="confirmBatchDelete" type="primary" danger :disabled="selectedRowKeyList.length == 0">
<a-button v-if="!isCeo" @click="confirmBatchDelete" type="primary" danger :disabled="selectedRowKeyList.length == 0">
<template #icon>
<DeleteOutlined />
</template>
@ -488,6 +488,24 @@ import { loginApi } from '/@/api/system/login-api';
roleLower.includes('律协') ||
roleLower.includes('律师协会');
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEOCEO
isCeo.value = roleLower === 'ceo';
// CEO
isCeo.value = roleLower === 'ceo';
@ -555,7 +573,14 @@ import { loginApi } from '/@/api/system/login-api';
batchAuditLoading.value = true;
try {
await serviceApplicationsApi.batchReview(batchAuditForm);
// 使
// 使associationAuditStatus使firmAuditStatus
const auditData = {
...batchAuditForm,
auditStatusField: isAssociationRole.value ? 'associationAuditStatus' : 'firmAuditStatus'
};
await serviceApplicationsApi.batchReview(auditData);
message.success('批量审核成功');
batchAuditModalVisible.value = false;
queryData(); //
@ -620,21 +645,31 @@ import { loginApi } from '/@/api/system/login-api';
async function handleBatchReport() {
try {
SmartLoading.show();
console.log('批量上报参数:', selectedRowKeyList.value);
// ValidateList<Long> idListID
const res = await serviceApplicationsApi.batchSubmitAsFirm(selectedRowKeyList.value);
// ID
const validIds = selectedRowKeyList.value.filter(id => id && !isNaN(id));
if (res.data) {
message.success('批量上报成功');
//
selectedRowKeyList.value = [];
//
queryData();
} else {
message.error('批量上报失败');
if (validIds.length === 0) {
message.warning('请选择要上报的记录');
SmartLoading.hide();
return;
}
// ValidateList<Long> ID
const idList = validIds.map(id => Number(id));
const res = await serviceApplicationsApi.batchSubmitAsFirm(idList);
//
selectedRowKeyList.value = [];
//
queryData();
} catch (error) {
console.error('批量上报失败:', error);
message.error('批量上报失败');
smartSentry.captureError(error);
} finally {
SmartLoading.hide();

2
src/views/business/oa/notice/components/notice-form-drawer.vue

@ -28,7 +28,7 @@
</a-select>
</a-form-item>
<a-form-item label="文号">
<a-input v-model:value="formData.documentNumber" placeholder="文号,如:1024创新实验室发〔2022〕字第36号" />
<a-input v-model:value="formData.documentNumber" placeholder="文号" />
</a-form-item>
<a-form-item label="作者" name="author">
<a-input v-model:value="formData.author" placeholder="请输入作者" />

Loading…
Cancel
Save