Browse Source

ticket12: 移交与同步接缝——项目域移交迁入 crm-project(断 extends 查 crm_project)、删商机侧旧类、ProjectOwnerSyncPort 真实现替换 Noop、crm-auth 零改动

master
luoweijian 9 hours ago
parent
commit
03d37029a2
  1. 7
      .scratch/crm-project/API-SUMMARY.md
  2. 10
      .scratch/crm-project/tickets/12-transfer-sync-seams.md
  3. 795
      crm-customer/hs_err_pid24884.log
  4. 5824
      crm-customer/replay_pid24884.log
  5. 5
      crm-customer/src/main/java/com/crm/customer/domain/dto/CustomerListRowDTO.java
  6. 2
      crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerOplog.java
  7. 6
      crm-customer/src/main/java/com/crm/customer/domain/param/OplogPageParam.java
  8. 7
      crm-customer/src/main/java/com/crm/customer/mapper/CustomerMapper.java
  9. 25
      crm-customer/src/main/java/com/crm/customer/port/impl/NoopProjectOwnerSyncPortImpl.java
  10. 21
      crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java
  11. 39
      crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java
  12. 21
      crm-customer/src/test/java/com/crm/customer/service/impl/CustomerWorkspaceOwnershipIntegrationTest.java
  13. 29
      crm-opportunity/src/main/java/com/crm/opportunity/service/impl/ProjectUserTransferPortImpl.java
  14. 50
      crm-project/src/main/java/com/crm/project/port/inbound/impl/ProjectOwnerSyncPortImpl.java
  15. 55
      crm-project/src/main/java/com/crm/project/transfer/ProjectUserTransferPortImpl.java
  16. 221
      crm-project/src/test/java/com/crm/project/transfer/ProjectSeamsH2IntegrationTest.java

7
.scratch/crm-project/API-SUMMARY.md

@ -99,7 +99,12 @@
| GET | `/api/project/bidding` | bidDeadline / bidBudget / brandControl / bidBaseType / bidBaseTypeName(票13) / allocRatio / bidBond / bidFileId / bidderName(投标主体一对一本期) |
| GET | `/api/project/bid-open` | bidOpenTime / bidOpenPlace / bidAwardMethod / bidAwardAmount / bidResult / bidResultName / bidTime |
(后续票:2.7 移交同步……随票追加于此)
### 2.7 移交与同步接缝(票 12,域内实现、零 HTTP 端点)
- **用户移交(A7-1)**:`ProjectUserTransferPortImpl`(`com.crm.project.transfer`,实现 crm-base `UserTransferPort`,`domain()="project"`)——查 `crm_project`、刷 owner 三列(owner_user_id/owner_name_snapshot/owner_dept_id);crm-auth `UserTransferService` 经 Spring 多态注册表自动重挂,**零改动**。原 crm-opportunity 侧共表实现(`opp_status=5` 切域)已删除;商机域移交(`OpportunityUserTransferPortImpl` 查 opportunity)不受影响。
- **客户换负责人同步**:`ProjectOwnerSyncPortImpl`(`com.crm.project.port.inbound.impl`,`@Primary` 实现 crm-customer `ProjectOwnerSyncPort`)——customer_id 命中项目批量刷 owner 三列,返回真实影响行数;crm-customer 侧 Noop 桩已退役。
(后续票:2.8 ProjectRule 消费(票 13)……随票追加于此)
## 3. 状态 / 值域附录

10
.scratch/crm-project/tickets/12-transfer-sync-seams.md

@ -6,8 +6,8 @@
**Status:** ready-for-agent
- [ ] crm-opportunity 侧旧项目移交类删除,商机域移交不受影响
- [ ] crm-auth 零改动验证(注册表自动重挂)
- [ ] ProjectOwnerSyncPort 真实现生效、Noop 退役,返回真实影响行数
- [ ] 移交/同步集成测试绿
- [ ] 通用纪律收工项:文档沉淀(API-SUMMARY 如涉及)、BOM 扫描、mvn compile + 测试绿
- [x] crm-opportunity 侧旧项目移交类删除,商机域移交不受影响
- [x] crm-auth 零改动验证(注册表自动重挂)
- [x] ProjectOwnerSyncPort 真实现生效、Noop 退役,返回真实影响行数
- [x] 移交/同步集成测试绿
- [x] 通用纪律收工项:文档沉淀(API-SUMMARY 如涉及)、BOM 扫描、mvn compile + 测试绿

795
crm-customer/hs_err_pid24884.log

