diff --git a/docs/task/222-Admin修复AI服务商配置新增后未落库.md b/docs/task/222-Admin修复AI服务商配置新增后未落库.md new file mode 100644 index 0000000..38dfc6a --- /dev/null +++ b/docs/task/222-Admin修复AI服务商配置新增后未落库.md @@ -0,0 +1,64 @@ +# 222 Admin:修复 AI 服务商配置新增后未落库 + +- 类型:缺陷 +- 父级大工单:#14 +- 所属 MVP / 版本:#199 / AI规格批量匹配 +- 状态:已完成,待用户验收 +- 日期:2026-08-14 +- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/222 + +## 背景与目标 + +管理员在“AI 配置”提交合法服务商信息后,页面执行正常的 `303 See Other` 跳转,但新增 +配置没有落库,因而无法继续保存 API Key、测试连接和启用。目标是恢复新增流程,并让默认 +测试在不依赖真实 MySQL 时也能捕获 SQL 参数数量错误。 + +## 最终方案 + +`InsertAIProvider` 的字段列表在两个固定值后只剩创建人、更新人、创建时间和更新时间四个 +字段,原 SQL 却提供了五个尾部占位符。现已把尾部占位符改为四个,使总计 11 个占位符与 +11 个实参逐项对应。 + +新增轻量假 `Execer` 测试,在默认测试环境核对占位符数量、参数数量、参数顺序以及固定的 +`enabled=0`、`last_test_status='pending'`。另增加 MySQL 集成用例验证新增、列表回显、 +`create` 审计、重名拒绝和失败事务一致性,并增加 Web 测试区分成功/校验失败的 303 跳转与 +数据库异常的 500 响应。 + +本次没有数据库结构变化,不增加迁移,也不改变 API Key 的独立密钥存储流程。此前失败的 +新增请求没有成功提交,不需要清理数据。 + +## 改了哪些 + +- `admin/repository/ai_config.go`:修正新增配置 INSERT 占位符数量。 +- `admin/repository/ai_config_test.go`:增加无需数据库的 SQL 参数契约测试。 +- `admin/service/ai_config_test.go`:增加真实 MySQL 新增、审计、查询、重名和事务测试。 +- `admin/handler/web/ai_config_test.go`:增加 303 成功/错误参数、500 数据库异常以及真实 + MySQL 页面提交后的列表回显测试。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| 合法配置可以执行参数数量正确的 INSERT,跳转后可由列表查询 | 通过;真实 MySQL 项已编写但当前环境跳过 | +| 默认测试保护占位符数量和字段参数顺序 | 通过 | +| 配置与 create 审计同事务,失败不留半条数据 | 通过;真实 MySQL 项已编写但当前环境跳过 | +| 重名和非法输入不新增并给出明确错误 | 通过;重名真实 MySQL项当前环境跳过 | +| 成功 303 使用 msg,校验失败使用 error,数据库异常返回 500 | 通过 | +| 不改 schema 和 API Key 独立保存流程 | 通过 | +| 固定 Go 1.23.0 的 build、test、vet | 通过 | + +## 测试 + +- 执行的命令: + - `go test ./repository ./service ./handler/web -run 'Test(InsertAIProvider|SaveAIProviderConfig|RedirectAIConfig|AIConfigSave_)' -count=1 -v` + - `$env:GOTOOLCHAIN='go1.23.0'; go build ./...; go test ./... -count=1; go vet ./...` + - `git diff --check` +- 结果:默认 SQL 契约和 Web 回归测试通过;固定 Go 1.23.0 的完整构建、测试和 vet 通过。 + MySQL 专项用例被测试套件发现,并在未设置测试库开关时明确跳过。 +- **没验证到的部分**:当前环境没有启用 `CMAUTOBUY_MYSQL_TEST=1` 的独立 MySQL 8.4 + `_test` 基础库,因此没有实际执行新增、审计和列表回显集成用例;没有使用生产库代替。 + 未在用户当前浏览器中重新提交表单进行人工验收。 + +## 相关提交 + +- `01469f7` fix: 修复 AI 服务商配置新增失败 (#222)