重构:统一 IoT 模型到 internal/model/ 目录

将所有 IoT 相关的数据模型从 internal/iot/model/ 迁移到 internal/model/,
实现全局统一的模型层架构,符合项目横向分层设计原则。

变更内容:
- 迁移 11 个 IoT 模型文件(carrier, iot_card, device, order, package 等)
- 删除 internal/iot/model/ 目录
- 更新文档中的模型路径引用(25 处)
- 创建重构总结文档
- 归档 OpenSpec 变更为 2026-01-12-refactor-iot-model-location
- 创建 model-organization 规格文档

验证结果:
- 编译通过(go build 成功)
- 静态分析通过(go vet 无错误)
- 代码格式通过(go fmt 无变更)
- 无 Go 代码引用旧路径

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-12 16:01:53 +08:00
parent 034f00e2e7
commit 867e97af11
30 changed files with 1158 additions and 75 deletions

View File

@@ -0,0 +1,107 @@
# 提案:将 IoT 模型迁移到统一的 internal/model/ 目录
## 动机 (Motivation)
当前 IoT 模块的数据模型被放置在 `internal/iot/model/` 目录下,这与项目的其他模型(如 Shop、Account、Enterprise 等)不一致。其他模型都统一放在 `internal/model/` 目录下。
**存在的问题:**
1. **目录结构不一致**IoT 模型使用 `internal/iot/model/`,而其他模型使用 `internal/model/`,导致项目结构混乱
2. **导入路径冗余**:引用 IoT 模型时需要写 `internal/iot/model`,而其他模型只需要 `internal/model`
3. **违反项目约定**:根据 `openspec/project.md` 的架构规范,所有模型应该统一在 Model 层管理
4. **可维护性下降**:新开发者容易困惑,不知道应该把模型放在哪里
**当前 IoT 模型文件清单11 个文件):**
- `internal/iot/model/carrier.go` - 运营商模型
- `internal/iot/model/commission.go` - 佣金模型
- `internal/iot/model/data_usage.go` - 流量使用记录模型
- `internal/iot/model/device.go` - 设备模型
- `internal/iot/model/financial.go` - 财务记录模型
- `internal/iot/model/iot_card.go` - IoT 卡模型
- `internal/iot/model/number_card.go` - 号卡模型
- `internal/iot/model/order.go` - 订单模型
- `internal/iot/model/package.go` - 套餐模型
- `internal/iot/model/polling.go` - 轮询配置模型
- `internal/iot/model/system.go` - 系统配置模型
## 提案内容 (Proposed Change)
将所有 IoT 相关模型从 `internal/iot/model/` 迁移到 `internal/model/`,与项目的其他模型保持一致。
**迁移方案:**
1.`internal/iot/model/` 目录下的所有 `.go` 文件移动到 `internal/model/`
2. 所有文件的包名保持为 `package model`(无需修改)
3. 删除空的 `internal/iot/model/` 目录
4. 检查是否有其他代码引用了 `internal/iot/model`,如果有则更新导入路径(当前搜索未发现引用)
5. 验证所有模型文件的包名一致性,确保都是 `package model`
**目标结构:**
```
internal/
├── model/ # 统一的模型目录
│ ├── account.go
│ ├── shop.go
│ ├── enterprise.go
│ ├── personal_customer.go
│ ├── role.go
│ ├── permission.go
│ ├── carrier.go # ← 从 internal/iot/model/ 迁移
│ ├── commission.go # ← 从 internal/iot/model/ 迁移
│ ├── data_usage.go # ← 从 internal/iot/model/ 迁移
│ ├── device.go # ← 从 internal/iot/model/ 迁移
│ ├── financial.go # ← 从 internal/iot/model/ 迁移
│ ├── iot_card.go # ← 从 internal/iot/model/ 迁移
│ ├── number_card.go # ← 从 internal/iot/model/ 迁移
│ ├── order.go # ← 从 internal/iot/model/ 迁移
│ ├── package.go # ← 从 internal/iot/model/ 迁移
│ ├── polling.go # ← 从 internal/iot/model/ 迁移
│ ├── system.go # ← 从 internal/iot/model/ 迁移
│ ├── ...
├── iot/ # IoT 业务逻辑目录
│ ├── handler.go # 未来IoT Handler 层
│ ├── service.go # 未来IoT Service 层
│ └── store.go # 未来IoT Store 层
└── ...
```
## 影响范围 (Impact)
**好消息:** 经过代码搜索,目前 **没有发现任何代码引用 `internal/iot/model`**,因此这是一个零影响的重构。
**潜在风险:**
- 如果未来有代码在提案实施期间新增了对 `internal/iot/model` 的引用,需要同步更新
- 数据库迁移脚本不受影响(模型位置变更不影响表结构)
**不影响的部分:**
- 数据库表结构
- API 接口
- 业务逻辑
- 测试代码(如果存在)
## 实施计划 (Implementation Plan)
1. **移动文件**:将 11 个模型文件从 `internal/iot/model/` 移动到 `internal/model/`
2. **删除空目录**:删除 `internal/iot/model/` 目录
3. **验证包名**:确认所有模型文件的包名都是 `package model`
4. **搜索引用**:再次搜索项目中是否有 `internal/iot/model` 的引用,如有则更新
5. **运行测试**:执行 `go test ./...` 确保没有破坏性变更
6. **构建验证**:执行 `go build` 确保项目可以正常编译
## 验收标准 (Acceptance Criteria)
- [x] 所有 IoT 模型文件已迁移到 `internal/model/` 目录
- [x] `internal/iot/model/` 目录已删除
- [x] 项目可以正常编译(`go build` 成功)
- [x] 所有测试通过(如果存在测试)
- [x] 项目中不存在 `internal/iot/model` 的引用(已更新文档中的引用)
## 参考资料 (References)
- 项目架构规范:`openspec/project.md`
- 现有模型目录:`internal/model/`
- IoT 相关规格:`openspec/specs/iot-card/spec.md`