@ -0,0 +1,795 @@
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32744 bytes. Error detail: ChunkPool::allocate
# Possible reasons:
# The system is out of physical RAM or swap space
# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# JVM is running with Zero Based Compressed Oops mode in which the Java heap is
# placed in the first 32GB address space. The Java Heap base address is the
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
# to set the Java Heap base and to place the Java Heap above 32GB virtual address.
# This output file may be truncated or incomplete.
#
# Out of Memory Error (arena.cpp:79), pid=24884, tid=22296
#
# JRE version: OpenJDK Runtime Environment Corretto-17.0.13.11.1 (17.0.13+11) (build 17.0.13+11-LTS)
# Java VM: OpenJDK 64-Bit Server VM Corretto-17.0.13.11.1 (17.0.13+11-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 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: -Djdk.attach.allowAttachSelf=true C:\Users\Administrator\AppData\Local\Temp\surefire9953034798614190830\surefirebooter-20260910210118475_120.jar C:\Users\Administrator\AppData\Local\Temp\surefire9953034798614190830 2026-09-10T21-00-32_560-jvmRun1 surefire-20260910210118475_118tmp surefire_6-20260910210118475_119tmp
Host: AMD Ryzen 5 5600G with Radeon Graphics , 12 cores, 15G, Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
Time: Thu Sep 10 21:01:24 2026 Windows 10 , 64 bit Build 19041 (10.0.19041.5915) elapsed time: 6.447845 seconds (0d 0h 0m 6s)
--------------- T H R E A D ---------------
Current thread (0x000002aa89c02b90): JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=22296, stack(0x000000d4b6100000,0x000000d4b6200000)]
Current CompileTask:
C2: 6447 12808 4 net.sf.jsqlparser.parser.CCJSqlParser::jj_3R_RelObjectNameWithoutValue_1844_5_120 (3615 bytes)
Stack: [0x000000d4b6100000,0x000000d4b6200000]
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x680c19]
V [jvm.dll+0x83888a]
V [jvm.dll+0x83a34e]
V [jvm.dll+0x83a9b3]
V [jvm.dll+0x2481af]
V [jvm.dll+0xacbf1]
V [jvm.dll+0xad03c]
V [jvm.dll+0x36caf2]
V [jvm.dll+0x568939]
V [jvm.dll+0x331bc9]
V [jvm.dll+0x33103a]
V [jvm.dll+0x21a701]
V [jvm.dll+0x219b41]
V [jvm.dll+0x1a58ed]
V [jvm.dll+0x22988d]
V [jvm.dll+0x227a1c]
V [jvm.dll+0x7ed737]
V [jvm.dll+0x7e7b2c]
V [jvm.dll+0x67fae7]
C [ucrtbase.dll+0x21bb2]
C [KERNEL32.DLL+0x17374]
C [ntdll.dll+0x4cc91]
--------------- P R O C E S S ---------------
Threads class SMR info:
_java_thread_list=0x000002aad2335590, length=24, elements={
0x000002aae3e5e970, 0x000002aaff2f0700, 0x000002aaff2f1290, 0x000002aa89c00520,
0x000002aa89c00df0, 0x000002aa89c016c0, 0x000002aa89c01f90, 0x000002aa89c02b90,
0x000002aa89c056c0, 0x000002aa89c19a80, 0x000002aa89d5c7e0, 0x000002aa89d5ef70,
0x000002aa89ee1cd0, 0x000002aacf6e9800, 0x000002aacf8317f0, 0x000002aa89ee1230,
0x000002aa89da9070, 0x000002aad2181690, 0x000002aad1777180, 0x000002aad1f9a3d0,
0x000002aad22849e0, 0x000002aad2285e20, 0x000002aad2286330, 0x000002aad2285400
}
Java Threads: ( => current thread )
0x000002aae3e5e970 JavaThread "main" [_thread_in_vm, id=35252, stack(0x000000d4b5400000,0x000000d4b5500000)]
0x000002aaff2f0700 JavaThread "Reference Handler" daemon [_thread_blocked, id=30052, stack(0x000000d4b5b00000,0x000000d4b5c00000)]
0x000002aaff2f1290 JavaThread "Finalizer" daemon [_thread_blocked, id=24508, stack(0x000000d4b5c00000,0x000000d4b5d00000)]
0x000002aa89c00520 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=35576, stack(0x000000d4b5d00000,0x000000d4b5e00000)]
0x000002aa89c00df0 JavaThread "Attach Listener" daemon [_thread_blocked, id=27280, stack(0x000000d4b5e00000,0x000000d4b5f00000)]
0x000002aa89c016c0 JavaThread "Service Thread" daemon [_thread_blocked, id=31788, stack(0x000000d4b5f00000,0x000000d4b6000000)]
0x000002aa89c01f90 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=27980, stack(0x000000d4b6000000,0x000000d4b6100000)]
=>0x000002aa89c02b90 JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=22296, stack(0x000000d4b6100000,0x000000d4b6200000)]
0x000002aa89c056c0 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=36240, stack(0x000000d4b6200000,0x000000d4b6300000)]
0x000002aa89c19a80 JavaThread "Sweeper thread" daemon [_thread_blocked, id=35788, stack(0x000000d4b6300000,0x000000d4b6400000)]
0x000002aa89d5c7e0 JavaThread "Notification Thread" daemon [_thread_blocked, id=10520, stack(0x000000d4b6400000,0x000000d4b6500000)]
0x000002aa89d5ef70 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=35536, stack(0x000000d4b6600000,0x000000d4b6700000)]
0x000002aa89ee1cd0 JavaThread "C2 CompilerThread1" daemon [_thread_blocked, id=36852, stack(0x000000d4b6700000,0x000000d4b6800000)]
0x000002aacf6e9800 JavaThread "surefire-forkedjvm-stream-flusher" daemon [_thread_blocked, id=3632, stack(0x000000d4b6800000,0x000000d4b6900000)]
0x000002aacf8317f0 JavaThread "surefire-forkedjvm-command-thread" daemon [_thread_in_native, id=34224, stack(0x000000d4b6900000,0x000000d4b6a00000)]
0x000002aa89ee1230 JavaThread "C2 CompilerThread2" daemon [_thread_in_native, id=28112, stack(0x000000d4b6f00000,0x000000d4b7000000)]
0x000002aa89da9070 JavaThread "System Clock" daemon [_thread_blocked, id=30480, stack(0x000000d4b7600000,0x000000d4b7700000)]
0x000002aad2181690 JavaThread "mybatis-plus-jsqlParser-20" daemon [_thread_blocked, id=27488, stack(0x000000d4b7700000,0x000000d4b7800000)]
0x000002aad1777180 JavaThread "mybatis-plus-jsqlParser-21" daemon [_thread_blocked, id=15500, stack(0x000000d4b7800000,0x000000d4b7900000)]
0x000002aad1f9a3d0 JavaThread "mybatis-plus-jsqlParser-22" daemon [_thread_blocked, id=33184, stack(0x000000d4b7900000,0x000000d4b7a00000)]
0x000002aad22849e0 JavaThread "mybatis-plus-jsqlParser-23" daemon [_thread_blocked, id=15880, stack(0x000000d4b7a00000,0x000000d4b7b00000)]
0x000002aad2285e20 JavaThread "mybatis-plus-jsqlParser-24" daemon [_thread_blocked, id=5572, stack(0x000000d4b7b00000,0x000000d4b7c00000)]
0x000002aad2286330 JavaThread "mybatis-plus-jsqlParser-25" daemon [_thread_blocked, id=33992, stack(0x000000d4b7c00000,0x000000d4b7d00000)]
0x000002aad2285400 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=24092, stack(0x000000d4b7d00000,0x000000d4b7e00000)]
Other Threads:
0x000002aaff2e8a30 VMThread "VM Thread" [stack: 0x000000d4b5a00000,0x000000d4b5b00000] [id=22464]
0x000002aa89d5ecd0 WatcherThread [stack: 0x000000d4b6500000,0x000000d4b6600000] [id=28812]
0x000002aae3f7c4d0 GCTaskThread "GC Thread#0" [stack: 0x000000d4b5500000,0x000000d4b5600000] [id=18132]
0x000002aacf3a3d70 GCTaskThread "GC Thread#1" [stack: 0x000000d4b6a00000,0x000000d4b6b00000] [id=3824]
0x000002aacf4384f0 GCTaskThread "GC Thread#2" [stack: 0x000000d4b6b00000,0x000000d4b6c00000] [id=22268]
0x000002aacf7febe0 GCTaskThread "GC Thread#3" [stack: 0x000000d4b6c00000,0x000000d4b6d00000] [id=10540]
0x000002aacf753050 GCTaskThread "GC Thread#4" [stack: 0x000000d4b6d00000,0x000000d4b6e00000] [id=12372]
0x000002aacf8e7d30 GCTaskThread "GC Thread#5" [stack: 0x000000d4b6e00000,0x000000d4b6f00000] [id=36804]
0x000002aacfdede80 GCTaskThread "GC Thread#6" [stack: 0x000000d4b7000000,0x000000d4b7100000] [id=32076]
0x000002aacfdee950 GCTaskThread "GC Thread#7" [stack: 0x000000d4b7100000,0x000000d4b7200000] [id=27396]
0x000002aad0b7a3d0 GCTaskThread "GC Thread#8" [stack: 0x000000d4b7200000,0x000000d4b7300000] [id=20452]
0x000002aad0b7a110 GCTaskThread "GC Thread#9" [stack: 0x000000d4b7300000,0x000000d4b7400000] [id=34984]
0x000002aae3f8ca00 ConcurrentGCThread "G1 Main Marker" [stack: 0x000000d4b5600000,0x000000d4b5700000] [id=34328]
0x000002aae3f901f0 ConcurrentGCThread "G1 Conc#0" [stack: 0x000000d4b5700000,0x000000d4b5800000] [id=32956]
0x000002aad0b7a950 ConcurrentGCThread "G1 Conc#1" [stack: 0x000000d4b7400000,0x000000d4b7500000] [id=28036]
0x000002aad0b79610 ConcurrentGCThread "G1 Conc#2" [stack: 0x000000d4b7500000,0x000000d4b7600000] [id=32380]
0x000002aaff19e540 ConcurrentGCThread "G1 Refine#0" [stack: 0x000000d4b5800000,0x000000d4b5900000] [id=36500]
0x000002aaff19ec20 ConcurrentGCThread "G1 Service" [stack: 0x000000d4b5900000,0x000000d4b5a00000] [id=32648]
Threads with active compile tasks:
C2 CompilerThread0 6460 12808 4 net.sf.jsqlparser.parser.CCJSqlParser::jj_3R_RelObjectNameWithoutValue_1844_5_120 (3615 bytes)
C2 CompilerThread2 6460 13166 4 org.h2.command.Parser::readTermWithIdentifier (1182 bytes)
VM state: not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap address: 0x0000000709200000, size: 3950 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
CDS archive(s) mapped at: [0x000002aa8a000000-0x000002aa8abb0000-0x000002aa8abb0000), size 12255232, SharedBaseAddress: 0x000002aa8a000000, ArchiveRelocationMode: 1.
Compressed class space mapped at: 0x000002aa8b000000-0x000002aacb000000, reserved size: 1073741824
Narrow klass base: 0x000002aa8a000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
GC Precious Log:
CPUs: 12 total, 12 available
Memory: 15799M
Large Page Support: Disabled
NUMA Support: Disabled
Compressed Oops: Enabled (Zero based)
Heap Region Size: 2M
Heap Min Capacity: 8M
Heap Initial Capacity: 248M
Heap Max Capacity: 3950M
Pre-touch: Disabled
Parallel Workers: 10
Concurrent Workers: 3
Concurrent Refinement Workers: 10
Periodic GC: Disabled
Heap:
garbage-first heap total 133120K, used 57106K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 14 young (28672K), 4 survivors (8192K)
Metaspace used 55935K, committed 56576K, reserved 1114112K
class space used 6618K, committed 6912K, reserved 1048576K
Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next)
| 0|0x0000000709200000, 0x0000000709400000, 0x0000000709400000|100%| O| |TAMS 0x0000000709400000, 0x0000000709200000| Untracked
| 1|0x0000000709400000, 0x0000000709600000, 0x0000000709600000|100%| O| |TAMS 0x0000000709600000, 0x0000000709400000| Untracked
| 2|0x0000000709600000, 0x0000000709800000, 0x0000000709800000|100%| O| |TAMS 0x0000000709800000, 0x0000000709600000| Untracked
| 3|0x0000000709800000, 0x0000000709a00000, 0x0000000709a00000|100%| O| |TAMS 0x0000000709a00000, 0x0000000709800000| Untracked
| 4|0x0000000709a00000, 0x0000000709c00000, 0x0000000709c00000|100%| O| |TAMS 0x0000000709c00000, 0x0000000709a00000| Untracked
| 5|0x0000000709c00000, 0x0000000709e00000, 0x0000000709e00000|100%| O| |TAMS 0x0000000709e00000, 0x0000000709c00000| Untracked
| 6|0x0000000709e00000, 0x0000000709ef7000, 0x000000070a000000| 48%| O| |TAMS 0x0000000709ef7000, 0x0000000709e00000| Untracked
| 7|0x000000070a000000, 0x000000070a200000, 0x000000070a200000|100%| O| |TAMS 0x000000070a200000, 0x000000070a000000| Untracked
| 8|0x000000070a200000, 0x000000070a400000, 0x000000070a400000|100%| O| |TAMS 0x000000070a400000, 0x000000070a200000| Untracked
| 9|0x000000070a400000, 0x000000070a600000, 0x000000070a600000|100%| O| |TAMS 0x000000070a55fe00, 0x000000070a400000| Untracked
| 10|0x000000070a600000, 0x000000070a800000, 0x000000070a800000|100%| O| |TAMS 0x000000070a600000, 0x000000070a600000| Untracked
| 11|0x000000070a800000, 0x000000070aa00000, 0x000000070aa00000|100%| O| |TAMS 0x000000070a800000, 0x000000070a800000| Untracked
| 12|0x000000070aa00000, 0x000000070ac00000, 0x000000070ac00000|100%| O| |TAMS 0x000000070aa00000, 0x000000070aa00000| Untracked
| 13|0x000000070ac00000, 0x000000070ae00000, 0x000000070ae00000|100%| O| |TAMS 0x000000070ac00000, 0x000000070ac00000| Untracked
| 14|0x000000070ae00000, 0x000000070b000000, 0x000000070b000000|100%| O| |TAMS 0x000000070ae00000, 0x000000070ae00000| Untracked
| 15|0x000000070b000000, 0x000000070b200000, 0x000000070b200000|100%| O| |TAMS 0x000000070b000000, 0x000000070b000000| Untracked
| 16|0x000000070b200000, 0x000000070b2a0e00, 0x000000070b400000| 31%| O| |TAMS 0x000000070b200000, 0x000000070b200000| Untracked
| 17|0x000000070b400000, 0x000000070b400000, 0x000000070b600000| 0%| F| |TAMS 0x000000070b400000, 0x000000070b400000| Untracked
| 18|0x000000070b600000, 0x000000070b600000, 0x000000070b800000| 0%| F| |TAMS 0x000000070b600000, 0x000000070b600000| Untracked
| 19|0x000000070b800000, 0x000000070b800000, 0x000000070ba00000| 0%| F| |TAMS 0x000000070b800000, 0x000000070b800000| Untracked
| 20|0x000000070ba00000, 0x000000070ba00000, 0x000000070bc00000| 0%| F| |TAMS 0x000000070ba00000, 0x000000070ba00000| Untracked
| 21|0x000000070bc00000, 0x000000070bc00000, 0x000000070be00000| 0%| F| |TAMS 0x000000070bc00000, 0x000000070bc00000| Untracked
| 22|0x000000070be00000, 0x000000070be00000, 0x000000070c000000| 0%| F| |TAMS 0x000000070be00000, 0x000000070be00000| Untracked
| 23|0x000000070c000000, 0x000000070c000000, 0x000000070c200000| 0%| F| |TAMS 0x000000070c000000, 0x000000070c000000| Untracked
| 24|0x000000070c200000, 0x000000070c200000, 0x000000070c400000| 0%| F| |TAMS 0x000000070c200000, 0x000000070c200000| Untracked
| 25|0x000000070c400000, 0x000000070c400000, 0x000000070c600000| 0%| F| |TAMS 0x000000070c400000, 0x000000070c400000| Untracked
| 26|0x000000070c600000, 0x000000070c62cdd8, 0x000000070c800000| 8%| S|CS|TAMS 0x000000070c600000, 0x000000070c600000| Complete
| 27|0x000000070c800000, 0x000000070c800000, 0x000000070ca00000| 0%| F| |TAMS 0x000000070c800000, 0x000000070c800000| Untracked
| 28|0x000000070ca00000, 0x000000070cc00000, 0x000000070cc00000|100%| S|CS|TAMS 0x000000070ca00000, 0x000000070ca00000| Complete
| 29|0x000000070cc00000, 0x000000070ce00000, 0x000000070ce00000|100%| S|CS|TAMS 0x000000070cc00000, 0x000000070cc00000| Complete
| 30|0x000000070ce00000, 0x000000070d000000, 0x000000070d000000|100%| S|CS|TAMS 0x000000070ce00000, 0x000000070ce00000| Complete
| 31|0x000000070d000000, 0x000000070d000000, 0x000000070d200000| 0%| F| |TAMS 0x000000070d000000, 0x000000070d000000| Untracked
| 32|0x000000070d200000, 0x000000070d200000, 0x000000070d400000| 0%| F| |TAMS 0x000000070d200000, 0x000000070d200000| Untracked
| 33|0x000000070d400000, 0x000000070d400000, 0x000000070d600000| 0%| F| |TAMS 0x000000070d400000, 0x000000070d400000| Untracked
| 34|0x000000070d600000, 0x000000070d600000, 0x000000070d800000| 0%| F| |TAMS 0x000000070d600000, 0x000000070d600000| Untracked
| 35|0x000000070d800000, 0x000000070d800000, 0x000000070da00000| 0%| F| |TAMS 0x000000070d800000, 0x000000070d800000| Untracked
| 36|0x000000070da00000, 0x000000070da00000, 0x000000070dc00000| 0%| F| |TAMS 0x000000070da00000, 0x000000070da00000| Untracked
| 37|0x000000070dc00000, 0x000000070dc00000, 0x000000070de00000| 0%| F| |TAMS 0x000000070dc00000, 0x000000070dc00000| Untracked
| 38|0x000000070de00000, 0x000000070de00000, 0x000000070e000000| 0%| F| |TAMS 0x000000070de00000, 0x000000070de00000| Untracked
| 39|0x000000070e000000, 0x000000070e000000, 0x000000070e200000| 0%| F| |TAMS 0x000000070e000000, 0x000000070e000000| Untracked
| 40|0x000000070e200000, 0x000000070e200000, 0x000000070e400000| 0%| F| |TAMS 0x000000070e200000, 0x000000070e200000| Untracked
| 41|0x000000070e400000, 0x000000070e400000, 0x000000070e600000| 0%| F| |TAMS 0x000000070e400000, 0x000000070e400000| Untracked
| 42|0x000000070e600000, 0x000000070e600000, 0x000000070e800000| 0%| F| |TAMS 0x000000070e600000, 0x000000070e600000| Untracked
| 43|0x000000070e800000, 0x000000070e800000, 0x000000070ea00000| 0%| F| |TAMS 0x000000070e800000, 0x000000070e800000| Untracked
| 44|0x000000070ea00000, 0x000000070ea00000, 0x000000070ec00000| 0%| F| |TAMS 0x000000070ea00000, 0x000000070ea00000| Untracked
| 45|0x000000070ec00000, 0x000000070ec00000, 0x000000070ee00000| 0%| F| |TAMS 0x000000070ec00000, 0x000000070ec00000| Untracked
| 46|0x000000070ee00000, 0x000000070ee00000, 0x000000070f000000| 0%| F| |TAMS 0x000000070ee00000, 0x000000070ee00000| Untracked
| 47|0x000000070f000000, 0x000000070f000000, 0x000000070f200000| 0%| F| |TAMS 0x000000070f000000, 0x000000070f000000| Untracked
| 48|0x000000070f200000, 0x000000070f200000, 0x000000070f400000| 0%| F| |TAMS 0x000000070f200000, 0x000000070f200000| Untracked
| 49|0x000000070f400000, 0x000000070f400000, 0x000000070f600000| 0%| F| |TAMS 0x000000070f400000, 0x000000070f400000| Untracked
| 50|0x000000070f600000, 0x000000070f600000, 0x000000070f800000| 0%| F| |TAMS 0x000000070f600000, 0x000000070f600000| Untracked
| 51|0x000000070f800000, 0x000000070f800000, 0x000000070fa00000| 0%| F| |TAMS 0x000000070f800000, 0x000000070f800000| Untracked
| 52|0x000000070fa00000, 0x000000070fa00000, 0x000000070fc00000| 0%| F| |TAMS 0x000000070fa00000, 0x000000070fa00000| Untracked
| 53|0x000000070fc00000, 0x000000070fc00000, 0x000000070fe00000| 0%| F| |TAMS 0x000000070fc00000, 0x000000070fc00000| Untracked
| 54|0x000000070fe00000, 0x000000070fe00000, 0x0000000710000000| 0%| F| |TAMS 0x000000070fe00000, 0x000000070fe00000| Untracked
| 55|0x0000000710000000, 0x0000000710100000, 0x0000000710200000| 50%| E| |TAMS 0x0000000710000000, 0x0000000710000000| Complete
| 56|0x0000000710200000, 0x0000000710400000, 0x0000000710400000|100%| E|CS|TAMS 0x0000000710200000, 0x0000000710200000| Complete
| 57|0x0000000710400000, 0x0000000710600000, 0x0000000710600000|100%| E|CS|TAMS 0x0000000710400000, 0x0000000710400000| Complete
| 58|0x0000000710600000, 0x0000000710800000, 0x0000000710800000|100%| E|CS|TAMS 0x0000000710600000, 0x0000000710600000| Complete
| 59|0x0000000710800000, 0x0000000710a00000, 0x0000000710a00000|100%| E|CS|TAMS 0x0000000710800000, 0x0000000710800000| Complete
| 60|0x0000000710a00000, 0x0000000710c00000, 0x0000000710c00000|100%| E|CS|TAMS 0x0000000710a00000, 0x0000000710a00000| Complete
| 96|0x0000000715200000, 0x0000000715400000, 0x0000000715400000|100%| E|CS|TAMS 0x0000000715200000, 0x0000000715200000| Complete
| 97|0x0000000715400000, 0x0000000715600000, 0x0000000715600000|100%| E|CS|TAMS 0x0000000715400000, 0x0000000715400000| Complete
| 98|0x0000000715600000, 0x0000000715800000, 0x0000000715800000|100%| E|CS|TAMS 0x0000000715600000, 0x0000000715600000| Complete
| 123|0x0000000718800000, 0x0000000718a00000, 0x0000000718a00000|100%| E|CS|TAMS 0x0000000718800000, 0x0000000718800000| Complete
Card table byte_map: [0x000002aafd660000,0x000002aafde20000] _byte_map_base: 0x000002aaf9e17000
Marking Bits (Prev, Next): (CMBitMap*) 0x000002aae3f7ca00, (CMBitMap*) 0x000002aae3f7ca40
Prev Bits: [0x000002aa80000000, 0x000002aa83db8000)
Next Bits: [0x000002aa83dc0000, 0x000002aa87b78000)
Polling page: 0x000002aae3d30000
Metaspace:
Usage:
Non-class: 48.16 MB used.
Class: 6.46 MB used.
Both: 54.62 MB used.
Virtual space:
Non-class space: 64.00 MB reserved, 48.50 MB ( 76%) committed, 1 nodes.
Class space: 1.00 GB reserved, 6.75 MB ( <1%) committed, 1 nodes.
Both: 1.06 GB reserved, 55.25 MB ( 5%) committed.
Chunk freelists:
Non-Class: 14.78 MB
Class: 9.27 MB
Both: 24.05 MB
MaxMetaspaceSize: unlimited
CompressedClassSpaceSize: 1.00 GB
Initial GC threshold: 21.00 MB
Current GC threshold: 58.75 MB
CDS: on
MetaspaceReclaimPolicy: balanced
- commit_granule_bytes: 65536.
- commit_granule_words: 8192.
- virtual_space_node_default_size: 8388608.
- enlarge_chunks_in_place: 1.
- new_chunks_are_fully_committed: 0.
- uncommit_free_chunks: 1.
- use_allocation_guard: 0.
- handle_deallocations: 1.
Internal statistics:
num_allocs_failed_limit: 6.
num_arena_births: 1018.
num_arena_deaths: 0.
num_vsnodes_births: 2.
num_vsnodes_deaths: 0.
num_space_committed: 881.
num_space_uncommitted: 0.
num_chunks_returned_to_freelist: 6.
num_chunks_taken_from_freelist: 3144.
num_chunk_merges: 6.
num_chunk_splits: 2012.
num_chunks_enlarged: 1305.
num_inconsistent_stats: 0.
CodeHeap 'non-profiled nmethods': size=120000Kb used=5058Kb max_used=5058Kb free=114941Kb
bounds [0x000002aaf4cf0000, 0x000002aaf51f0000, 0x000002aafc220000]
CodeHeap 'profiled nmethods': size=120000Kb used=20164Kb max_used=20164Kb free=99835Kb
bounds [0x000002aaed220000, 0x000002aaee5e0000, 0x000002aaf4750000]
CodeHeap 'non-nmethods': size=5760Kb used=1340Kb max_used=1443Kb free=4420Kb
bounds [0x000002aaf4750000, 0x000002aaf49c0000, 0x000002aaf4cf0000]
total_blobs=9607 nmethods=8939 adapters=579
compilation: enabled
stopped_count=0, restarted_count=0
full_count=0
Compilation events (20 events):
Event: 6.439 Thread 0x000002aa89ee1cd0 nmethod 13141 0x000002aaf51de410 code [0x000002aaf51de620, 0x000002aaf51df650]
Event: 6.440 Thread 0x000002aa89c056c0 13163 3 com.baomidou.mybatisplus.core.MybatisParameterHandler::populateKeys (138 bytes)
Event: 6.441 Thread 0x000002aa89ee1cd0 13165 4 org.h2.expression.Parameter::checkSet (38 bytes)
Event: 6.441 Thread 0x000002aa89c056c0 nmethod 13163 0x000002aaee5cb010 code [0x000002aaee5cb3e0, 0x000002aaee5ccfd8]
Event: 6.441 Thread 0x000002aa89ee1230 13166 4 org.h2.command.Parser::readTermWithIdentifier (1182 bytes)
Event: 6.441 Thread 0x000002aa89c056c0 13164 3 java.lang.reflect.Field::getFieldAccessor (35 bytes)
Event: 6.441 Thread 0x000002aa89ee1cd0 nmethod 13165 0x000002aaf51dff90 code [0x000002aaf51e0100, 0x000002aaf51e0198]
Event: 6.441 Thread 0x000002aa89ee1cd0 13167 4 org.h2.expression.condition.Comparison::setEvaluatable (26 bytes)
Event: 6.441 Thread 0x000002aa89c056c0 nmethod 13164 0x000002aaee5cda10 code [0x000002aaee5cdbc0, 0x000002aaee5cdda8]
Event: 6.442 Thread 0x000002aa89c056c0 13168 3 com.baomidou.mybatisplus.core.conditions.AbstractWrapper::formatParam (75 bytes)
Event: 6.442 Thread 0x000002aa89ee1cd0 nmethod 13167 0x000002aaf51e0290 code [0x000002aaf51e0420, 0x000002aaf51e0518]
Event: 6.443 Thread 0x000002aa89c056c0 nmethod 13168 0x000002aaee5cde90 code [0x000002aaee5ce180, 0x000002aaee5cee78]
Event: 6.443 Thread 0x000002aa89c056c0 13169 3 com.baomidou.mybatisplus.core.conditions.AbstractWrapper::getParamAlias (21 bytes)
Event: 6.443 Thread 0x000002aa89c056c0 nmethod 13169 0x000002aaee5cf390 code [0x000002aaee5cf540, 0x000002aaee5cf6f8]
Event: 6.445 Thread 0x000002aa89c056c0 13171 3 java.lang.invoke.MethodHandles$Lookup::findConstructor (61 bytes)
Event: 6.446 Thread 0x000002aa89c056c0 nmethod 13171 0x000002aaee5cf810 code [0x000002aaee5cfa80, 0x000002aaee5d0298]
Event: 6.446 Thread 0x000002aa89c056c0 13172 3 java.lang.invoke.MethodHandles$Lookup::getDirectConstructor (10 bytes)
Event: 6.446 Thread 0x000002aa89c056c0 nmethod 13172 0x000002aaee5d0610 code [0x000002aaee5d07a0, 0x000002aaee5d08e8]
Event: 6.446 Thread 0x000002aa89c056c0 13173 3 org.assertj.core.internal.Comparables::<init> (8 bytes)
Event: 6.446 Thread 0x000002aa89c056c0 nmethod 13173 0x000002aaee5d0990 code [0x000002aaee5d0b60, 0x000002aaee5d0ed8]
GC Heap History (20 events):
Event: 3.040 GC heap before
{Heap before GC invocations=8 (full 0):
garbage-first heap total 92160K, used 52720K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 18 young (36864K), 2 survivors (4096K)
Metaspace used 35522K, committed 35968K, reserved 1114112K
class space used 4588K, committed 4800K, reserved 1048576K
}
Event: 3.044 GC heap after
{Heap after GC invocations=9 (full 0):
garbage-first heap total 92160K, used 23421K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 35522K, committed 35968K, reserved 1114112K
class space used 4588K, committed 4800K, reserved 1048576K
}
Event: 3.405 GC heap before
{Heap before GC invocations=10 (full 0):
garbage-first heap total 92160K, used 66429K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 25 young (51200K), 3 survivors (6144K)
Metaspace used 38729K, committed 39168K, reserved 1114112K
class space used 4794K, committed 4992K, reserved 1048576K
}
Event: 3.410 GC heap after
{Heap after GC invocations=11 (full 0):
garbage-first heap total 92160K, used 25264K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 4 young (8192K), 4 survivors (8192K)
Metaspace used 38729K, committed 39168K, reserved 1114112K
class space used 4794K, committed 4992K, reserved 1048576K
}
Event: 3.723 GC heap before
{Heap before GC invocations=11 (full 0):
garbage-first heap total 92160K, used 68272K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 25 young (51200K), 4 survivors (8192K)
Metaspace used 39226K, committed 39744K, reserved 1114112K
class space used 4817K, committed 5056K, reserved 1048576K
}
Event: 3.732 GC heap after
{Heap after GC invocations=12 (full 0):
garbage-first heap total 92160K, used 26739K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 39226K, committed 39744K, reserved 1114112K
class space used 4817K, committed 5056K, reserved 1048576K
}
Event: 4.082 GC heap before
{Heap before GC invocations=12 (full 0):
garbage-first heap total 92160K, used 69747K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 24 young (49152K), 3 survivors (6144K)
Metaspace used 42999K, committed 43520K, reserved 1114112K
class space used 5259K, committed 5504K, reserved 1048576K
}
Event: 4.087 GC heap after
{Heap after GC invocations=13 (full 0):
garbage-first heap total 110592K, used 28496K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 2 young (4096K), 2 survivors (4096K)
Metaspace used 42999K, committed 43520K, reserved 1114112K
class space used 5259K, committed 5504K, reserved 1048576K
}
Event: 4.249 GC heap before
{Heap before GC invocations=13 (full 0):
garbage-first heap total 110592K, used 85840K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 30 young (61440K), 2 survivors (4096K)
Metaspace used 45557K, committed 46080K, reserved 1114112K
class space used 5599K, committed 5824K, reserved 1048576K
}
Event: 4.253 GC heap after
{Heap after GC invocations=14 (full 0):
garbage-first heap total 110592K, used 30098K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 45557K, committed 46080K, reserved 1114112K
class space used 5599K, committed 5824K, reserved 1048576K
}
Event: 5.026 GC heap before
{Heap before GC invocations=14 (full 0):
garbage-first heap total 110592K, used 85394K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 30 young (61440K), 3 survivors (6144K)
Metaspace used 52664K, committed 53184K, reserved 1114112K
class space used 6396K, committed 6656K, reserved 1048576K
}
Event: 5.032 GC heap after
{Heap after GC invocations=15 (full 0):
garbage-first heap total 110592K, used 33035K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 52664K, committed 53184K, reserved 1114112K
class space used 6396K, committed 6656K, reserved 1048576K
}
Event: 5.478 GC heap before
{Heap before GC invocations=15 (full 0):
garbage-first heap total 110592K, used 86283K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 29 young (59392K), 3 survivors (6144K)
Metaspace used 53810K, committed 54336K, reserved 1114112K
class space used 6454K, committed 6720K, reserved 1048576K
}
Event: 5.485 GC heap after
{Heap after GC invocations=16 (full 0):
garbage-first heap total 110592K, used 35407K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 53810K, committed 54336K, reserved 1114112K
class space used 6454K, committed 6720K, reserved 1048576K
}
Event: 5.763 GC heap before
{Heap before GC invocations=16 (full 0):
garbage-first heap total 110592K, used 84559K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 28 young (57344K), 3 survivors (6144K)
Metaspace used 54469K, committed 55040K, reserved 1114112K
class space used 6513K, committed 6784K, reserved 1048576K
}
Event: 5.769 GC heap after
{Heap after GC invocations=17 (full 0):
garbage-first heap total 110592K, used 35521K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 2 young (4096K), 2 survivors (4096K)
Metaspace used 54469K, committed 55040K, reserved 1114112K
class space used 6513K, committed 6784K, reserved 1048576K
}
Event: 6.027 GC heap before
{Heap before GC invocations=17 (full 0):
garbage-first heap total 110592K, used 84673K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 27 young (55296K), 2 survivors (4096K)
Metaspace used 54940K, committed 55552K, reserved 1114112K
class space used 6558K, committed 6848K, reserved 1048576K
}
Event: 6.031 GC heap after
{Heap after GC invocations=18 (full 0):
garbage-first heap total 133120K, used 36951K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 3 young (6144K), 3 survivors (6144K)
Metaspace used 54940K, committed 55552K, reserved 1114112K
class space used 6558K, committed 6848K, reserved 1048576K
}
Event: 6.371 GC heap before
{Heap before GC invocations=18 (full 0):
garbage-first heap total 133120K, used 106583K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 37 young (75776K), 3 survivors (6144K)
Metaspace used 55761K, committed 56384K, reserved 1114112K
class space used 6597K, committed 6912K, reserved 1048576K
}
Event: 6.376 GC heap after
{Heap after GC invocations=19 (full 0):
garbage-first heap total 133120K, used 38674K [0x0000000709200000, 0x0000000800000000)
region size 2048K, 4 young (8192K), 4 survivors (8192K)
Metaspace used 55761K, committed 56384K, reserved 1114112K
class space used 6597K, committed 6912K, reserved 1048576K
}
Dll operation events (16 events):
Event: 0.004 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\java.dll
Event: 0.016 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\jsvml.dll
Event: 0.040 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\net.dll
Event: 0.041 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\nio.dll
Event: 0.043 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\zip.dll
Event: 0.087 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\management.dll
Event: 0.089 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\management_ext.dll
Event: 0.101 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\jimage.dll
Event: 1.338 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\verify.dll
Event: 1.352 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\attach.dll
Event: 1.367 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\instrument.dll
Event: 1.367 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\zip.dll
Event: 1.368 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\instrument.dll
Event: 4.322 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\awt.dll
Event: 4.328 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\freetype.dll
Event: 4.328 Loaded shared library C:\Users\Administrator\.jdks\corretto-17.0.13\bin\fontmanager.dll
Deoptimization events (20 events):
Event: 6.310 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaf506b068 sp=0x000000d4b54f8f40
Event: 6.310 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a69a3 sp=0x000000d4b54f8f00 mode 2
Event: 6.386 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaedc8805f sp=0x000000d4b54fc800
Event: 6.386 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a7143 sp=0x000000d4b54fbc88 mode 0
Event: 6.427 Thread 0x000002aae3e5e970 Uncommon trap: trap_request=0xffffffbe fr.pc=0x000002aaf51db5a8 relative=0x0000000000000288
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: reason=profile_predicate action=maybe_recompile pc=0x000002aaf51db5a8 method=java.util.HashMap.keysToArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 36 c2
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaf51db5a8 sp=0x000000d4b54fbb80
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a69a3 sp=0x000000d4b54fbb10 mode 2
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: trap_request=0xffffffbe fr.pc=0x000002aaf51db5a8 relative=0x0000000000000288
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: reason=profile_predicate action=maybe_recompile pc=0x000002aaf51db5a8 method=java.util.HashMap.keysToArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 36 c2
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaf51db5a8 sp=0x000000d4b54fb2b0
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a69a3 sp=0x000000d4b54fb250 mode 2
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: trap_request=0xffffffbe fr.pc=0x000002aaf51db5a8 relative=0x0000000000000288
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: reason=profile_predicate action=maybe_recompile pc=0x000002aaf51db5a8 method=java.util.HashMap.keysToArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 36 c2
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaf51db5a8 sp=0x000000d4b54fb2b0
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a69a3 sp=0x000000d4b54fb250 mode 2
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: trap_request=0xffffffbe fr.pc=0x000002aaf51db5a8 relative=0x0000000000000288
Event: 6.428 Thread 0x000002aae3e5e970 Uncommon trap: reason=profile_predicate action=maybe_recompile pc=0x000002aaf51db5a8 method=java.util.HashMap.keysToArray([Ljava/lang/Object;)[Ljava/lang/Object; @ 36 c2
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT PACKING pc=0x000002aaf51db5a8 sp=0x000000d4b54fb800
Event: 6.428 Thread 0x000002aae3e5e970 DEOPT UNPACKING pc=0x000002aaf47a69a3 sp=0x000000d4b54fb790 mode 2
Classes loaded (20 events):
Event: 6.436 Loading class com/crm/base/domain/exception/BusinessErrorException
Event: 6.436 Loading class com/crm/base/domain/exception/BusinessErrorException done
Event: 6.444 Loading class org/assertj/core/api/iterable/ThrowingExtractor
Event: 6.444 Loading class org/assertj/core/api/iterable/ThrowingExtractor done
Event: 6.444 Loading class com/crm/customer/domain/entity/CustomerTeamMember
Event: 6.444 Loading class com/crm/customer/domain/entity/CustomerTeamMember done
Event: 6.444 Loading class com/crm/customer/domain/entity/Customer
Event: 6.444 Loading class com/crm/customer/domain/entity/Customer done
Event: 6.444 Loading class org/assertj/core/api/ThrowingConsumer
Event: 6.444 Loading class org/assertj/core/api/ThrowingConsumer done
Event: 6.445 Loading class com/crm/customer/domain/entity/Customer
Event: 6.445 Loading class com/crm/customer/domain/entity/Customer done
Event: 6.445 Loading class com/crm/customer/domain/entity/CustomerTeamMember
Event: 6.445 Loading class com/crm/customer/domain/entity/CustomerTeamMember done
Event: 6.445 Loading class org/assertj/core/error/UnsatisfiedRequirement
Event: 6.445 Loading class org/assertj/core/error/UnsatisfiedRequirement done
Event: 6.446 Loading class com/crm/customer/domain/dto/CustomerMemberDTO
Event: 6.446 Loading class com/crm/customer/domain/dto/CustomerMemberDTO done
Event: 6.447 Loading class com/baomidou/mybatisplus/core/toolkit/support/SFunction
Event: 6.447 Loading class com/baomidou/mybatisplus/core/toolkit/support/SFunction done
Classes unloaded (0 events):
No events
Classes redefined (12 events):
Event: 1.909 Thread 0x000002aaff2e8a30 redefined class name=com.crm.rule.service.ICustomerReminderRuleService, count=1
Event: 2.296 Thread 0x000002aaff2e8a30 redefined class name=com.crm.base.security.SecurityUtils, count=1
Event: 2.924 Thread 0x000002aaff2e8a30 redefined class name=com.baomidou.mybatisplus.extension.service.IService, count=1
Event: 2.924 Thread 0x000002aaff2e8a30 redefined class name=com.crm.auth.service.IAuthUserService, count=1
Event: 2.924 Thread 0x000002aaff2e8a30 redefined class name=com.crm.base.service.IBaseService, count=1
Event: 2.973 Thread 0x000002aaff2e8a30 redefined class name=com.crm.auth.service.ISysDeptService, count=1
Event: 3.006 Thread 0x000002aaff2e8a30 redefined class name=com.crm.dict.service.DictQueryService, count=1
Event: 3.061 Thread 0x000002aaff2e8a30 redefined class name=com.crm.dict.service.DictReferenceService, count=1
Event: 3.834 Thread 0x000002aaff2e8a30 redefined class name=com.crm.file.api.FileApi, count=1
Event: 5.689 Thread 0x000002aaff2e8a30 redefined class name=java.lang.Iterable, count=1
Event: 5.689 Thread 0x000002aaff2e8a30 redefined class name=org.springframework.beans.factory.ObjectProvider, count=1
Event: 5.689 Thread 0x000002aaff2e8a30 redefined class name=org.springframework.beans.factory.ObjectFactory, count=1
Internal exceptions (20 events):
Event: 4.322 Thread 0x000002aae3e5e970 Exception <a 'java/io/FileNotFoundException'{0x000000070f411290}> (0x000000070f411290)
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
Event: 4.323 Thread 0x000002aae3e5e970 Exception <a 'java/io/FileNotFoundException'{0x000000070f412ef0}> (0x000000070f412ef0)
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
Event: 4.334 Thread 0x000002aae3e5e970 Exception <a 'java/io/FileNotFoundException'{0x000000070f46c088}> (0x000000070f46c088)
thrown [s\src\hotspot\share\prims\jni.cpp, line 516]
Event: 4.420 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070ef13b28}: 'java.lang.Object java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(java.lang.Object, java.lang.Object, java.lang.Object, int, int)'> (0x000000070ef13b28)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.443 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070ed2a3f8}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x000000070ed2a3f8)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.445 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070ed62c80}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x000000070ed62c80)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.445 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070ed66938}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStaticInit(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x000000070ed66938)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.468 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070eb23058}: com/sun/org/apache/xalan/internal/xsltc/compiler/util/spi/ErrorMessagesProvider> (0x000000070eb23058)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.475 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070eb6b338}: com/sun/org/apache/xml/internal/serializer/spi/XMLEntitiesProvider> (0x000000070eb6b338)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.543 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070e6b3bb0}: 'long java.lang.invoke.DirectMethodHandle$Holder.invokeVirtual(java.lang.Object, java.lang.Object)'> (0x000000070e6b3bb0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.635 Thread 0x000002aae3e5e970 Implicit null exception at 0x000002aaf4f40509 to 0x000002aaf4f40650
Event: 4.635 Thread 0x000002aae3e5e970 Implicit null exception at 0x000002aaf4da32e4 to 0x000002aaf4da33f4
Event: 4.653 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070e3b16c0}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeInterface(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x000000070e3b16c0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 4.711 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070ddca978}: com/crm/customer/domain/excel/ContactImportTemplateRowBeanInfo> (0x000000070ddca978)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.711 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070ddd66c8}: com/crm/customer/domain/excel/ContactImportTemplateRowCustomizer> (0x000000070ddd66c8)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.712 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070ddeb3f8}: com/crm/customer/domain/excel/ContactImportTemplateRowBeanInfo> (0x000000070ddeb3f8)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.712 Thread 0x000002aae3e5e970 Exception <a 'java/lang/ClassNotFoundException'{0x000000070ddf7108}: com/crm/customer/domain/excel/ContactImportTemplateRowCustomizer> (0x000000070ddf7108)
thrown [s\src\hotspot\share\classfile\systemDictionary.cpp, line 256]
Event: 4.768 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x000000070d797bb0}: 'void java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(java.lang.Object, int, java.lang.Object)'> (0x000000070d797bb0)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 5.493 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x00000007188a8838}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeSpecialIFC(java.lang.Object, java.lang.Object, java.lang.Object)'> (0x00000007188a8838)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
Event: 5.494 Thread 0x000002aae3e5e970 Exception <a 'java/lang/NoSuchMethodError'{0x00000007188b6fd8}: 'int java.lang.invoke.DirectMethodHandle$Holder.invokeSpecialIFC(java.lang.Object, java.lang.Object, java.lang.Object, int)'> (0x00000007188b6fd8)
thrown [s\src\hotspot\share\interpreter\linkResolver.cpp, line 759]
VM Operations (20 events):
Event: 5.410 Executing VM operation: ICBufferFull
Event: 5.410 Executing VM operation: ICBufferFull done
Event: 5.465 Executing VM operation: HandshakeAllThreads
Event: 5.465 Executing VM operation: HandshakeAllThreads done
Event: 5.478 Executing VM operation: G1CollectForAllocation
Event: 5.485 Executing VM operation: G1CollectForAllocation done
Event: 5.496 Executing VM operation: HandshakeAllThreads
Event: 5.496 Executing VM operation: HandshakeAllThreads done
Event: 5.510 Executing VM operation: HandshakeAllThreads
Event: 5.510 Executing VM operation: HandshakeAllThreads done
Event: 5.679 Executing VM operation: RedefineClasses
Event: 5.703 Executing VM operation: RedefineClasses done
Event: 5.763 Executing VM operation: G1CollectForAllocation
Event: 5.769 Executing VM operation: G1CollectForAllocation done
Event: 5.829 Executing VM operation: HandshakeAllThreads
Event: 5.829 Executing VM operation: HandshakeAllThreads done
Event: 6.027 Executing VM operation: G1CollectForAllocation
Event: 6.031 Executing VM operation: G1CollectForAllocation done
Event: 6.371 Executing VM operation: G1CollectForAllocation
Event: 6.376 Executing VM operation: G1CollectForAllocation done
Memory protections (0 events):
No events
Nmethod flushes (20 events):
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaededda90
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedeef890
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedef0190
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedefc910
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedefe890
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf06410
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf24710
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf24b10
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf25010
Event: 5.517 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf25410
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf64810
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf76b10
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf77a10
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf96e10
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedf99310
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedfb1890
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaedfd1590
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaee004f90
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaee02ed10
Event: 5.518 Thread 0x000002aa89c19a80 flushing nmethod 0x000002aaee03da10
Events (20 events):
Event: 3.249 Thread 0x000002aae3e5e970 Thread added: 0x000002aad22849e0
Event: 3.255 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2285e20
Event: 3.260 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2286330
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2285400
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2283090
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad22835a0
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2285910
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2286840
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2283ab0
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2283fc0
Event: 3.361 Thread 0x000002aae3e5e970 Thread added: 0x000002aad22844d0
Event: 3.367 Thread 0x000002aad2283ab0 Thread exited: 0x000002aad2283ab0
Event: 3.367 Thread 0x000002aad2285910 Thread exited: 0x000002aad2285910
Event: 3.367 Thread 0x000002aad22835a0 Thread exited: 0x000002aad22835a0
Event: 3.367 Thread 0x000002aad22844d0 Thread exited: 0x000002aad22844d0
Event: 3.367 Thread 0x000002aad2283fc0 Thread exited: 0x000002aad2283fc0
Event: 3.367 Thread 0x000002aad2283090 Thread exited: 0x000002aad2283090
Event: 3.367 Thread 0x000002aad2286840 Thread exited: 0x000002aad2286840
Event: 3.367 Thread 0x000002aad2285400 Thread exited: 0x000002aad2285400
Event: 4.332 Thread 0x000002aae3e5e970 Thread added: 0x000002aad2285400
Dynamic libraries:
0x00007ff7f9820000 - 0x00007ff7f982e000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\java.exe
0x00007ffd9e270000 - 0x00007ffd9e468000 C:\Windows\SYSTEM32\ntdll.dll
0x00007ffd9c8e0000 - 0x00007ffd9c9a2000 C:\Windows\System32\KERNEL32.DLL
0x00007ffd9bca0000 - 0x00007ffd9bf96000 C:\Windows\System32\KERNELBASE.dll
0x00007ffd9b980000 - 0x00007ffd9ba80000 C:\Windows\System32\ucrtbase.dll
0x00007ffd7df70000 - 0x00007ffd7df8b000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\VCRUNTIME140.dll
0x00007ffd7df90000 - 0x00007ffd7dfa7000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\jli.dll
0x00007ffd9cbc0000 - 0x00007ffd9cd61000 C:\Windows\System32\USER32.dll
0x00007ffd869e0000 - 0x00007ffd86c7b000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256\COMCTL32.dll
0x00007ffd9bab0000 - 0x00007ffd9bad2000 C:\Windows\System32\win32u.dll
0x00007ffd9cb20000 - 0x00007ffd9cbbe000 C:\Windows\System32\msvcrt.dll
0x00007ffd9caf0000 - 0x00007ffd9cb1b000 C:\Windows\System32\GDI32.dll
0x00007ffd9bb80000 - 0x00007ffd9bc99000 C:\Windows\System32\gdi32full.dll
0x00007ffd9bae0000 - 0x00007ffd9bb7d000 C:\Windows\System32\msvcp_win.dll
0x00007ffd9c850000 - 0x00007ffd9c87f000 C:\Windows\System32\IMM32.DLL
0x00007ffd7d150000 - 0x00007ffd7d15c000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\vcruntime140_1.dll
0x00007ffd6a110000 - 0x00007ffd6a19d000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\msvcp140.dll
0x00007ffc33480000 - 0x00007ffc340ec000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\server\jvm.dll
0x00007ffd9c610000 - 0x00007ffd9c6c1000 C:\Windows\System32\ADVAPI32.dll
0x00007ffd9c290000 - 0x00007ffd9c32f000 C:\Windows\System32\sechost.dll
0x00007ffd9c6d0000 - 0x00007ffd9c7f0000 C:\Windows\System32\RPCRT4.dll
0x00007ffd9ba80000 - 0x00007ffd9baa7000 C:\Windows\System32\bcrypt.dll
0x00007ffd9ce20000 - 0x00007ffd9ce8b000 C:\Windows\System32\WS2_32.dll
0x00007ffd9b260000 - 0x00007ffd9b2ab000 C:\Windows\SYSTEM32\POWRPROF.dll
0x00007ffd91d50000 - 0x00007ffd91d5a000 C:\Windows\SYSTEM32\VERSION.dll
0x00007ffd91a40000 - 0x00007ffd91a67000 C:\Windows\SYSTEM32\WINMM.dll
0x00007ffd9b220000 - 0x00007ffd9b232000 C:\Windows\SYSTEM32\UMPDC.dll
0x00007ffd9a0d0000 - 0x00007ffd9a0e2000 C:\Windows\SYSTEM32\kernel.appcore.dll
0x00007ffd7c090000 - 0x00007ffd7c09a000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\jimage.dll
0x00007ffd99c10000 - 0x00007ffd99e11000 C:\Windows\SYSTEM32\DBGHELP.DLL
0x00007ffd8adf0000 - 0x00007ffd8ae24000 C:\Windows\SYSTEM32\dbgcore.DLL
0x00007ffd9bfa0000 - 0x00007ffd9c022000 C:\Windows\System32\bcryptPrimitives.dll
0x00007ffd6a0e0000 - 0x00007ffd6a105000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\java.dll
0x00007ffd1e940000 - 0x00007ffd1ea17000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\jsvml.dll
0x00007ffd9d9d0000 - 0x00007ffd9e140000 C:\Windows\System32\SHELL32.dll
0x00007ffd98af0000 - 0x00007ffd99295000 C:\Windows\SYSTEM32\windows.storage.dll
0x00007ffd9d5b0000 - 0x00007ffd9d904000 C:\Windows\System32\combase.dll
0x00007ffd9b1e0000 - 0x00007ffd9b20b000 C:\Windows\SYSTEM32\Wldp.dll
0x00007ffd9e140000 - 0x00007ffd9e20d000 C:\Windows\System32\OLEAUT32.dll
0x00007ffd9cd70000 - 0x00007ffd9ce1d000 C:\Windows\System32\SHCORE.dll
0x00007ffd9c7f0000 - 0x00007ffd9c84b000 C:\Windows\System32\shlwapi.dll
0x00007ffd9b830000 - 0x00007ffd9b854000 C:\Windows\SYSTEM32\profapi.dll
0x00007ffd7b960000 - 0x00007ffd7b979000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\net.dll
0x00007ffd97280000 - 0x00007ffd9738a000 C:\Windows\SYSTEM32\WINHTTP.dll
0x00007ffd9af50000 - 0x00007ffd9afba000 C:\Windows\system32\mswsock.dll
0x00007ffd6a0c0000 - 0x00007ffd6a0d6000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\nio.dll
0x00007ffd67bd0000 - 0x00007ffd67be8000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\zip.dll
0x00007ffd83080000 - 0x00007ffd83089000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\management.dll
0x00007ffd83070000 - 0x00007ffd8307b000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\management_ext.dll
0x00007ffd9ce90000 - 0x00007ffd9ce98000 C:\Windows\System32\PSAPI.DLL
0x00007ffd7eed0000 - 0x00007ffd7eee7000 C:\Windows\system32\napinsp.dll
0x00007ffd7eeb0000 - 0x00007ffd7eecb000 C:\Windows\system32\pnrpnsp.dll
0x00007ffd974c0000 - 0x00007ffd974dd000 C:\Windows\system32\wshbth.dll
0x00007ffd97390000 - 0x00007ffd973ad000 C:\Windows\system32\NLAapi.dll
0x00007ffd9ac50000 - 0x00007ffd9ac8b000 C:\Windows\SYSTEM32\IPHLPAPI.DLL
0x00007ffd9ac90000 - 0x00007ffd9ad5a000 C:\Windows\SYSTEM32\DNSAPI.dll
0x00007ffd9c330000 - 0x00007ffd9c338000 C:\Windows\System32\NSI.dll
0x00007ffd7ee90000 - 0x00007ffd7eea2000 C:\Windows\System32\winrnr.dll
0x00007ffd96460000 - 0x00007ffd9646a000 C:\Windows\System32\rasadhlp.dll
0x00007ffd95ef0000 - 0x00007ffd95f70000 C:\Windows\System32\fwpuclnt.dll
0x00007ffd96c80000 - 0x00007ffd96c97000 C:\Windows\SYSTEM32\dhcpcsvc6.DLL
0x00007ffd96c40000 - 0x00007ffd96c5d000 C:\Windows\SYSTEM32\dhcpcsvc.DLL
0x00007ffd75b90000 - 0x00007ffd75ba0000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\verify.dll
0x00007ffd83060000 - 0x00007ffd83069000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\attach.dll
0x00007ffd83050000 - 0x00007ffd8305e000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\instrument.dll
0x00007ffd9b240000 - 0x00007ffd9b258000 C:\Windows\SYSTEM32\CRYPTSP.dll
0x00007ffd9a890000 - 0x00007ffd9a8c8000 C:\Windows\system32\rsaenh.dll
0x00007ffd9b7b0000 - 0x00007ffd9b7de000 C:\Windows\SYSTEM32\USERENV.dll
0x00007ffd9b0e0000 - 0x00007ffd9b0ec000 C:\Windows\SYSTEM32\CRYPTBASE.dll
0x00007ffd17630000 - 0x00007ffd177c0000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\awt.dll
0x00007ffd95b80000 - 0x00007ffd95c14000 C:\Windows\SYSTEM32\apphelp.dll
0x00007ffd1b170000 - 0x00007ffd1b1f7000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\freetype.dll
0x00007ffcf0210000 - 0x00007ffcf02ea000 C:\Users\Administrator\.jdks\corretto-17.0.13\bin\fontmanager.dll
dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Users\Administrator\.jdks\corretto-17.0.13\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.6456_none_60b8a6cb71f64256;C:\Users\Administrator\.jdks\corretto-17.0.13\bin\server
VM Arguments:
jvm_args: -Djdk.attach.allowAttachSelf=true
java_command: C:\Users\Administrator\AppData\Local\Temp\surefire9953034798614190830\surefirebooter-20260910210118475_120.jar C:\Users\Administrator\AppData\Local\Temp\surefire9953034798614190830 2026-09-10T21-00-32_560-jvmRun1 surefire-20260910210118475_118tmp surefire_6-20260910210118475_119tmp
java_class_path (initial): C:\Users\Administrator\AppData\Local\Temp\surefire9953034798614190830\surefirebooter-20260910210118475_120.jar
Launcher Type: SUN_STANDARD
[Global flags]
intx CICompilerCount = 4 {product} {ergonomic}
uint ConcGCThreads = 3 {product} {ergonomic}
uint G1ConcRefinementThreads = 10 {product} {ergonomic}
size_t G1HeapRegionSize = 2097152 {product} {ergonomic}
uintx GCDrainStackTargetSize = 64 {product} {ergonomic}
size_t InitialHeapSize = 260046848 {product} {ergonomic}
size_t MarkStackSize = 4194304 {product} {ergonomic}
size_t MaxHeapSize = 4141875200 {product} {ergonomic}
size_t MaxNewSize = 2485125120 {product} {ergonomic}
size_t MinHeapDeltaBytes = 2097152 {product} {ergonomic}
size_t MinHeapSize = 8388608 {product} {ergonomic}
uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic}
uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
bool SegmentedCodeCache = true {product} {ergonomic}
size_t SoftMaxHeapSize = 4141875200 {manageable} {ergonomic}
bool UseCompressedClassPointers = true {product lp64_product} {ergonomic}
bool UseCompressedOops = true {product lp64_product} {ergonomic}
bool UseG1GC = true {product} {ergonomic}
bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic}
Logging:
Log output configuration:
#0: stdout all=warning uptime,level,tags
#1: stderr all=off uptime,level,tags
Environment Variables:
JAVA_HOME=C:\Users\Administrator\.jdks\corretto-17.0.13
PATH=C:\Users\Administrator\.jdks\corretto-17.0.13\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;D:\go\bin;G:\Git\cmd;G:\MongoDB\Server\8.0\bin;D:\protoc\bin;G:\΢ÐÅweb¿ª·¢Õß¹¤¾ß\dll;E:\;C:\Program Files\nodejs\;E:\ffmpeg-8.1.1-full_build\bin;D:\QoderCN\bin;C:\Users\Administrator\.kimi-code\bin;C:\Users\Administrator\AppData\Local\Programs\Python\Launcher\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;G:\Microsoft VS Code\bin;D:\protoc\bin;C:\Users\Administrator\AppData\Roaming\npm;E:\MiKTeX\miktex\bin\x64\;D:\Qoder IDE\bin
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=AMD64 Family 25 Model 80 Stepping 0, AuthenticAMD
TMP=C:\Users\ADMINI~1\AppData\Local\Temp
TEMP=C:\Users\ADMINI~1\AppData\Local\Temp
Periodic native trim disabled
--------------- S Y S T E M ---------------
OS:
Windows 10 , 64 bit Build 19041 (10.0.19041.5915)
OS uptime: 6 days 1:55 hours
Hyper-V role detected
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, hv
Processor Information for all 12 processors :
Max Mhz: 3901, Current Mhz: 3901, Mhz Limit: 3901
Memory: 4k page, system-wide physical 15799M (1158M free)
TotalPageFile size 28599M (AvailPageFile size 3M)
current process WorkingSet (physical memory assigned to process): 428M, peak: 428M
current process commit charge ("private bytes"): 479M, peak: 479M
vm_info: OpenJDK 64-Bit Server VM (17.0.13+11-LTS) for windows-amd64 JRE (17.0.13+11-LTS), built on Oct 10 2024 19:51:30 by "Administrator" with MS VC++ 16.10 / 16.11 (VS2019)
END.

