20260727225141

This commit is contained in:
oneao committed 2026-07-27 22:51:41 +08:00
1 parent 9dbaef7787
commit 63588bd217
97 files changed
+1309 -145

No files matched your search

@@ -0,0 +1,79 @@
---
name: fix-i18n-auto-generate-on-edit
overview: 修复模块管理页面:编辑模块编码/字段名/权限编码时不再实时生成多语言受管键,改为点击「保存」时根据最终草稿生成。
todos:
- id: i18n-panel-override
content: 修改 ModuleI18nPanel 的 reconcileManagedRows 支持 itemsOverride 参数并在 defineExpose 暴露
status: completed
- id: index-originals-i18n
content: 将 index.vue 的 i18nItems 改为基于 originals 计算,并新增基于 drafts 的 finalI18nItems
status: completed
dependencies:
- i18n-panel-override
- id: save-all-reconcile
content: 在 index.vue 的 saveAll 保存多语言前调用 i18nPanelRef.reconcileManagedRows(finalI18nItems)
status: completed
dependencies:
- index-originals-i18n
- id: verify-fmt
content: 运行 pnpm fmt:check 校验格式,核对三类受管键仅保存时生成
status: completed
dependencies:
- save-all-reconcile
---
## 用户需求
模块管理页面编辑模块编码/字段名/权限编码时,多语言面板会实时生成受管多语言行,且使用的是草稿中尚未保存的默认值("旧值")。用户希望:只有点击「保存」时才根据最终的模块编码生成多语言,编辑过程中不要实时生成。
## 核心功能
- 编辑模块编码(基本信息面板)时,多语言面板不再实时生成/重命名受管键。
- 编辑字段定义中的字段名、权限配置中的权限编码时,同样不再实时生成对应受管键。
- 点击「保存」时,依据最终填写的模块编码、字段名、权限编码生成并落库多语言受管键。
## 影响范围
- 该问题由同一根因引起,覆盖「模块编码、字段定义、权限」三类受管多语言键,一次修复即可全部覆盖。
- 仅前端修改,不涉及后端、迁移脚本、b_user_power 逻辑。
## 技术栈
- 前端:Vue 3 `<script setup>` SFC + Pinia + antdv-next(沿用现有框架,不改变技术栈)。
- 数据层:复用通用 `loadDataApi` / `saveObjectApi`,不新增接口。
## 实现方案
根因:父组件 `index.vue` 的 `i18nItems` computed 由 `drafts`(实时编辑态)计算,并传给 `ModuleI18nPanel` 的 `:i18n-items`;面板内 `watch(() => props.i18nItems, reconcileManagedRows, { deep: true })` 在每次变化时立即创建/重命名受管多语言行,造成"输入即生成",且 `i18nItems` 用 `module?.b_code` 作为字段/权限 key 前缀,导致模块编码变更会级联影响字段与权限的受管键。
关键决策:分离"实时展示快照"与"保存时最终态"。
1. 实时传给面板的 `i18nItems` 改为基于 `originals`(已保存快照)计算,编辑过程中 `originals` 不变,`reconcileManagedRows` 不会因草稿改动而触发实时生成。
2. 新增 `finalI18nItems` computed 基于 `drafts`(最终编辑态)计算,仅供保存使用。
3. 在 `saveAll` 调用 `i18nPanel.buildSaveRequest()` 前,调用 `i18nPanelRef.value.reconcileManagedRows(finalI18nItems.value)`,将最终草稿中的受管键推入面板,由 `buildSaveRequest` 收集并随保存落库(此时才按模块编码生成)。
4. `ModuleI18nPanel.reconcileManagedRows(itemsOverride?)` 增加可选参数,缺省回退到 `managedItems.value`;watch 不传参行为不变。并在 `defineExpose` 暴露它。
性能与可靠性:
- 仅调整数据源(originals/drafts),不引入新的渲染或网络开销;`reconcileManagedRows` 仍为 O(n) 遍历,开销可忽略。
- 保存后 `originals.value = cloneData(drafts.value)` 与 `markSaved()` 已存在,originals 驱动下的 `i18nItems` 会在保存后自然包含最终键,且 `markSaved` 将 `originalsFlat` 同步为保存后的扁平数据,避免重复保存。
- 子面板(`ModuleBasicPanel.onCodeInput`、`ModuleFieldsPanel`/`ModulePowersPanel` 的 `syncModuleItemI18nKeys`)仍会写入草稿 `b_i18n`,但面板实时项已改为 originals 驱动,不再触发实时生成;`saveAll` 仍会重写为最终值,功能不受影响。
- `loadI18n` / `requestedKeys` 基于 `props.i18nItems`(originals 驱动)后,仅加载已保存 key,符合预期。
## 实施要点
- 修改需保持范围最小,不触碰无关的通用端点、共享组件或全局样式。
- 因前端无单测脚本,交付后运行 `pnpm fmt:check` 校验格式,不自动构建/启动。
## 目录结构(仅列出将修改的文件)
```
fms-vue/src/views/module-management/
├── index.vue # [MODIFY] i18nItems 改为基于 originals;
│ # 新增 finalI18nItems(基于 drafts);
│ # 在 saveAll 保存多语言前调用
│ # i18nPanelRef.reconcileManagedRows(finalI18nItems)
└── components/
└── ModuleI18nPanel.vue # [MODIFY] reconcileManagedRows 支持 itemsOverride;
# defineExpose 暴露 reconcileManagedRows
```
@@ -60,7 +60,6 @@ GO
b_canuse int NOT NULL CONSTRAINT DF_s_module_canuse DEFAULT (1),
b_xh int NOT NULL CONSTRAINT DF_s_module_xh DEFAULT (0),
CONSTRAINT PK_s_module PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_parent FOREIGN KEY (b_parent_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT UQ_s_module_code UNIQUE (b_code),
CONSTRAINT CK_s_module_code CHECK (
LEN(b_code) BETWEEN 2 AND 50
@@ -88,7 +87,6 @@ GO
b_options nvarchar(max) NULL,
b_canuse int NOT NULL CONSTRAINT DF_s_module_field_canuse DEFAULT (1),
CONSTRAINT PK_s_module_field PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_field_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT UQ_s_module_field UNIQUE (b_module_id, b_field),
CONSTRAINT CK_s_module_field_type CHECK (b_type IN ('input', 'textarea', 'number', 'money', 'date', 'datetime', 'switch', 'select')),
CONSTRAINT CK_s_module_field_canuse CHECK (b_canuse IN (0, 1)),
@@ -105,8 +103,6 @@ GO
b_xh int NOT NULL CONSTRAINT DF_s_module_field_group_xh DEFAULT (0),
b_canuse int NOT NULL CONSTRAINT DF_s_module_field_group_canuse DEFAULT (1),
CONSTRAINT PK_s_module_field_group PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_field_group_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT FK_s_module_field_group_parent FOREIGN KEY (b_parent_id) REFERENCES dbo.s_module_field_group (b_id),
CONSTRAINT CK_s_module_field_group_canuse CHECK (b_canuse IN (0, 1))
);
CREATE INDEX IX_s_module_field_group_module ON dbo.s_module_field_group (b_module_id, b_canuse, b_xh, b_id);
@@ -121,9 +117,6 @@ GO
b_xh int NOT NULL CONSTRAINT DF_s_module_field_list_xh DEFAULT (0),
b_width int NULL,
CONSTRAINT PK_s_module_field_list PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_field_list_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT FK_s_module_field_list_field FOREIGN KEY (b_field_id) REFERENCES dbo.s_module_field (b_id),
CONSTRAINT FK_s_module_field_list_group FOREIGN KEY (b_group_id) REFERENCES dbo.s_module_field_group (b_id),
CONSTRAINT CK_s_module_field_list_visible CHECK (b_visible IN (0, 1)),
CONSTRAINT CK_s_module_field_list_width CHECK (b_width IS NULL OR b_width > 0)
);
@@ -140,9 +133,6 @@ GO
b_group_id bigint NULL,
b_xh int NOT NULL CONSTRAINT DF_s_module_field_edit_xh DEFAULT (0),
CONSTRAINT PK_s_module_field_edit PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_field_edit_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT FK_s_module_field_edit_field FOREIGN KEY (b_field_id) REFERENCES dbo.s_module_field (b_id),
CONSTRAINT FK_s_module_field_edit_group FOREIGN KEY (b_group_id) REFERENCES dbo.s_module_field_group (b_id),
CONSTRAINT UQ_s_module_field_edit UNIQUE (b_module_id, b_field_id),
CONSTRAINT CK_s_module_field_edit_required CHECK (b_required IN (0, 1)),
CONSTRAINT CK_s_module_field_edit_readonly CHECK (b_readonly IN (0, 1)),
@@ -160,8 +150,6 @@ GO
b_xh int NOT NULL CONSTRAINT DF_s_module_field_query_xh DEFAULT (0),
b_canuse int NOT NULL CONSTRAINT DF_s_module_field_query_canuse DEFAULT (1),
CONSTRAINT PK_s_module_field_query PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_field_query_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT FK_s_module_field_query_field FOREIGN KEY (b_field_id) REFERENCES dbo.s_module_field (b_id),
CONSTRAINT UQ_s_module_field_query UNIQUE (b_module_id, b_field_id),
CONSTRAINT CK_s_module_field_query_operator CHECK (b_operator IN ('=', 'like', 'between', 'in')),
CONSTRAINT CK_s_module_field_query_canuse CHECK (b_canuse IN (0, 1))
@@ -177,7 +165,6 @@ GO
b_xh int NOT NULL CONSTRAINT DF_s_module_power_xh DEFAULT (0),
b_canuse int NOT NULL CONSTRAINT DF_s_module_power_canuse DEFAULT (1),
CONSTRAINT PK_s_module_power PRIMARY KEY (b_id),
CONSTRAINT FK_s_module_power_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT UQ_s_module_power UNIQUE (b_module_id, b_code),
CONSTRAINT CK_s_module_power_canuse CHECK (b_canuse IN (0, 1))
);
@@ -189,24 +176,20 @@ GO
b_inputuser_id bigint NOT NULL,
b_inputdatetime datetime NOT NULL CONSTRAINT DF_b_user_module_inputdatetime DEFAULT (GETDATE()),
CONSTRAINT PK_b_user_module PRIMARY KEY (b_id),
CONSTRAINT FK_b_user_module_user FOREIGN KEY (b_user_id) REFERENCES dbo.b_user (b_id),
CONSTRAINT FK_b_user_module_module FOREIGN KEY (b_module_id) REFERENCES dbo.s_module (b_id),
CONSTRAINT FK_b_user_module_inputuser FOREIGN KEY (b_inputuser_id) REFERENCES dbo.b_user (b_id),
CONSTRAINT UQ_b_user_module UNIQUE (b_user_id, b_module_id)
);
CREATE TABLE dbo.b_user_power (
b_id bigint NOT NULL,
b_user_id bigint NOT NULL,
b_module_id bigint NOT NULL,
b_power_id bigint NOT NULL,
b_inputuser_id bigint NOT NULL,
b_inputdatetime datetime NOT NULL CONSTRAINT DF_b_user_power_inputdatetime DEFAULT (GETDATE()),
CONSTRAINT PK_b_user_power PRIMARY KEY (b_id),
CONSTRAINT FK_b_user_power_user FOREIGN KEY (b_user_id) REFERENCES dbo.b_user (b_id),
CONSTRAINT FK_b_user_power_power FOREIGN KEY (b_power_id) REFERENCES dbo.s_module_power (b_id),
CONSTRAINT FK_b_user_power_inputuser FOREIGN KEY (b_inputuser_id) REFERENCES dbo.b_user (b_id),
CONSTRAINT UQ_b_user_power UNIQUE (b_user_id, b_power_id)
);
CREATE INDEX IX_b_user_power_module ON dbo.b_user_power (b_module_id, b_user_id);
CREATE TABLE dbo.b_i18n (
b_id bigint NOT NULL,
@@ -232,8 +215,8 @@ GO
INSERT INTO dbo.b_user_module (b_id, b_user_id, b_module_id, b_inputuser_id) VALUES
(910000000000000201, @AdminId, @MetadataId, @AdminId);
INSERT INTO dbo.b_user_power (b_id, b_user_id, b_power_id, b_inputuser_id)
SELECT 910000000000000300 + ROW_NUMBER() OVER (ORDER BY b_id), @AdminId, b_id, @AdminId
INSERT INTO dbo.b_user_power (b_id, b_user_id, b_module_id, b_power_id, b_inputuser_id)
SELECT 910000000000000300 + ROW_NUMBER() OVER (ORDER BY b_id), @AdminId, b_module_id, b_id, @AdminId
FROM dbo.s_module_power;
EXEC sys.sp_set_session_context @key = N'allow_g3soft', @value = NULL;
@@ -69,8 +69,8 @@ BEGIN TRANSACTION;
INSERT INTO dbo.b_user_module (b_id, b_user_id, b_module_id, b_inputuser_id) VALUES
(910000000000000202, @AdminId, @I18nTypeId, @AdminId);
INSERT INTO dbo.b_user_power (b_id, b_user_id, b_power_id, b_inputuser_id)
SELECT 910000000000000303 + ROW_NUMBER() OVER (ORDER BY b_id), @AdminId, b_id, @AdminId
INSERT INTO dbo.b_user_power (b_id, b_user_id, b_module_id, b_power_id, b_inputuser_id)
SELECT 910000000000000303 + ROW_NUMBER() OVER (ORDER BY b_id), @AdminId, b_module_id, b_id, @AdminId
FROM dbo.s_module_power
WHERE b_module_id = @I18nTypeId;
END
@@ -0,0 +1,53 @@
/*
数据表之间仅保留逻辑关联:
1. 为 b_user_power 增加模块 ID,并从权限定义回填存量数据;
2. 删除当前数据库中的全部物理外键。
*/
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.b_user_power', N'U') IS NOT NULL
AND COL_LENGTH(N'dbo.b_user_power', N'b_module_id') IS NULL
BEGIN
ALTER TABLE dbo.b_user_power ADD b_module_id bigint NULL;
END;
IF OBJECT_ID(N'dbo.b_user_power', N'U') IS NOT NULL
AND OBJECT_ID(N'dbo.s_module_power', N'U') IS NOT NULL
BEGIN
UPDATE user_power
SET b_module_id = module_power.b_module_id
FROM dbo.b_user_power AS user_power
INNER JOIN dbo.s_module_power AS module_power
ON module_power.b_id = user_power.b_power_id
WHERE user_power.b_module_id IS NULL;
IF EXISTS (SELECT 1 FROM dbo.b_user_power WHERE b_module_id IS NULL)
THROW 51010, N'b_user_power 存在无法匹配模块的权限记录,迁移已取消。', 1;
ALTER TABLE dbo.b_user_power ALTER COLUMN b_module_id bigint NOT NULL;
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.b_user_power')
AND name = N'IX_b_user_power_module'
)
CREATE INDEX IX_b_user_power_module
ON dbo.b_user_power (b_module_id, b_user_id);
END;
DECLARE @Sql nvarchar(max) = N'';
SELECT @Sql = @Sql
+ N'ALTER TABLE '
+ QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + N'.'
+ QUOTENAME(OBJECT_NAME(parent_object_id))
+ N' DROP CONSTRAINT ' + QUOTENAME(name) + N';'
FROM sys.foreign_keys;
IF @Sql <> N''
EXEC sys.sp_executesql @Sql;
COMMIT TRANSACTION;
@@ -347,7 +347,20 @@ public class DbUtils {
Object keyValue = requiredKeyValue(normalizedRow, keyColumn, table.requestedName());
String sql = "DELETE FROM " + table.quotedName()
+ " WHERE " + quoteColumn(keyColumn) + " = ?";
return executeWrite(connection, sql, List.of(keyValue), "删除");
return executeDelete(connection, sql, List.of(keyValue));
}
private int executeDelete(
Connection connection,
String sql,
List<Object> parameters
) throws SQLException {
try (PreparedStatement statement = connection.prepareStatement(sql)) {
for (int index = 0; index < parameters.size(); index++) {
statement.setObject(index + 1, parameters.get(index));
}
return statement.executeUpdate();
}
}
private List<Map<String, Object>> executeQuery(
@@ -84,6 +84,22 @@ class DataSaveServiceTests {
verify(fixture.connection, org.mockito.Mockito.never()).commit();
}
@Test
void deleteAllowsMultipleAffectedRows() throws Exception {
JdbcFixture fixture = new JdbcFixture("b_module_id", "b_name");
DataSaveService service = fixture.createService();
when(fixture.deleteStatement.executeUpdate()).thenReturn(3);
service.save(List.of(Map.of(
"table", "b_user",
"key_field", "b_module_id",
"deletes", List.of(Map.of("b_module_id", "M001"))
)));
verify(fixture.deleteStatement).setObject(1, "M001");
verify(fixture.connection).commit();
}
private static final class JdbcFixture {
private final DataSource dataSource = mock(DataSource.class);
@@ -110,7 +126,7 @@ class DataSaveServiceTests {
when(metadata.isAutoIncrement(1)).thenReturn(false);
when(metadata.isAutoIncrement(2)).thenReturn(false);
when(connection.prepareStatement("DELETE FROM [b_user] WHERE [b_id] = ?"))
when(connection.prepareStatement("DELETE FROM [b_user] WHERE [" + firstColumn + "] = ?"))
.thenReturn(deleteStatement);
when(connection.prepareStatement(
"UPDATE [b_user] SET [" + secondColumn + "] = ? WHERE [b_id] = ?"
@@ -0,0 +1,26 @@
server:
port: 8088
servlet:
context-path: /api
spring:
application:
name: fms-api
fms:
auth:
jwt-secret: "${FMS_JWT_SECRET:fms-api-development-jwt-secret-change-me}"
jwt-expiration: 24h
database:
config-dir: ./config/dbconfigs
pool:
initial-size: 0
min-idle: 0
max-active: 10
max-wait: 5000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
time-between-eviction-runs: 60s
min-evictable-idle-time: 5m
Binary file not shown.
@@ -0,0 +1,40 @@
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\config\AuthProperties.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\config\JacksonConfig.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\config\JwtAuthFilter.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\controller\AuthController.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\controller\DataController.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgContext.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgDatabaseConfig.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgDatabaseConfigLoader.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgDatabaseProperties.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgDataSourceFactory.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgDataSourceManager.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\database\OrgRoutingDataSource.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\exception\AuthenticationException.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\exception\BusinessException.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\exception\GlobalExceptionHandler.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\exception\SaveObjectException.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\FmsApiApplication.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\service\ActiveSessionRegistry.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\service\AuthService.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\service\DataSaveService.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\service\DataService.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\service\LoginLogService.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\ApiResponse.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\ClientInfo.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\ClientInfoExtractor.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\DbUtils.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\IpRegionSearcher.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\IpUtils.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\JwtUtils.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\ParamUtils.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\contract\IdGeneratorException.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\contract\IdGeneratorOptions.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\contract\IIdGenerator.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\contract\ISnowWorker.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\contract\OverCostActionArg.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\core\SnowWorkerM1.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\core\SnowWorkerM2.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\idgen\DefaultIdGenerator.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\snowflake\idgen\IdGenerator.java
D:\workspace\code\fms\fms-api\src\main\java\cn\g3soft\fmsapi\utils\StringUtils.java
@@ -0,0 +1,8 @@
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\database\OrgDatabaseConfigLoaderTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\database\OrgDataSourceFactoryTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\exception\GlobalExceptionHandlerTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\FmsApiApplicationTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\service\ActiveSessionRegistryTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\service\AuthServiceTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\service\DataSaveServiceTests.java
D:\workspace\code\fms\fms-api\src\test\java\cn\g3soft\fmsapi\utils\JwtUtilsTests.java
@@ -0,0 +1,5 @@
# Created at 2026-07-27T21:19:50.541
Boot Manifest-JAR contains absolute paths in classpath 'D:\workspace\code\fms\fms-api\target\test-classes'
Hint: <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
'other' has different root
@@ -0,0 +1,5 @@
# Created at 2026-07-27T21:53:37.909
Boot Manifest-JAR contains absolute paths in classpath 'D:\workspace\code\fms\fms-api\target\test-classes'
Hint: <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
'other' has different root
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.FmsApiApplicationTests" time="1.581" tests="1" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="APPLICATION_NAME" value="fms-api"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="FILE_LOG_CHARSET" value="UTF-8"/>
<property name="java.awt.headless" value="true"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="PID" value="19620"/>
<property name="sun.os.patch.level" value=""/>
<property name="CONSOLE_LOG_CHARSET" value="UTF-8"/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
<property name="LOGGED_APPLICATION_NAME" value="[fms-api] "/>
</properties>
<testcase name="contextLoads" classname="cn.g3soft.fmsapi.FmsApiApplicationTests" time="0.273">
<system-out><![CDATA[21:53:38.602 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [cn.g3soft.fmsapi.FmsApiApplicationTests]: FmsApiApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
21:53:38.648 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration cn.g3soft.fmsapi.FmsApiApplication for test class cn.g3soft.fmsapi.FmsApiApplicationTests
21:53:38.695 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [cn.g3soft.fmsapi.FmsApiApplicationTests]: FmsApiApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
21:53:38.696 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration cn.g3soft.fmsapi.FmsApiApplication for test class cn.g3soft.fmsapi.FmsApiApplicationTests
21:53:38.722 [main] INFO org.springframework.boot.devtools.restart.RestartApplicationListener -- Restart disabled due to context in which it is running
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v4.1.0)
2026-07-27T21:53:38.871+08:00 INFO 19620 --- [fms-api] [ main] c.g3soft.fmsapi.FmsApiApplicationTests : Starting FmsApiApplicationTests using Java 21.0.11 with PID 19620 (started by admin in D:\workspace\code\fms\fms-api)
2026-07-27T21:53:38.872+08:00 INFO 19620 --- [fms-api] [ main] c.g3soft.fmsapi.FmsApiApplicationTests : No active profile set, falling back to 1 default profile: "default"
2026-07-27T21:53:39.497+08:00 INFO 19620 --- [fms-api] [ main] c.g3soft.fmsapi.utils.IpRegionSearcher : ip2region Searcher 初始化完成,数据大小 11114380 字节
2026-07-27T21:53:39.865+08:00 INFO 19620 --- [fms-api] [ main] c.g3soft.fmsapi.FmsApiApplicationTests : Started FmsApiApplicationTests in 1.148 seconds (process running for 1.909)
]]></system-out>
<system-err><![CDATA[Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build as described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org.mockito/org/mockito/Mockito.html#0.3
WARNING: A Java agent has been loaded dynamically (C:\Users\admin\.m2\repository\net\bytebuddy\byte-buddy-agent\1.18.10\byte-buddy-agent-1.18.10.jar)
WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
WARNING: Dynamic loading of agents will be disallowed by default in a future release
]]></system-err>
</testcase>
</testsuite>
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.database.OrgDataSourceFactoryTests" time="0.141" tests="1" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="sun.os.patch.level" value=""/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
</properties>
<testcase name="databaseConnectionFailureDoesNotRetry" classname="cn.g3soft.fmsapi.database.OrgDataSourceFactoryTests" time="0.14">
<system-out><![CDATA[21:53:38.534 [main] INFO com.alibaba.druid.pool.DruidDataSource -- {dataSource-1,TEST} inited
21:53:38.553 [main] INFO com.alibaba.druid.pool.DruidDataSource -- {dataSource-1} closing ...
21:53:38.553 [main] INFO com.alibaba.druid.pool.DruidDataSource -- {dataSource-1} closed
]]></system-out>
</testcase>
</testsuite>
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.database.OrgDatabaseConfigLoaderTests" time="0.129" tests="1" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="sun.os.patch.level" value=""/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
</properties>
<testcase name="missingConfigFileIsReportedAsInvalidOrgId" classname="cn.g3soft.fmsapi.database.OrgDatabaseConfigLoaderTests" time="0.119"/>
</testsuite>
@@ -0,0 +1,238 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests" time="0.015" tests="2" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="sun.os.patch.level" value=""/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
</properties>
<testcase name="databaseExceptionReturnsSystemError" classname="cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests" time="0.009">
<system-out><![CDATA[21:53:38.561 [main] ERROR cn.g3soft.fmsapi.exception.GlobalExceptionHandler -- 系统异常,method=POST,uri=/api/auth/login
java.sql.SQLException: connection failed
at cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests.databaseExceptionReturnsSystemError(GlobalExceptionHandlerTests.java:19)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:701)
at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:502)
at org.junit.jupiter.engine.support.MethodReflectionUtils.invoke(MethodReflectionUtils.java:45)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:61)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:124)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:163)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:148)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:123)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:99)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:66)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:47)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:39)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:98)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invokeVoid(InterceptingExecutableInvoker.java:71)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$0(TestMethodTestDescriptor.java:219)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:215)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:157)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:176)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:36)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:52)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:58)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:246)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:218)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:179)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:66)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:157)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:65)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:125)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58)
at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$2(InterceptingLauncher.java:57)
at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:56)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:125)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithCancellationToken(LauncherAdapter.java:68)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:54)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
]]></system-out>
</testcase>
<testcase name="saveExceptionReturnsOperationLocation" classname="cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests" time="0.005">
<system-out><![CDATA[21:53:38.565 [main] ERROR cn.g3soft.fmsapi.exception.GlobalExceptionHandler -- 保存失败,table=bs_business,action=update,index=2
cn.g3soft.fmsapi.exception.SaveObjectException: 保存失败
at cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests.saveExceptionReturnsOperationLocation(GlobalExceptionHandlerTests.java:32)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:701)
at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:502)
at org.junit.jupiter.engine.support.MethodReflectionUtils.invoke(MethodReflectionUtils.java:45)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:61)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:124)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:163)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:148)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:123)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:99)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:66)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:47)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:39)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:98)
at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invokeVoid(InterceptingExecutableInvoker.java:71)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$0(TestMethodTestDescriptor.java:219)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:215)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:157)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:176)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:42)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$2(NodeTestTask.java:180)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$1(NodeTestTask.java:166)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:138)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$0(NodeTestTask.java:164)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:74)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:163)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:116)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:36)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:52)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:58)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:246)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:218)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:179)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:66)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:157)
at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:65)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:125)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58)
at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$2(InterceptingLauncher.java:57)
at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:56)
at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:58)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.apache.maven.surefire.api.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:125)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithCancellationToken(LauncherAdapter.java:68)
at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:54)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
Caused by: java.sql.SQLException: update failed
... 82 common frames omitted
]]></system-out>
</testcase>
</testsuite>
@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.service.ActiveSessionRegistryTests" time="0.001" tests="2" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="APPLICATION_NAME" value="fms-api"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="FILE_LOG_CHARSET" value="UTF-8"/>
<property name="java.awt.headless" value="true"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="PID" value="19620"/>
<property name="sun.os.patch.level" value=""/>
<property name="CONSOLE_LOG_CHARSET" value="UTF-8"/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
<property name="LOGGED_APPLICATION_NAME" value="[fms-api] "/>
</properties>
<testcase name="newerLoginReplacesPreviousSessionForSameAccount" classname="cn.g3soft.fmsapi.service.ActiveSessionRegistryTests" time="0.001"/>
<testcase name="sameUserIdInDifferentOrganizationsHasIndependentSessions" classname="cn.g3soft.fmsapi.service.ActiveSessionRegistryTests" time="0.0"/>
</testsuite>
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.service.AuthServiceTests" time="0.192" tests="1" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="APPLICATION_NAME" value="fms-api"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="FILE_LOG_CHARSET" value="UTF-8"/>
<property name="java.awt.headless" value="true"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="PID" value="19620"/>
<property name="sun.os.patch.level" value=""/>
<property name="CONSOLE_LOG_CHARSET" value="UTF-8"/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
<property name="LOGGED_APPLICATION_NAME" value="[fms-api] "/>
</properties>
<testcase name="hiddenSuperAdministratorCanLoginWithEmptyPassword" classname="cn.g3soft.fmsapi.service.AuthServiceTests" time="0.191"/>
</testsuite>
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.service.DataSaveServiceTests" time="0.414" tests="3" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="APPLICATION_NAME" value="fms-api"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="FILE_LOG_CHARSET" value="UTF-8"/>
<property name="java.awt.headless" value="true"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="PID" value="19620"/>
<property name="sun.os.patch.level" value=""/>
<property name="CONSOLE_LOG_CHARSET" value="UTF-8"/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
<property name="LOGGED_APPLICATION_NAME" value="[fms-api] "/>
</properties>
<testcase name="deleteAllowsMultipleAffectedRows" classname="cn.g3soft.fmsapi.service.DataSaveServiceTests" time="0.375"/>
<testcase name="savesDirectArrayInOneTransactionAndKeepsEmptyString" classname="cn.g3soft.fmsapi.service.DataSaveServiceTests" time="0.019"/>
<testcase name="sqlFailureRollsBackAndReportsOperationLocation" classname="cn.g3soft.fmsapi.service.DataSaveServiceTests" time="0.017"/>
</testsuite>
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd" version="3.0.2" name="cn.g3soft.fmsapi.utils.JwtUtilsTests" time="0.114" tests="1" errors="0" skipped="0" failures="0" flakes="0">
<properties>
<property name="java.specification.version" value="21"/>
<property name="sun.cpu.isalist" value="amd64"/>
<property name="sun.jnu.encoding" value="GBK"/>
<property name="java.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyaml\2.6\snakLine truncated
<property name="java.vm.vendor" value="Eclipse Adoptium"/>
<property name="sun.arch.data.model" value="64"/>
<property name="user.variant" value=""/>
<property name="java.vendor.url" value="https://adoptium.net/"/>
<property name="user.timezone" value="Asia/Shanghai"/>
<property name="os.name" value="Windows 11"/>
<property name="java.vm.specification.version" value="21"/>
<property name="APPLICATION_NAME" value="fms-api"/>
<property name="sun.java.launcher" value="SUN_STANDARD"/>
<property name="user.country" value="CN"/>
<property name="sun.boot.library.path" value="D:\devtool\jdk\jdk21\bin"/>
<property name="sun.java.command" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218 2026-07-27T21-53-37_778-jvmRun1 surefire-20260727215337863_1tmp surefire_0-20260727215337863_2tmp"/>
<property name="jdk.debug" value="release"/>
<property name="surefire.test.class.path" value="D:\workspace\code\fms\fms-api\target\test-classes;D:\workspace\code\fms\fms-api\target\classes;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-webmvc\4.1.0\spring-boot-starter-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter\4.1.0\spring-boot-starter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-logging\4.1.0\spring-boot-starter-logging-4.1.0.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-classic\1.5.34\logback-classic-1.5.34.jar;C:\Users\admin\.m2\repository\ch\qos\logback\logback-core\1.5.34\logback-core-1.5.34.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.25.4\log4j-to-slf4j-2.25.4.jar;C:\Users\admin\.m2\repository\org\apache\logging\log4j\log4j-api\2.25.4\log4j-api-2.25.4.jar;C:\Users\admin\.m2\repository\org\slf4j\jul-to-slf4j\2.0.18\jul-to-slf4j-2.0.18.jar;C:\Users\admin\.m2\repository\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jackson\4.1.0\spring-boot-starter-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jackson\4.1.0\spring-boot-jackson-4.1.0.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-databind\3.1.4\jackson-databind-3.1.4.jar;C:\Users\admin\.m2\repository\tools\jackson\core\jackson-core\3.1.4\jackson-core-3.1.4.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\4.1.0\spring-boot-starter-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.1.0\spring-boot-starter-tomcat-runtime-4.1.0.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\11.0.22\tomcat-embed-core-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\11.0.22\tomcat-embed-el-11.0.22.jar;C:\Users\admin\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.22\tomcat-embed-websocket-11.0.22.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-tomcat\4.1.0\spring-boot-tomcat-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-http-converter\4.1.0\spring-boot-http-converter-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\7.0.8\spring-web-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\7.0.8\spring-beans-7.0.8.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-observation\1.17.0\micrometer-observation-1.17.0.jar;C:\Users\admin\.m2\repository\io\micrometer\micrometer-commons\1.17.0\micrometer-commons-1.17.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-webmvc\4.1.0\spring-boot-webmvc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-servlet\4.1.0\spring-boot-servlet-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\7.0.8\spring-webmvc-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\7.0.8\spring-aop-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\7.0.8\spring-expression-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\4.1.0\spring-boot-starter-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-jdbc\4.1.0\spring-boot-jdbc-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-sql\4.1.0\spring-boot-sql-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-transaction\4.1.0\spring-boot-transaction-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\boot\spring-boot-persistence\4.1.0\spring-boot-persistence-4.1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\7.0.8\spring-tx-7.0.8.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\7.0.8\spring-jdbc-7.0.8.jar;C:\Users\admin\.m2\repository\com\zaxxer\HikariCP\7.0.2\HikariCP-7.0.2.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\2.0.18\slf4j-api-2.0.18.jar;C:\Users\admin\.m2\repository\com\alibaba\druid\1.2.18\druid-1.2.18.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-api\0.12.6\jjwt-api-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-impl\0.12.6\jjwt-impl-0.12.6.jar;C:\Users\admin\.m2\repository\io\jsonwebtoken\jjwt-jackson\0.12.6\jjwt-jackson-0.12.6.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.21.4\jackson-databind-2.21.4.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.21\jackson-annotations-2.21.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.21.4\jackson-core-2.21.4.jar;C:\Users\admin\.m2\repository\org\lionsoul\ip2region\3.3.7\ip2region-3.3.7.jar;C:\Users\admin\.m2\repository\com\github\ua-parser\uap-java\1.6.1\uap-java-1.6.1.jar;C:\Users\admin\.m2\repository\org\yaml\snakeyamlLine truncated
<property name="sun.cpu.endian" value="little"/>
<property name="user.home" value="C:\Users\admin"/>
<property name="user.language" value="zh"/>
<property name="java.specification.vendor" value="Oracle Corporation"/>
<property name="java.version.date" value="2026-04-21"/>
<property name="java.home" value="D:\devtool\jdk\jdk21"/>
<property name="file.separator" value="\"/>
<property name="basedir" value="D:\workspace\code\fms\fms-api"/>
<property name="java.vm.compressedOopsMode" value="Zero based"/>
<property name="line.separator" value="&#10;"/>
<property name="java.vm.specification.vendor" value="Oracle Corporation"/>
<property name="java.specification.name" value="Java Platform API Specification"/>
<property name="FILE_LOG_CHARSET" value="UTF-8"/>
<property name="java.awt.headless" value="true"/>
<property name="surefire.real.class.path" value="C:\Users\admin\AppData\Local\Temp\surefire3217059004125598218\surefirebooter-20260727215337863_3.jar"/>
<property name="user.script" value=""/>
<property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
<property name="java.runtime.version" value="21.0.11+10-LTS"/>
<property name="user.name" value="admin"/>
<property name="stdout.encoding" value="GBK"/>
<property name="path.separator" value=";"/>
<property name="os.version" value="10.0"/>
<property name="java.runtime.name" value="OpenJDK Runtime Environment"/>
<property name="file.encoding" value="UTF-8"/>
<property name="java.vm.name" value="OpenJDK 64-Bit Server VM"/>
<property name="java.vendor.version" value="Temurin-21.0.11+10"/>
<property name="localRepository" value="C:\Users\admin\.m2\repository"/>
<property name="java.vendor.url.bug" value="https://github.com/adoptium/adoptium-support/issues"/>
<property name="java.io.tmpdir" value="C:\Users\admin\AppData\Local\Temp\"/>
<property name="java.version" value="21.0.11"/>
<property name="user.dir" value="D:\workspace\code\fms\fms-api"/>
<property name="os.arch" value="amd64"/>
<property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
<property name="PID" value="19620"/>
<property name="sun.os.patch.level" value=""/>
<property name="CONSOLE_LOG_CHARSET" value="UTF-8"/>
<property name="native.encoding" value="GBK"/>
<property name="java.library.path" value="D:\devtool\jdk\jdk21\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\devtool\jdk\jdk21\bin;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.6.4.0_x64__8wekyb3d8bbwe;C:\Users\admin\.codex\tmp\arg0\codex-arg0cAewra;D:\devtool\nvm\v24.16.0\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\codex-path;D:\devtool\conda;D:\devtool\conda\Library\mingw-w64\bin;D:\devtool\conda\Library\usr\bin;D:\devtool\conda\Library\bin;D:\devtool\conda\Scripts;D:\devtool\conda\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;C:\Program Files\dotnet;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;D:\soft\Bandizip;D:\devtool\Git\cmd;D:\devtool\nvm;D:\devtool\nodejs;D:\data\sdk\platform-tools;D:\data\sdk\tools;D:\data\sdk\tools;D:\devtool\jdk\jdk17\bin;D:\devtool\maven\bin;D:\devtool\conda\condabin;D:\devtool\mc;C:\Users\admin\AppData\Local\pnpm\bin;C:\Users\admin\AppData\Local\Microsoft\WindowsApps;D:\soft\Microsoft VS Code\bin;D:\devtool\nvm;D:\devtool\nodejs;D:\soft\CodeBuddy CN\bin;."/>
<property name="java.vm.info" value="mixed mode, sharing"/>
<property name="stderr.encoding" value="GBK"/>
<property name="java.vendor" value="Eclipse Adoptium"/>
<property name="java.vm.version" value="21.0.11+10-LTS"/>
<property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
<property name="java.class.version" value="65.0"/>
<property name="LOGGED_APPLICATION_NAME" value="[fms-api] "/>
</properties>
<testcase name="tokenContainsAccountAndSessionClaims" classname="cn.g3soft.fmsapi.utils.JwtUtilsTests" time="0.114"/>
</testsuite>
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.FmsApiApplicationTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.581 s -- in cn.g3soft.fmsapi.FmsApiApplicationTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.database.OrgDataSourceFactoryTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.141 s -- in cn.g3soft.fmsapi.database.OrgDataSourceFactoryTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.database.OrgDatabaseConfigLoaderTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.129 s -- in cn.g3soft.fmsapi.database.OrgDatabaseConfigLoaderTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests
-------------------------------------------------------------------------------
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.015 s -- in cn.g3soft.fmsapi.exception.GlobalExceptionHandlerTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.service.ActiveSessionRegistryTests
-------------------------------------------------------------------------------
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s -- in cn.g3soft.fmsapi.service.ActiveSessionRegistryTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.service.AuthServiceTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.192 s -- in cn.g3soft.fmsapi.service.AuthServiceTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.service.DataSaveServiceTests
-------------------------------------------------------------------------------
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.414 s -- in cn.g3soft.fmsapi.service.DataSaveServiceTests
@@ -0,0 +1,4 @@
-------------------------------------------------------------------------------
Test set: cn.g3soft.fmsapi.utils.JwtUtilsTests
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.114 s -- in cn.g3soft.fmsapi.utils.JwtUtilsTests
-5
View File
@@ -34,10 +34,5 @@
"unplugin-auto-import": "^21.0.0",
"unplugin-vue-components": "^32.1.0",
"vite": "^8.1.1"
},
"pnpm": {
"patchedDependencies": {
"stk-table-vue@1.0.0": "patches/stk-table-vue@1.0.0.patch"
}
}
}
+2 -7
View File
@@ -4,11 +4,6 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
patchedDependencies:
stk-table-vue@1.0.0:
hash: fbea7319b3c9d3c3810998e779324073ad00e23523d1504199fbad4a40ee6933
path: patches/stk-table-vue@1.0.0.patch
importers:
.:
@@ -36,7 +31,7 @@ importers:
version: 4.7.1(pinia@4.0.2(@vue/devtools-api@8.1.5)(vue@3.5.39))
stk-table-vue:
specifier: ^1.0.0
version: 1.0.0(patch_hash=fbea7319b3c9d3c3810998e779324073ad00e23523d1504199fbad4a40ee6933)
version: 1.0.0
vue:
specifier: ^3.5.39
version: 3.5.39
@@ -2850,7 +2845,7 @@ snapshots:
source-map@0.6.1:
optional: true
stk-table-vue@1.0.0(patch_hash=fbea7319b3c9d3c3810998e779324073ad00e23523d1504199fbad4a40ee6933): {}
stk-table-vue@1.0.0: {}
stream-parser@0.3.1:
dependencies:
@@ -200,6 +200,7 @@ const selectionColumn = createSelectionColumn({
getDataSource: () => props.dataSource,
getRowKey,
getSelectedRowKeys: () => props.rowSelection?.selectedRowKeys ?? [],
isRowDisabled: (row) => Boolean(props.rowSelection?.getCheckboxProps?.(row)?.disabled),
onChange: (keys, rows) => props.rowSelection?.onChange?.(keys, rows),
});
@@ -213,6 +214,17 @@ async function scrollToRow(rowKey) {
table.scrollTo(idx * rowHeight, null);
}
// 新增行等程序化场景使用:滚动到目标行,并让该行立即进入编辑状态。
// activeRowKey 仅控制当前行高亮,不应隐式触发编辑,因此单独暴露此方法。
async function editRow(rowKey, focusCol = null) {
await scrollToRow(rowKey);
await nextTick();
const row = props.dataSource.find((item) => String(getRowKey(item)) === String(rowKey));
if (!row) return;
tableRef.value?.setCurrentRow?.(row, { silent: true });
activateEditing(row, focusCol);
}
function getSelectedArea() {
return tableRef.value?.getSelectedArea?.();
}
@@ -388,6 +400,7 @@ onBeforeUnmount(() => {
defineExpose({
scrollToRow,
editRow,
getSelectedArea,
clearSelectedArea,
setRowExpand,
@@ -455,6 +468,11 @@ defineExpose({
line-height: 1;
margin: 0;
&.disabled {
cursor: not-allowed;
opacity: 0.45;
}
input {
position: absolute;
width: 0;
@@ -24,6 +24,12 @@ function notifyChange(ctx, editor, row, col, value) {
ctx.onChange(row, col, value);
}
function isEditorDisabled(editor, row) {
return typeof editor.disabled === "function"
? Boolean(editor.disabled(row))
: Boolean(editor.disabled);
}
function createFocusHandler(ctx, row, col, selectText = false) {
return ({ component, el }) => {
if (!ctx.shouldFocus(row, col)) return;
@@ -109,6 +115,10 @@ function createCheckbox(row, col, editor, ctx) {
? "fms-checkbox fms-cell-editor-root checked"
: "fms-checkbox fms-cell-editor-root",
onClick: stop,
// StkTable 在 mousedown 阶段处理单元格选区和行编辑。checkbox 是
// 始终可直接操作的控件,需要在该阶段隔离事件,避免第一次点击
// 只激活编辑态、第二次点击才真正切换。
onMousedown: stop,
},
[
h("input", {
@@ -127,6 +137,7 @@ function createCheckbox(row, col, editor, ctx) {
update(value);
},
onClick: stop,
onMousedown: stop,
onVnodeMounted: focus,
onVnodeUpdated: focus,
}),
@@ -138,6 +149,9 @@ function createCheckbox(row, col, editor, ctx) {
export function createEditableCell(col, ctx) {
const editor = col.editor;
return ({ row }) => {
if (isEditorDisabled(editor, row)) {
return displayValue(row, col, editor);
}
// checkbox 始终可交互,点击即切换,无需先让整行进入编辑态
if (editor?.type === "checkbox") {
return createCheckbox(row, col, editor, ctx);
@@ -15,7 +15,13 @@ const stop = (e) => e.stopPropagation();
* @param {Function} options.onChange - 选中变化回调 (keys, rows)
* @returns {Object} selectionColumn
*/
export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRowKeys, onChange }) {
export function createSelectionColumn({
getDataSource,
getRowKey,
getSelectedRowKeys,
isRowDisabled = () => false,
onChange,
}) {
// 已选 key 集合,内部响应式计算,仅对外暴露 column 对象
const selectedRowKeySet = computed(() => new Set(getSelectedRowKeys()));
const rowByKey = computed(() => {
@@ -30,6 +36,7 @@ export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRow
}
function changeRow(row, checked) {
if (isRowDisabled(row)) return;
const nextKeys = new Set(selectedRowKeySet.value);
const key = getRowKey(row);
if (checked) nextKeys.add(key);
@@ -40,6 +47,7 @@ export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRow
function changeAll(checked) {
const nextKeys = new Set(selectedRowKeySet.value);
getDataSource().forEach((row) => {
if (isRowDisabled(row)) return;
const key = getRowKey(row);
if (checked) nextKeys.add(key);
else nextKeys.delete(key);
@@ -50,11 +58,12 @@ export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRow
// 行复选框:原生 <input type="checkbox">,零组件开销
const SelectionCell = ({ row }) => {
const key = getRowKey(row);
const disabled = isRowDisabled(row);
const checked = selectedRowKeySet.value.has(key);
return h(
"label",
{
class: checked ? "fms-checkbox checked" : "fms-checkbox",
class: ["fms-checkbox", { checked, disabled }],
onClick: stop,
onMousedown: stop,
},
@@ -62,6 +71,7 @@ export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRow
h("input", {
type: "checkbox",
checked,
disabled,
onChange: (e) => {
e.stopPropagation();
changeRow(row, e.target.checked);
@@ -76,7 +86,7 @@ export function createSelectionColumn({ getDataSource, getRowKey, getSelectedRow
// 表头只统计当前数据中的选中项,避免筛选后被隐藏的 key 干扰状态。
const SelectionHeaderCell = () => {
const rows = getDataSource();
const rows = getDataSource().filter((row) => !isRowDisabled(row));
let selectedCount = 0;
for (const key of selectedRowKeySet.value) {
if (rowByKey.value.has(key)) selectedCount++;
-38
View File
@@ -79,44 +79,6 @@ export function pageDataApi({
});
}
/**
* 分页查询登录日志(只读列表)。
* 通过通用分页接口加载 s_log_login 表,支持按账号(模糊)、登录结果、登录时间范围筛选。
* @param {object} options
* @param {string} [options.account] 账号关键字
* @param {0|1} [options.result] 登录结果:1 成功 / 0 失败
* @param {[Dayjs, Dayjs]} [options.range] 登录时间范围(antdv RangePicker 的 dayjs 值)
* @param {number} [options.pageNo=1]
* @param {number} [options.pageSize=20]
* @returns {Promise<ApiResult<{rows: object[], total: number}>>} 分页响应。
*/
export function pageLoginLogApi({ account, result, range, pageNo = 1, pageSize = 20 } = {}) {
const conditions = [];
if (account && account.trim()) {
const safe = account.trim().replace(/'/g, "''");
conditions.push(`b_account LIKE N'%${safe}%'`);
}
if (result === 1 || result === 0) {
conditions.push(`b_login_result = ${result}`);
}
if (Array.isArray(range) && range.length === 2 && range[0] && range[1]) {
const fmt = (v) =>
v && typeof v.format === "function"
? v.format("YYYY-MM-DD")
: new Date(v).toISOString().slice(0, 10);
conditions.push(`b_login_time >= '${fmt(range[0])} 00:00:00'`);
conditions.push(`b_login_time <= '${fmt(range[1])} 23:59:59'`);
}
const searchCondition = conditions.length ? conditions.join(" AND ") : null;
return pageDataApi({
viewName: "s_log_login",
orderBy: "b_login_time DESC",
searchCondition,
pageNo,
pageSize,
});
}
/**
* 在同一事务中保存一个或多个表的数据变更。
* @param {{table: string, key_field: string, inserts?: object[], updates?: object[], deletes?: object[]}[]} requests 保存配置,不能为空数组。
+19
View File
@@ -6,6 +6,18 @@ export const I18N_LOCALES = [
export const I18N_LOCALE_CODES = I18N_LOCALES.map((item) => item.value);
// 与数据库 s_module 的 CHECK 约束 CK_s_module_code 保持一致:
// 长度 2-50,以小写字母开头,仅含小写字母/数字/下划线。
export function validateModuleCode(code) {
const value = String(code ?? "").trim();
if (!value) return "编码不能为空";
if (value.length < 2 || value.length > 50) return "编码长度需为 2-50 个字符";
if (!/^[a-z][a-z0-9_]*$/.test(value)) {
return "编码须以小写字母开头,且只能包含小写字母、数字和下划线";
}
return "";
}
export function getI18nNamespace(key) {
return String(key || "").split(".", 1)[0] || "common";
}
@@ -22,6 +34,13 @@ export function buildModuleItemI18nKey(prefix, moduleCode, itemCode) {
: null;
}
export function buildModuleI18nKey(moduleType, moduleCode) {
const normalizedModuleCode = String(moduleCode || "").trim();
if (!normalizedModuleCode) return null;
const prefix = moduleType === "data" ? "module" : "menu";
return `${prefix}.${normalizedModuleCode}`;
}
export function syncModuleItemI18nKeys(rows, prefix, moduleCode, codeField) {
let changed = false;
for (const row of rows || []) {
@@ -1,6 +1,7 @@
<script setup>
import { computed, ref, watch } from "vue";
import { Languages } from "@lucide/vue";
import { buildModuleI18nKey } from "@/utils/i18n";
import I18nQuickSetModal from "./I18nQuickSetModal.vue";
const props = defineProps({
@@ -36,20 +37,27 @@ function setField(field, value) {
emitUpdate();
}
// 多语言键由模块编码自动生成(module.<编码>),无需手动填写。
// 目录和页面使用 menu.<编码>,数据模块使用 module.<编码>。
// 编码变化时始终以完整编码重新派生,避免只生成首字母后不再更新。
function onCodeInput(v) {
setField("b_code", v);
if (v) {
formData.value.b_i18n = `module.${v}`;
emitUpdate();
}
// 编码变化时始终以完整编码重新派生多语言键(清空编码时键也随之清空,保持跟随)。
formData.value.b_i18n = buildModuleI18nKey(formData.value.b_module_type, v);
emitUpdate();
}
function onModuleTypeChange(v) {
formData.value.b_module_type = v;
formData.value.b_i18n = buildModuleI18nKey(v, formData.value.b_code);
emitUpdate();
}
const i18nModalRef = ref(null);
function openI18nModal() {
const key = formData.value?.b_i18n || `module.${formData.value?.b_code || ""}`;
const key =
formData.value?.b_i18n ||
buildModuleI18nKey(formData.value?.b_module_type, formData.value?.b_code);
i18nModalRef.value?.open(key, formData.value?.b_name || "");
}
@@ -83,12 +91,7 @@ function onI18nSaved(key) {
{ label: '页面', value: 'page' },
{ label: '数据', value: 'data' },
]"
@update:value="
(v) => {
formData.b_module_type = v;
emitUpdate();
}
"
@update:value="onModuleTypeChange"
/>
</a-form-item>
</a-col>
@@ -14,7 +14,7 @@ import { createTempId } from "@/utils/tempId";
const props = defineProps({
moduleId: { type: String, required: true },
i18nKeys: { type: Array, default: () => [] },
i18nItems: { type: Array, default: () => [] },
loading: { type: Boolean, default: false },
});
@@ -31,6 +31,66 @@ const activeKey = ref(null);
const tableRef = ref(null);
let loadRequestId = 0;
const managedItems = computed(() => (props.i18nItems || []).filter((item) => item?.managed));
const requestedKeys = computed(() => [
...new Set(
(props.i18nItems || [])
.flatMap((item) => [item?.key, item?.sourceKey])
.filter(Boolean)
.map(String),
),
]);
function isManagedRow(row) {
return Boolean(row?._managedId);
}
// 保证模块、字段、权限的受管键始终存在。简体中文为空或仍为上一次默认名称时,
// 自动跟随当前名称;人工修改后的翻译不再被名称变化覆盖。
// itemsOverride 用于保存时按最终草稿态生成受管键(不传则使用 props.i18nItems)。
function reconcileManagedRows(itemsOverride) {
const items = itemsOverride || managedItems.value;
const rows = [...pivotRows.value];
const rowByManagedId = new Map(
rows.filter((row) => row._managedId).map((row) => [String(row._managedId), row]),
);
const unclaimedByKey = new Map(
rows.filter((row) => !row._managedId).map((row) => [String(row.b_key), row]),
);
const currentManagedIds = new Set();
for (const item of items) {
const managedId = String(item.id || item.key);
currentManagedIds.add(managedId);
let row =
rowByManagedId.get(managedId) ||
unclaimedByKey.get(String(item.key)) ||
unclaimedByKey.get(String(item.sourceKey));
if (!row) {
row = { _id: createTempId(), b_key: item.key, _localeIds: {} };
rows.push(row);
}
const previousDefault = row._defaultValue;
const nextDefault = item.defaultValue == null ? "" : String(item.defaultValue);
if (row["zh-CN"] == null || row["zh-CN"] === "" || row["zh-CN"] === previousDefault) {
row["zh-CN"] = nextDefault;
}
row.b_key = String(item.key);
row._managedId = managedId;
row._defaultValue = nextDefault;
row._sortType = String(item.key).split(".", 1)[0];
}
// 已从模块配置中移除的条目不再受保护,保留其翻译供管理员自行处理。
for (const row of rows) {
if (!row._managedId || currentManagedIds.has(String(row._managedId))) continue;
delete row._managedId;
delete row._defaultValue;
}
pivotRows.value = rows;
}
async function loadLangTypes() {
try {
const res = await loadDataApi("b_i18n_type", "b_canuse = 1", "b_xh ASC, b_id ASC");
@@ -66,7 +126,7 @@ async function loadI18n() {
const requestId = ++loadRequestId;
isLoading.value = true;
try {
const keys = [...new Set((props.i18nKeys || []).filter(Boolean).map(String))];
const keys = requestedKeys.value;
const quotedKeys = keys.map((key) => "'" + key.replace(/'/g, "''") + "'");
const where = keys.length ? "b_key IN (" + quotedKeys.join(", ") + ")" : null;
const [i18nRes] = await Promise.all([
@@ -84,6 +144,7 @@ async function loadI18n() {
if (requestId !== loadRequestId) return;
originalsFlat.value = cloneData(flat);
pivotRows.value = buildPivot(flat);
reconcileManagedRows();
} catch (e) {
if (requestId === loadRequestId) message.error("加载多语言失败:" + (e.message || e));
} finally {
@@ -107,12 +168,14 @@ async function refreshKey(key) {
...cloneData(rows),
];
pivotRows.value = [...pivotRows.value.filter((row) => row.b_key !== key), ...buildPivot(rows)];
reconcileManagedRows();
} catch (e) {
message.error("刷新多语言失败:" + (e.message || e));
}
}
watch(() => props.moduleId, loadI18n, { immediate: true });
watch(() => props.i18nItems, reconcileManagedRows, { deep: true });
async function addRow() {
if (props.loading || isLoading.value) return;
@@ -122,11 +185,11 @@ async function addRow() {
activeKey.value = String(newId);
await nextTick();
tableRef.value?.scrollToRow(String(newId));
await tableRef.value?.editRow(String(newId), "b_key");
}
function deleteRow(record) {
if (props.loading || isLoading.value) return;
if (props.loading || isLoading.value || isManagedRow(record)) return;
pivotRows.value = pivotRows.value.filter((r) => r._id !== record._id);
// 同步清理选择状态,避免选中项被删后 keys 残留
const k = String(record._id);
@@ -140,15 +203,22 @@ function deleteRow(record) {
const selectedRowKeys = ref([]);
const rowSelection = computed(() => ({
selectedRowKeys: selectedRowKeys.value,
onChange: (keys) => {
selectedRowKeys.value = keys;
getCheckboxProps: (row) => ({ disabled: isManagedRow(row) }),
onChange: (keys, rows) => {
const selectableKeys = new Set(
(rows || []).filter((row) => !isManagedRow(row)).map((row) => String(row._id)),
);
selectedRowKeys.value = keys.map(String).filter((key) => selectableKeys.has(key));
},
}));
// 批量删除选中行(整条 key,含其全部语言)
function batchDelete() {
if (props.loading || isLoading.value) return;
const keys = selectedRowKeys.value;
const managedRowKeys = new Set(
pivotRows.value.filter(isManagedRow).map((row) => String(row._id)),
);
const keys = selectedRowKeys.value.filter((key) => !managedRowKeys.has(String(key)));
if (!keys.length) return;
Modal.confirm({
title: `确定删除选中的 ${keys.length} 条记录?`,
@@ -216,16 +286,33 @@ function markSaved() {
originalsFlat.value = cloneData(flatten(pivotRows.value));
}
defineExpose({ buildSaveRequest, markSaved, mergeDefaults, refreshKey });
defineExpose({ buildSaveRequest, markSaved, mergeDefaults, refreshKey, reconcileManagedRows });
const displayedData = computed(() => {
if (!searchKey.value) return pivotRows.value;
const kw = searchKey.value.toLowerCase();
return pivotRows.value.filter((r) => (r.b_key || "").toLowerCase().includes(kw));
const rows = kw
? pivotRows.value.filter((row) => (row.b_key || "").toLowerCase().includes(kw))
: pivotRows.value;
const sortOrder = { menu: 0, module: 0, field: 1, power: 2 };
return [...rows].sort((left, right) => {
const leftType = left._sortType || String(left.b_key || "").split(".", 1)[0];
const rightType = right._sortType || String(right.b_key || "").split(".", 1)[0];
return (
(sortOrder[leftType] ?? 3) - (sortOrder[rightType] ?? 3) ||
String(left.b_key || "").localeCompare(String(right.b_key || ""))
);
});
});
const columns = computed(() => {
const cols = [{ dataIndex: "b_key", title: "键", width: 240, editor: { type: "input" } }];
const cols = [
{
dataIndex: "b_key",
title: "键",
width: 240,
editor: { type: "input", disabled: (row) => isManagedRow(row) },
},
];
for (const opt of langOptions.value) {
cols.push({
dataIndex: opt.value,
@@ -244,6 +331,7 @@ const columns = computed(() => {
type: "delete",
label: "删除",
confirm: "确定删除该记录(含其全部语言)?",
disabled: (row) => isManagedRow(row),
onClick: (row) => deleteRow(row),
},
],
@@ -53,7 +53,7 @@ async function addRow() {
activeKey.value = String(newId);
await nextTick();
tableRef.value?.scrollToRow(String(newId));
await tableRef.value?.editRow(String(newId), "b_code");
}
function deleteRow(record) {
@@ -13,7 +13,12 @@ import {
hasChanges,
} from "@/utils/dataChanges";
import { createTempId } from "@/utils/tempId";
import { buildModuleItemI18nKey, syncModuleItemI18nKeys } from "@/utils/i18n";
import {
buildModuleI18nKey,
buildModuleItemI18nKey,
syncModuleItemI18nKeys,
validateModuleCode,
} from "@/utils/i18n";
import { Plus } from "@lucide/vue";
import ModuleBasicPanel from "./components/ModuleBasicPanel.vue";
import ModuleFieldsPanel from "./components/ModuleFieldsPanel.vue";
@@ -95,17 +100,61 @@ const isCurrentModule = computed(
() =>
loadedModuleId.value != null && String(loadedModuleId.value) === String(selectedModuleId.value),
);
const i18nKeys = computed(() => {
const keys = new Set();
const add = (key) => {
if (key) keys.add(String(key));
// 构建受管多语言项。managedSource 提供模块/字段/权限的受管键来源,
// plainSource 提供分组/列表标题等非受管键来源(手动填写,需即时反馈)。
function buildI18nItems(managedSource, plainSource) {
const items = new Map();
const add = (item) => {
if (!item.key) return;
const key = String(item.key);
const existing = items.get(key);
items.set(key, existing?.managed ? existing : { ...item, key });
};
add(drafts.value.module?.b_i18n);
for (const section of ["fields", "groups", "listConfig", "powers"]) {
for (const row of drafts.value[section] || []) add(row.b_i18n);
const module = managedSource.module;
if (module?.b_code) {
const moduleKey = buildModuleI18nKey(module.b_module_type, module.b_code);
add({
id: `module:${module.b_id}`,
key: moduleKey,
sourceKey: module.b_i18n,
defaultValue: module.b_name || module.b_code,
managed: true,
});
}
return [...keys];
});
for (const field of managedSource.fields || []) {
add({
id: `field:${field.b_id}`,
key: buildModuleItemI18nKey("field", module?.b_code, field.b_field),
sourceKey: field.b_i18n,
defaultValue: field.b_name || field.b_field,
managed: true,
});
}
for (const power of managedSource.powers || []) {
add({
id: `power:${power.b_id}`,
key: buildModuleItemI18nKey("power", module?.b_code, power.b_code),
sourceKey: power.b_i18n,
defaultValue: power.b_name || power.b_code,
managed: true,
});
}
// 分组和列表标题仍显示在本模块的多语言面板中,但不是系统生成的受管键。
for (const section of ["groups", "listConfig"]) {
for (const row of plainSource[section] || []) {
add({ key: row.b_i18n, managed: false });
}
}
return [...items.values()];
}
// 实时展示:受管键基于已保存快照(originals),编辑过程中不随草稿实时生成;
// 非受管键(分组/列表标题)基于草稿,保留手动编辑的即时反馈。
const i18nItems = computed(() => buildI18nItems(originals.value, drafts.value));
// 保存时:受管键基于最终草稿态(drafts),此时才按模块编码生成并落库。
const finalI18nItems = computed(() => buildI18nItems(drafts.value, drafts.value));
const referencedGroupIds = computed(() => {
const ids = new Set();
for (const section of ["listConfig", "editConfig"]) {
@@ -435,7 +484,24 @@ async function onDeleteNodeById(moduleId) {
return;
}
try {
await saveObjectApi([{ table: "s_module", key_field: "b_id", deletes: [{ b_id: moduleId }] }]);
const id = String(moduleId);
const deleteByModuleId = (table) => ({
table,
key_field: "b_module_id",
deletes: [{ b_module_id: id }],
});
await saveObjectApi([
deleteByModuleId("b_user_module"),
deleteByModuleId("b_user_power"),
deleteByModuleId("s_module_field_list"),
deleteByModuleId("s_module_field_edit"),
deleteByModuleId("s_module_field_query"),
deleteByModuleId("s_module_power"),
deleteByModuleId("s_module_field"),
deleteByModuleId("s_module_field_group"),
{ table: "s_module", key_field: "b_id", deletes: [{ b_id: id }] },
]);
message.success("模块已删除");
if (selectedModuleId.value === moduleId) {
selectedModuleId.value = null;
@@ -460,10 +526,16 @@ async function saveAll() {
// s_module 主表
const moduleData = drafts.value.module;
const moduleOriginal = originals.value.module;
if (!String(moduleData?.b_code || "").trim()) {
const moduleCode = String(moduleData?.b_code || "").trim();
if (!moduleCode) {
message.warning(`请填写${moduleData?.b_module_type === "data" ? "模块编码" : "菜单编码"}`);
return;
}
const codeError = validateModuleCode(moduleCode);
if (codeError) {
message.error(`编码格式不正确:${codeError}`);
return;
}
if (!String(moduleData?.b_name || "").trim()) {
message.warning("请填写模块名称");
return;
@@ -478,6 +550,7 @@ async function saveAll() {
}
syncModuleItemI18nKeys(drafts.value.fields, "field", moduleData.b_code, "b_field");
syncModuleItemI18nKeys(drafts.value.powers, "power", moduleData.b_code, "b_code");
moduleData.b_i18n = buildModuleI18nKey(moduleData.b_module_type, moduleData.b_code);
const isNew = !moduleOriginal?.b_code;
if (moduleData && JSON.stringify(moduleData) !== JSON.stringify(moduleOriginal)) {
saveReqs.push({
@@ -502,6 +575,13 @@ async function saveAll() {
const req = tableChange(table, changes);
if (hasChanges(req)) {
await allocateTemporaryIds([req.inserts || [], req.updates || [], req.deletes || []]);
if (table === "s_module_power" && changes.deletes.length) {
saveReqs.push({
table: "b_user_power",
key_field: "b_power_id",
deletes: changes.deletes.map(({ b_id }) => ({ b_power_id: String(b_id) })),
});
}
saveReqs.push(req);
}
}
@@ -510,6 +590,10 @@ async function saveAll() {
if (currentOperationId !== operationId || String(selectedModule.value?.b_id) !== moduleId)
return;
const i18nPanel = i18nPanelRef.value;
if (i18nPanel && typeof i18nPanel.reconcileManagedRows === "function") {
// 保存时才按最终草稿态生成受管键(模块编码/字段/权限),避免编辑过程中实时生成。
i18nPanel.reconcileManagedRows(finalI18nItems.value);
}
if (typeof i18nPanel?.buildSaveRequest === "function") {
const i18nReq = await i18nPanel.buildSaveRequest();
if (i18nReq) saveReqs.push(i18nReq);
@@ -859,19 +943,6 @@ void loadTree().catch((e) => message.error("模块树加载失败:" + (e.messa
/>
</a-space>
</div>
<span class="mm-header-title">{{
selectedModule.b_name || selectedModule.b_code
}}</span>
<span class="mm-header-code">{{ selectedModule.b_code || "(未设置编码)" }}</span>
<span class="mm-header-type">
<a-tag>{{
selectedModule.b_module_type === "directory"
? "目录"
: selectedModule.b_module_type === "page"
? "页面"
: "数据"
}}</a-tag>
</span>
</div>
<!-- Tab 面板 -->
@@ -943,7 +1014,7 @@ void loadTree().catch((e) => message.error("模块树加载失败:" + (e.messa
v-else-if="tab.key === 'i18n'"
:ref="setI18nPanelRef"
:module-id="String(selectedModule.b_id)"
:i18n-keys="i18nKeys"
:i18n-items="i18nItems"
:loading="busy"
/>
</a-tab-pane>
@@ -1051,22 +1122,6 @@ void loadTree().catch((e) => message.error("模块树加载失败:" + (e.messa
justify-content: center;
}
.mm-header-title {
font-size: 16px;
font-weight: 600;
color: var(--fms-text);
}
.mm-header-code {
font-size: 13px;
color: var(--fms-text-secondary);
font-family: monospace;
}
.mm-header-type {
flex: none;
}
.mm-body {
flex: 1;
min-height: 0;
+2 -1
View File
@@ -260,11 +260,12 @@ s_module / s_module_field / s_module_field_list / s_module_field_group / s_modul
| --- | --- | --- |
| `b_id` | `bigint` | 雪花 ID 主键 |
| `b_user_id` | `bigint` | 用户雪花 ID |
| `b_module_id` | `bigint` | 所属模块 ID |
| `b_power_id` | `bigint` | `s_module_power.b_id` |
| `b_inputuser_id` | `bigint` | 授权人雪花 ID |
| `b_inputdatetime` | `datetime` | 授权时间 |
约束:`b_power_id` 外键引用 `s_module_power.b_id`,`(b_user_id, b_power_id)` 唯一。
逻辑关联:`b_module_id` 对应 `s_module.b_id`,`b_power_id` 对应 `s_module_power.b_id`;`(b_user_id, b_power_id)` 唯一。建议建立 `(b_module_id, b_user_id)` 索引。
权限规则: