Browse Source

补交

master
“wangzihua” 9 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. 290
      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. 75
      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('查询失败');

290
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 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>
<!-- 数据行 -->
<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>
<!-- 展开的律师数据行 -->
<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);
// 设置律师事务所ID(部门ID)
form.firmId = departmentId.value;
if (rowData && !_.isEmpty(rowData)) {
// 正确判断模式:只有当rowData是对象且有id字段时才认为是编辑模式
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);
// 后端接口要求传递idList参数,这里传递单个ID的数组
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) {
// CTO角色显示002号承诺书
form.letterId = 2; // 或者根据实际接口数据结构调整
} else {
// 普通用户显示001号承诺书
form.letterId = 1; // 或者根据实际接口数据结构调整
}
} else {
// 新增模式下,根据角色设置默认承诺书文号
if (isCtoRole.value) {
form.letterId = 2; // CTO角色默认002号承诺书
} 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
}));
// 将文件信息转换为Upload组件需要的格式,并清理URL
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>

75
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('律师协会');
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
isCeo.value = roleLower === 'ceo';
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
isCeo.value = roleLower === 'ceo';
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
isCeo.value = roleLower === 'ceo';
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
isCeo.value = roleLower === 'ceo';
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
isCeo.value = roleLower === 'ceo';
// CEO角色判断(CEO不显示新建申报和批量提交按钮)
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> idList,直接传递ID数组
const res = await serviceApplicationsApi.batchSubmitAsFirm(selectedRowKeyList.value);
if (res.data) {
message.success('批量上报成功');
// 清空选中状态
selectedRowKeyList.value = [];
// 刷新数据
queryData();
} else {
message.error('批量上报失败');
// 确保ID列表是有效的数字数组
const validIds = selectedRowKeyList.value.filter(id => id && !isNaN(id));
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