5824
crm-customer/replay_pid24884.log

File diff suppressed because one or more lines are too long

5
crm-customer/src/main/java/com/crm/customer/domain/dto/CustomerListRowDTO.java

@ -92,4 +92,9 @@ public class CustomerListRowDTO {
@Schema(description = "最近访问时间(RECENT 视图排序锚点;非 RECENT 视图为 null)")
private LocalDateTime lastViewTime;
// -------- 通用列:关注标记(三 workspace 共用,2026-09-10 前端反馈补列) --------
@Schema(description = "是否关注(customer_focus 行存在=1;0=未关注)")
private Integer focusFlag;
}

2
crm-customer/src/main/java/com/crm/customer/domain/entity/CustomerOplog.java

@ -34,7 +34,7 @@ public class CustomerOplog extends BaseEntity {
@Column(columnDefinition = "bigint not null comment '所属客户ID'")
private Long customerId;
@Comment("动作类型:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE")
@Comment("动作类型:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE/CONTACT_ADD/CONTACT_EDIT/CONTACT_DELETE/AGREEMENT_ADD/AGREEMENT_EDIT/AGREEMENT_DELETE(与 CustomerConstants 全部 ACTION_* 常量对齐)")
@Column(columnDefinition = "varchar(50) not null comment '动作类型'")
private String action;

6
crm-customer/src/main/java/com/crm/customer/domain/param/OplogPageParam.java

@ -22,7 +22,9 @@ public class OplogPageParam extends BaseParam {
@Schema(description = "操作时间范围止(含)")
private LocalDateTime endTime;
@Schema(description = "操作类型筛选(action 值域:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/"
+ "TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE)")
@Schema(description = "操作类型筛选(action 值域与 CustomerConstants 全部 ACTION_* 常量一致:CREATE/UPDATE/FOLLOW/ARCHIVE/RESTORE/"
+ "TRANSFER/CLAIM/POOL/STAGE_CHANGE/MEMBER_ADD/MEMBER_REMOVE/"
+ "CONTACT_ADD/CONTACT_EDIT/CONTACT_DELETE/"
+ "AGREEMENT_ADD/AGREEMENT_EDIT/AGREEMENT_DELETE;权威清单见 API-SUMMARY §3)")
private String action;
}

7
crm-customer/src/main/java/com/crm/customer/mapper/CustomerMapper.java

@ -239,6 +239,9 @@ public interface CustomerMapper extends CrmBaseMapper<Customer> {
* {@link #WORKSPACE_COMMON_FILTERS}单一事实源boardSummary 同款拼接
* 新增筛选字段加进常量即列表/看板同时生效</p>
*
* <p>focus_flag = 行级是否关注标量子查询customer_focus 行存在=1 workspace
* 通用2026-09-10 前端反馈补列API-SUMMARY §2.1 同步</p>
*
* <p>opportunity_count = 标量子查询跨模块计数issues-03 §D 共用列关联业务 12 对齐回补
* Maven 依赖只能 opportunitycustomer故不走 Port 而在 SQL 层物理耦合同库表计数走
* <b>opportunity_customer 真源 join</b>对称 OpportunityMapper.pageByCustomer 口径
@ -257,6 +260,8 @@ public interface CustomerMapper extends CrmBaseMapper<Customer> {
c.customer_stage, c.customer_star_level, c.relation_star_level,
c.strategic_agreement_level, c.vip_customer_level,
c.last_valid_follow_time,
(SELECT COUNT(*) FROM customer_focus f
WHERE f.customer_id = c.id AND f.user_id = #{q.userId}) AS focus_flag,
(SELECT COUNT(*) FROM opportunity_customer oc
JOIN opportunity o ON o.id = oc.opportunity_id
WHERE oc.customer_id = c.id AND oc.delete_key = 0
@ -279,6 +284,8 @@ public interface CustomerMapper extends CrmBaseMapper<Customer> {
c.customer_stage, c.customer_star_level, c.relation_star_level,
c.strategic_agreement_level, c.vip_customer_level,
c.last_valid_follow_time,
(SELECT COUNT(*) FROM customer_focus f
WHERE f.customer_id = c.id AND f.user_id = #{q.userId}) AS focus_flag,
(SELECT COUNT(*) FROM opportunity_customer oc
JOIN opportunity o ON o.id = oc.opportunity_id
WHERE oc.customer_id = c.id AND oc.delete_key = 0

25
crm-customer/src/main/java/com/crm/customer/port/impl/NoopProjectOwnerSyncPortImpl.java

@ -1,25 +0,0 @@
package com.crm.customer.port.impl;
import com.crm.customer.port.ProjectOwnerSyncPort;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 项目 owner 同步 no-op 默认实现 07 seamA5 项目模块未建
*
* <p>交割/分配流程调用时静默跳过并返回 0项目模块落地后由其实现 Bean
* 替换本类issues-08 §Cport 契约占位实现时项目侧接入</p>
*/
@Slf4j
@Component
public class NoopProjectOwnerSyncPortImpl implements ProjectOwnerSyncPort {
public NoopProjectOwnerSyncPortImpl() {
log.info("ProjectOwnerSyncPort no-op 默认实现已装配(A5 项目模块未建,owner 同步跳过)");
}
@Override
public int syncOwnerByCustomer(Long customerId, Long newOwnerId) {
return 0;
}
}

21
crm-customer/src/main/java/com/crm/customer/service/impl/CustomerImportAnalyzer.java

@ -29,7 +29,9 @@ import java.util.Set;
* 分别命中不同客户 该行冲突禁止导入文件内多行匹配同一客户 duplicateStrategy
* 处置旧图 D24 / a4-3-2 复选框默认 SKIP 重复组全部失败OVERWRITE 覆盖导入 =
* 自上而下最后一条通过校验的行生效其余标失败说明未执行均未匹配 不凭名称
* 自动覆盖UPSERT 下名称相似列疑似重复不写入对称票 02 查重口径策略不影响 SUSPECT</p>
* 自动覆盖UPSERT 下名称相似列疑似重复不写入对称票 02 查重口径策略不影响 SUSPECT
* INSERT 行必填前移defectfix §.2 收口类型///行业/星级执行期写 NOT NULL
* 缺省行预检即 FAIL保证预计数与执行同口径UPDATE 行部分更新SUSPECT 行不写入不受限</p>
*
* <p>联系人D26 翻案后电话命中本客户 更新命中他客户 照常导入 +
* 疑似重复软提示跟随查重设置联系电话开关电话空 客户+姓名+职务
@ -137,7 +139,22 @@ public class CustomerImportAnalyzer {
p.setVerdict(VERDICT_SUSPECT);
p.setReason("疑似重复:客户名称与已有客户相似,本次不写入,请走新增/编辑人工确认");
} else {
p.setVerdict(VERDICT_INSERT);
// 必填前移(defectfix §九.2 收口):INSERT 行执行期对类型/省/市/行业/星级
// 写 NOT NULL 列(D-05 家族只补了 isBizNegotiated/relationStarLevel),
// 缺省行预检即 FAIL,避免 preview 计 insert、执行期才 SQL 失败
if (isBlank(r.getCustomerType())) {
fail(p, "客户类型必填", "customerType");
} else if (isBlank(r.getProvinceCode())) {
fail(p, "省份编码必填", "provinceCode");
} else if (isBlank(r.getCityCode())) {
fail(p, "城市编码必填", "cityCode");
} else if (isBlank(r.getIndustryCode())) {
fail(p, "行业编码必填", "industryCode");
} else if (isBlank(r.getCustomerStarLevel())) {
fail(p, "客户星级必填", "customerStarLevel");
} else {
p.setVerdict(VERDICT_INSERT);
}
}
}

39
crm-customer/src/test/java/com/crm/customer/service/impl/CustomerImportIntegrationTest.java

@ -81,7 +81,7 @@ import static org.mockito.Mockito.when;
* <p>对齐票 07 测试范式真实 SQL 链路customer / customer_contact /
* customer_import_task / customer_import_fail / oplog+ mock auth crm-file
* Executor self 代理 直填依赖直调@Async 无代理时天然同步 flaky
* 覆盖模板表头校验拒绝 / 三模式判定issues-09 §B/ 编号与信用代码冲突 /
* 覆盖模板表头校验拒绝 / 三模式判定issues-09 §B/ INSERT 行必填预检defectfix §.2/ 编号与信用代码冲突 /
* 文件内重复组全失败Q14/ 更新空白不改值与值相同计 unchanged / 联系人 D26
* 四规则 / 联系人失败不回滚主记录 / DRAFTRUNNINGDONE 状态机 + 重复 confirm
* 67014 / page 仅本人任务 / E2E 新增落库口径负责人快照 + 潜在阶段 + KH 续号</p>
@ -471,6 +471,29 @@ class CustomerImportIntegrationTest {
List.of(), CustomerConstants.IMPORT_MODE_UPSERT, "MERGE"), 67013);
}
@Test
@DisplayName("upload:INSERT 行类型/省/市/行业/星级缺省 → 预检即 FAIL(必填前移 defectfix §九.2);UPDATE 行部分列不受限")
void upload_insertRowMissingRequiredColumns_failsInPreview() {
newCust("KH0001", "已存在客户", null, null, 3);
ImportPreviewDTO preview = uploadStandard(
rowsOf(
row(null, "缺类型客户", null, null, null, null, null, null, null),
row(null, "缺省份客户", "TYPE_A", null, null, null, null, null, null),
row(null, "缺城市客户", "TYPE_A", null, "310000", null, null, null, null),
row(null, "缺行业客户", "TYPE_A", null, "310000", "310100", null, null, null),
row(null, "缺星级客户", "TYPE_A", null, "310000", "310100", "I", null, null),
// UPDATE 行 = 部分更新语义:类型/省/市/行业缺省不改值 → 仍判 UPDATE
row("KH0001", "已存在客户", null, null, null, null, null, null, null)),
List.of(), CustomerConstants.IMPORT_MODE_UPSERT);
assertThat(preview.getInsertCount()).isZero();
assertThat(preview.getUpdateCount()).isEqualTo(1);
assertThat(preview.getRows()).extracting(ImportPreviewDTO.Row::getReason)
.contains("客户类型必填", "省份编码必填", "城市编码必填", "行业编码必填", "客户星级必填");
assertThat(preview.getRows()).extracting(ImportPreviewDTO.Row::getVerdict)
.containsOnly(CustomerImportAnalyzer.VERDICT_FAIL, CustomerImportAnalyzer.VERDICT_UPDATE);
}
// ==================== 更新语义(issues-09 §C) ====================
@Test
@ -543,7 +566,7 @@ class CustomerImportIntegrationTest {
newContact(b.getId(), "乙联系人", "13800000002", "经理", 0);
ImportPreviewDTO preview = uploadStandard(
rowsOf(row("KH0003", "新客户丙", null, null, null, null, null, null, null)),
rowsOf(row("KH0003", "新客户丙", "TYPE_A", null, "310000", "310100", "I", "3", null)),
rowsOf(row("KH0003", "李四", "13800000002", "经理", "否")),
CustomerConstants.IMPORT_MODE_UPSERT);
@ -592,7 +615,7 @@ class CustomerImportIntegrationTest {
@DisplayName("联系人:同文件同客户同电话两行 → 该两行 FAIL(表单级)")
void contact_samePhoneTwiceInFile_failsBoth() {
ImportPreviewDTO preview = uploadStandard(
rowsOf(row("KH0003", "新客户丙", null, null, null, null, null, null, null)),
rowsOf(row("KH0003", "新客户丙", "TYPE_A", null, "310000", "310100", "I", "3", null)),
rowsOf(
row("KH0003", "王五", "13800000004", "经理", "否"),
row("KH0003", "王五二", "13800000004", "总监", "否")),
@ -613,7 +636,7 @@ class CustomerImportIntegrationTest {
@DisplayName("联系人失败不回滚客户主记录(原子单元 = 单条)")
void contact_failureDoesNotRollbackCustomer() {
ImportPreviewDTO preview = uploadStandard(
rowsOf(row("KH0003", "新客户丙", null, null, null, null, null, null, null)),
rowsOf(row("KH0003", "新客户丙", "TYPE_A", null, "310000", "310100", "I", "3", null)),
rowsOf(row("KH9999", "赵六", "13800000005", "经理", "否")),
CustomerConstants.IMPORT_MODE_UPSERT);
assertThat(preview.getFailCount()).isZero(); // 预览 failCount 只聚合客户 sheet;联系人失败在明细行
@ -641,7 +664,7 @@ class CustomerImportIntegrationTest {
@Test
@DisplayName("confirm:DRAFT→RUNNING→DONE + finishTime;重复 confirm 67014")
void confirm_stateMachineAndReconfirmBlocked() {
uploadStandard(rowsOf(row(null, "新客户甲", null, null, null, null, null, null, null)),
uploadStandard(rowsOf(row(null, "新客户甲", "TYPE_A", null, "310000", "310100", "I", "3", null)),
List.of(), CustomerConstants.IMPORT_MODE_UPSERT);
Long taskId = singleTaskId();
@ -661,13 +684,13 @@ class CustomerImportIntegrationTest {
@Test
@DisplayName("page:仅当前用户任务可见(issues-09 §D 最近导入记录)")
void page_onlyOwnTasks() {
uploadStandard(rowsOf(row(null, "我的客户一", null, null, null, null, null, null, null)),
uploadStandard(rowsOf(row(null, "我的客户一", "TYPE_A", null, "310000", "310100", "I", "3", null)),
List.of(), CustomerConstants.IMPORT_MODE_UPSERT);
uploadStandard(rowsOf(row(null, "我的客户二", null, null, null, null, null, null, null)),
uploadStandard(rowsOf(row(null, "我的客户二", "TYPE_A", null, "310000", "310100", "I", "3", null)),
List.of(), CustomerConstants.IMPORT_MODE_APPEND_ONLY);
mockLogin(OTHER_ID);
uploadStandard(rowsOf(row(null, "他人客户", null, null, null, null, null, null, null)),
uploadStandard(rowsOf(row(null, "他人客户", "TYPE_A", null, "310000", "310100", "I", "3", null)),
List.of(), CustomerConstants.IMPORT_MODE_UPSERT);
mockLogin(ME_ID);

21
crm-customer/src/test/java/com/crm/customer/service/impl/CustomerWorkspaceOwnershipIntegrationTest.java

@ -279,6 +279,27 @@ class CustomerWorkspaceOwnershipIntegrationTest {
assertThat(names(pagePool("RECENT"))).containsExactly("公海甲", "公海乙");
}
@Test
@DisplayName("行级 focus_flag:customer_focus 行存在=1 未关注=0(三 workspace 同列出参)")
void listRows_carryFocusFlag() {
Customer m1 = newCust("关注客户甲", OPERATOR_ID, DEPT_ID, 1, 1);
Customer m2 = newCust("未关注客户乙", OPERATOR_ID, DEPT_ID, 1, 1);
Customer p1 = newCust("公海甲", null, DEPT_ID, 1, 1);
focus(m1.getId(), OPERATOR_ID);
focus(p1.getId(), OPERATOR_ID);
PageResult<CustomerListRowDTO> mine = pageMine(null);
CustomerListRowDTO focused = mine.getContent().stream()
.filter(r -> r.getId().equals(m1.getId())).findFirst().orElseThrow();
CustomerListRowDTO unfocused = mine.getContent().stream()
.filter(r -> r.getId().equals(m2.getId())).findFirst().orElseThrow();
CustomerListRowDTO poolRow = poolPage().getContent().stream()
.filter(r -> r.getId().equals(p1.getId())).findFirst().orElseThrow();
assertThat(focused.getFocusFlag()).isEqualTo(1);
assertThat(unfocused.getFocusFlag()).isEqualTo(0);
assertThat(poolRow.getFocusFlag()).isEqualTo(1);
}
@Test
@DisplayName("overview 排除公海;看板 summary 分组 count + cards 单列取卡同口径")
void overview_and_board() {

29
crm-opportunity/src/main/java/com/crm/opportunity/service/impl/ProjectUserTransferPortImpl.java

@ -1,29 +0,0 @@
package com.crm.opportunity.service.impl;
import com.crm.auth.service.IAuthUserService;
import com.crm.opportunity.domain.enums.OpportunityStatus;
import com.crm.opportunity.mapper.OpportunityMapper;
import org.springframework.stereotype.Component;
/**
* 项目域用户移交实现A7-1 用户管理名下已转项目商机{@code opp_status} = 5
* {@link OpportunityStatus#STATUS_CONVERTED}项目与商机同表分域 07 定案
* 共享逻辑见 {@link AbstractOpportunityUserTransferPort}
*/
@Component
public class ProjectUserTransferPortImpl extends AbstractOpportunityUserTransferPort {
public ProjectUserTransferPortImpl(OpportunityMapper oppMapper, IAuthUserService authUserService) {
super(oppMapper, authUserService);
}
@Override
public String domain() {
return "project";
}
@Override
protected Integer statusFilter() {
return OpportunityStatus.STATUS_CONVERTED.getValue();
}
}

50
crm-project/src/main/java/com/crm/project/port/inbound/impl/ProjectOwnerSyncPortImpl.java

@ -0,0 +1,50 @@
package com.crm.project.port.inbound.impl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.service.IAuthUserService;
import com.crm.base.domain.exception.BusinessErrorException;
import com.crm.customer.port.ProjectOwnerSyncPort;
import com.crm.project.constant.ProjectConstants;
import com.crm.project.domain.entity.CrmProject;
import com.crm.project.mapper.CrmProjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
/**
* {@link ProjectOwnerSyncPort} 真实现 12Noop 退役
*
* <p>客户换负责人 {@code crm_project.customer_id} 命中项目批量刷 owner 三列
* owner_user_id / owner_name_snapshot / owner_dept_id返回实际影响行数
* crm-customer 交割/移交流记数接收人缺失抛业务异常调用方事务回滚对称
* {@code OpportunityOwnerSyncPortImpl} 口径</p>
*/
@Slf4j
@Primary
@Component
@RequiredArgsConstructor
public class ProjectOwnerSyncPortImpl implements ProjectOwnerSyncPort {
private final CrmProjectMapper projectMapper;
private final IAuthUserService authUserService;
@Override
public int syncOwnerByCustomer(Long customerId, Long newOwnerId) {
AuthUser receiver = authUserService.getById(newOwnerId);
if (receiver == null) {
throw new BusinessErrorException(ProjectConstants.CODE_PROJECT_INVALID,
"项目 owner 同步接收人不存在");
}
int updated = projectMapper.update(null, new LambdaUpdateWrapper<CrmProject>()
.eq(CrmProject::getCustomerId, customerId)
.set(CrmProject::getOwnerUserId, newOwnerId)
.set(CrmProject::getOwnerNameSnapshot, receiver.getUsername())
.set(CrmProject::getOwnerDeptId, receiver.getDeptId()));
if (updated > 0) {
log.info("[project-owner-sync] 客户 {} 换负责人 → 项目 owner 同步 {} 行", customerId, updated);
}
return updated;
}
}

55
crm-project/src/main/java/com/crm/project/transfer/ProjectUserTransferPortImpl.java

@ -0,0 +1,55 @@
package com.crm.project.transfer;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.service.IAuthUserService;
import com.crm.base.domain.exception.BusinessErrorException;
import com.crm.base.service.UserTransferPort;
import com.crm.project.constant.ProjectConstants;
import com.crm.project.domain.entity.CrmProject;
import com.crm.project.mapper.CrmProjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* 项目域用户移交实现A7-1 用户管理 12spec §5 移交 Port 迁移
*
* <p>路线甲独立 {@code crm_project} 落地 crm-opportunity 侧的共表子类
* {@code opp_status=5} 切域已删除**断开 extends迁入本模块**重写为查
* {@code crm_project} owner 三列owner_user_id / owner_name_snapshot /
* owner_dept_id{@code domain()="project"} 不变crm-auth
* {@code UserTransferService} Spring 多态注册表{@code ObjectProvider<UserTransferPort>}
* 自动重挂**零改动**</p>
*/
@Component
@RequiredArgsConstructor
public class ProjectUserTransferPortImpl implements UserTransferPort {
private final CrmProjectMapper projectMapper;
private final IAuthUserService authUserService;
@Override
public String domain() {
return "project";
}
@Override
public long countOwned(Long userId) {
return projectMapper.selectCount(new LambdaQueryWrapper<CrmProject>()
.eq(CrmProject::getOwnerUserId, userId));
}
@Override
public int transferOwned(Long fromUserId, Long toUserId) {
AuthUser receiver = authUserService.getById(toUserId);
if (receiver == null) {
throw new BusinessErrorException(ProjectConstants.CODE_PROJECT_INVALID, "移交接收人不存在");
}
return projectMapper.update(null, new LambdaUpdateWrapper<CrmProject>()
.eq(CrmProject::getOwnerUserId, fromUserId)
.set(CrmProject::getOwnerUserId, toUserId)
.set(CrmProject::getOwnerNameSnapshot, receiver.getUsername())
.set(CrmProject::getOwnerDeptId, receiver.getDeptId()));
}
}

221
crm-project/src/test/java/com/crm/project/transfer/ProjectSeamsH2IntegrationTest.java

@ -0,0 +1,221 @@
package com.crm.project.transfer;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.service.IAuthUserService;
import com.crm.base.config.MetaObjectFillHandler;
import com.crm.base.domain.exception.BusinessErrorException;
import com.crm.base.service.UserTransferPort;
import com.crm.customer.port.ProjectOwnerSyncPort;
import com.crm.project.constant.ProjectConstants;
import com.crm.project.domain.entity.CrmProject;
import com.crm.project.mapper.CrmProjectMapper;
import com.crm.project.port.inbound.impl.ProjectOwnerSyncPortImpl;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.LocalCacheScope;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.sql.Connection;
import java.sql.Statement;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* 移交/同步接缝 H2 集成测试 12
*
* <p>断言点对齐票面</p>
* <ul>
* <li>项目域移交 crm_project owner 三列domain()="project"crm-auth 多态注册表 key
* 与商机域crm-opportunity OpportunityUserTransferPortImpl opportunity 互不串扰</li>
* <li>crm-auth 零改动domain() 返回值即 crm-auth UserTransferService DOMAIN_NAMES
* "project" 本测试钉死契约值注册表自动重挂由 Spring 容器装配保证</li>
* <li>ProjectOwnerSyncPort 真实现customer_id 命中批量刷 owner返回真实影响行数Noop 0 已退役</li>
* </ul>
*/
@DisplayName("移交/同步接缝(H2 集成,票 12)")
class ProjectSeamsH2IntegrationTest {
private static final Long ALICE = 7101L;
private static final Long BOB = 7102L;
private static final Long CUSTOMER_A = 8001L;
private static final Long CUSTOMER_B = 8002L;
private static final AtomicBoolean BOOTSTRAPPED = new AtomicBoolean(false);
private static SqlSessionFactory sqlSessionFactory;
private SqlSession session;
private CrmProjectMapper projectMapper;
private ProjectUserTransferPortImpl transferPort;
private ProjectOwnerSyncPortImpl ownerSyncPort;
@BeforeAll
static void bootstrap() throws Exception {
if (!BOOTSTRAPPED.compareAndSet(false, true)) {
return;
}
JdbcDataSource ds = new JdbcDataSource();
ds.setURL("jdbc:h2:mem:projseams;MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;"
+ "DB_CLOSE_DELAY=-1");
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setEnvironment(new Environment("projseams-test", new JdbcTransactionFactory(), ds));
configuration.setMapUnderscoreToCamelCase(true);
configuration.setLocalCacheScope(LocalCacheScope.STATEMENT);
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
configuration.addInterceptor(mpInterceptor);
GlobalConfigUtils.getGlobalConfig(configuration).setMetaObjectHandler(new MetaObjectFillHandler());
GlobalConfigUtils.getGlobalConfig(configuration)
.setIdentifierGenerator(DefaultIdentifierGenerator.getInstance());
configuration.addMapper(CrmProjectMapper.class);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
try (SqlSession s = sqlSessionFactory.openSession(true)) {
try (Statement st = s.getConnection().createStatement()) {
for (String sql : SCHEMA) {
st.execute(sql);
}
}
}
}
@BeforeEach
void openSession() throws Exception {
session = sqlSessionFactory.openSession(true);
try (Statement st = session.getConnection().createStatement()) {
st.execute("DELETE FROM crm_project");
for (String sql : SEED) {
st.execute(sql);
}
}
projectMapper = session.getMapper(CrmProjectMapper.class);
IAuthUserService authUserService = Mockito.mock(IAuthUserService.class);
AuthUser bob = new AuthUser();
bob.setId(BOB);
bob.setUsername("李四");
bob.setDeptId(6002L);
Mockito.when(authUserService.getById(BOB)).thenReturn(bob);
transferPort = new ProjectUserTransferPortImpl(projectMapper, authUserService);
ownerSyncPort = new ProjectOwnerSyncPortImpl(projectMapper, authUserService);
}
@AfterEach
void closeSession() {
if (session != null) {
session.close();
}
}
@Test
@DisplayName("项目域移交:domain()=project(crm-auth 注册表 key 契约);count/transfer 查 crm_project 刷 owner 三列")
void transferPortWorks() {
assertThat(transferPort.domain()).isEqualTo("project");
assertThat(transferPort.countOwned(ALICE)).isEqualTo(2L); // P1、P2
int updated = transferPort.transferOwned(ALICE, BOB);
assertThat(updated).isEqualTo(2);
CrmProject p1 = projectMapper.selectById(1L);
assertThat(p1.getOwnerUserId()).isEqualTo(BOB);
assertThat(p1.getOwnerNameSnapshot()).isEqualTo("李四");
assertThat(p1.getOwnerDeptId()).isEqualTo(6002L);
assertThat(transferPort.countOwned(ALICE)).isEqualTo(0L);
assertThat(transferPort.countOwned(BOB)).isEqualTo(3L); // P1、P2 移入 + P3 原本就是 BOB
}
@Test
@DisplayName("移交不串扰:商机域(opportunity 表 opp_status 切域)数据不受项目域移交影响")
void transferPortIsolation() {
// 本测试库无 opportunity 表接入——接缝隔离由「查各自 Mapper/表」保证(结构核查):
// 项目域实现断开 extends(父类就是 Object,未继承商机侧共表抽象类;
// 二者 instanceof 互查甚至无法通过编译——不相关类型,解耦已由编译器证明)
assertThat(transferPort.getClass().getSuperclass()).isEqualTo(Object.class);
int updated = transferPort.transferOwned(ALICE, BOB);
assertThat(updated).isEqualTo(2); // 仅 crm_project 行受影响
}
@Test
@DisplayName("ProjectOwnerSyncPort:customer_id 命中批量刷 owner,返回真实影响行数(Noop 已退役)")
void ownerSyncByCustomer() {
int updated = ownerSyncPort.syncOwnerByCustomer(CUSTOMER_A, BOB);
assertThat(updated).isEqualTo(2); // P1、P3 同属客户 A
CrmProject p3 = projectMapper.selectById(3L);
assertThat(p3.getOwnerUserId()).isEqualTo(BOB);
assertThat(p3.getOwnerNameSnapshot()).isEqualTo("李四");
assertThat(p3.getOwnerDeptId()).isEqualTo(6002L);
// 客户 B(P2 原 owner=ALICE)也随人走
assertThat(ownerSyncPort.syncOwnerByCustomer(CUSTOMER_B, BOB)).isEqualTo(1);
}
@Test
@DisplayName("owner 同步:接收人缺失 → 业务异常(调用方事务回滚)")
void ownerSyncRejectsMissingReceiver() {
assertThatThrownBy(() -> ownerSyncPort.syncOwnerByCustomer(CUSTOMER_A, 99999L))
.isInstanceOf(BusinessErrorException.class)
.hasFieldOrPropertyWithValue("code", ProjectConstants.CODE_PROJECT_INVALID);
}
// ==================== 数据 ====================
private static final String[] SCHEMA = {
"""
CREATE TABLE crm_project (
id BIGINT PRIMARY KEY, creator_id VARCHAR(50), create_time DATETIME,
updater_id VARCHAR(50), update_time DATETIME, deleted TINYINT NOT NULL DEFAULT 0,
project_name VARCHAR(200) NOT NULL,
project_stage TINYINT NOT NULL DEFAULT 0,
project_status TINYINT NOT NULL DEFAULT 1,
filing_status TINYINT NOT NULL DEFAULT 1,
bid_result TINYINT NOT NULL DEFAULT 0,
source_opp_id BIGINT, scheme_card_id BIGINT NOT NULL, customer_id BIGINT NOT NULL,
owner_user_id BIGINT, owner_name_snapshot VARCHAR(64), owner_dept_id BIGINT,
project_amount DECIMAL(14,2), region_code VARCHAR(32), brand VARCHAR(200),
bid_time DATETIME,
scheme_budget DECIMAL(14,2), scheme_version VARCHAR(32), scheme_task_status VARCHAR(32),
quote_total DECIMAL(14,2), quote_status VARCHAR(32),
bid_deadline DATETIME, bid_budget DECIMAL(14,2), brand_control VARCHAR(200),
bid_base_type VARCHAR(32), alloc_ratio DECIMAL(5,2), bid_bond DECIMAL(14,2),
bid_file_id VARCHAR(64), bidder_name VARCHAR(200),
bid_open_time DATETIME, bid_open_place VARCHAR(200), bid_award_method VARCHAR(64),
bid_award_amount DECIMAL(14,2),
close_type VARCHAR(32), close_reason VARCHAR(500), close_time DATETIME,
close_remark VARCHAR(500),
version INT NOT NULL DEFAULT 0)
"""
};
private static final String[] SEED = {
"INSERT INTO crm_project (id, deleted, project_name, project_stage, project_status, filing_status, bid_result, scheme_card_id, customer_id, owner_user_id, owner_name_snapshot, owner_dept_id, version) "
+ "VALUES (1, 0, '项目一', 1, 1, 2, 0, 9001, " + CUSTOMER_A + ", " + ALICE + ", '张三', 6001, 0)",
"INSERT INTO crm_project (id, deleted, project_name, project_stage, project_status, filing_status, bid_result, scheme_card_id, customer_id, owner_user_id, owner_name_snapshot, owner_dept_id, version) "
+ "VALUES (2, 0, '项目二', 3, 1, 2, 0, 9002, " + CUSTOMER_B + ", " + ALICE + ", '张三', 6001, 0)",
"INSERT INTO crm_project (id, deleted, project_name, project_stage, project_status, filing_status, bid_result, scheme_card_id, customer_id, owner_user_id, owner_name_snapshot, owner_dept_id, version) "
+ "VALUES (3, 0, '项目三', 0, 1, 1, 0, 9003, " + CUSTOMER_A + ", " + BOB + ", '王五', 6003, 0)",
};
}
Loading…
Cancel
Save