## Why 在之前的 IoT SIM 管理系统提案(2026-01-12-iot-sim-management)中创建的所有数据模型存在严重的架构违规问题,完全没有遵循项目的核心开发规范。这些违规导致代码不一致、可维护性差、违背项目设计原则。 **核心问题:** 1. **未使用基础模型**:所有 IoT 模型都没有嵌入 `BaseModel`,缺少统一的 `creator` 和 `updater` 字段 2. **未使用 gorm.Model**:部分模型没有嵌入 `gorm.Model`,缺少标准的 `ID`、`CreatedAt`、`UpdatedAt`、`DeletedAt` 字段 3. **字段命名不规范**:未显式指定 `column` 标签,依赖 GORM 自动转换(违反规范) 4. **字段定义不完整**:缺少必要的数据库约束标签(`not null`、`uniqueIndex`、索引等) 5. **数据类型不一致**: - 货币字段使用 `float64` 而不是整数(分为单位) - ID 字段类型不一致(`uint` vs `bigint`) - 时间字段缺少 `autoCreateTime`/`autoUpdateTime` 标签 6. **表名不符合规范**:使用复数形式(`iot_cards`)而不是项目约定的 `tb_` 前缀单数形式 7. **缺少中文注释**:部分字段缺少清晰的中文注释说明业务含义 8. **软删除支持不一致**:某些应该支持软删除的模型缺少 `gorm.Model` 嵌入 **对比现有规范模型(Account、PersonalCustomer):** ✅ **正确示例(Account 模型):** ```go type Account struct { gorm.Model // ✅ 嵌入标准模型(ID、CreatedAt、UpdatedAt、DeletedAt) BaseModel `gorm:"embedded"` // ✅ 嵌入基础模型(Creator、Updater) Username string `gorm:"column:username;type:varchar(50);uniqueIndex:idx_account_username,where:deleted_at IS NULL;not null;comment:用户名" json:"username"` // ✅ 显式 column 标签 // ✅ 明确类型和长度 // ✅ 唯一索引 + 软删除过滤 // ✅ not null 约束 // ✅ 中文注释 } func (Account) TableName() string { return "tb_account" // ✅ tb_ 前缀 + 单数 } ``` ❌ **错误示例(IotCard 模型):** ```go type IotCard struct { ID uint `gorm:"column:id;primaryKey;comment:IoT 卡 ID" json:"id"` // ❌ 没有 gorm.Model // ❌ 没有 BaseModel // ❌ 手动定义 ID(应该由 gorm.Model 提供) // ❌ 没有 DeletedAt(无法软删除) CostPrice float64 `gorm:"column:cost_price;type:decimal(10,2);default:0;comment:成本价(元)" json:"cost_price"` // ❌ 使用 float64 而不是整数(分为单位) CreatedAt time.Time `gorm:"column:created_at;autoCreateTime;comment:创建时间" json:"created_at"` UpdatedAt time.Time `gorm:"column:updated_at;autoUpdateTime;comment:更新时间" json:"updated_at"` // ❌ 手动定义(应该由 gorm.Model 提供) } func (IotCard) TableName() string { return "iot_cards" // ❌ 复数形式,没有 tb_ 前缀 } ``` **影响范围:** 需要修复以下所有 IoT 相关模型(约 25 个模型文件): - `internal/model/iot_card.go`(IotCard) - `internal/model/device.go`(Device、DeviceSimBinding) - `internal/model/number_card.go`(NumberCard) - `internal/model/package.go`(PackageSeries、Package、AgentPackageAllocation、PackageUsage) - `internal/model/order.go`(Order) - `internal/model/commission.go`(AgentHierarchy、CommissionRule、CommissionLadder、CommissionCombinedCondition、CommissionRecord、CommissionApproval、CommissionTemplate、CarrierSettlement) - `internal/model/financial.go`(CommissionWithdrawalRequest、CommissionWithdrawalSetting、PaymentMerchantSetting) - `internal/model/system.go`(DevCapabilityConfig、CardReplacementRequest) - `internal/model/carrier.go`(Carrier) - `internal/model/data_usage.go`(DataUsageRecord) - `internal/model/polling.go`(PollingConfig) ## What Changes - 重构所有 IoT 相关数据模型,使其完全符合项目开发规范 - 统一所有模型的字段定义、类型、约束、注释格式 - 确保所有模型与现有用户体系模型(Account、PersonalCustomer)保持一致的架构风格 - 更新数据库迁移脚本以反映模型变更 ## Capabilities ### Modified Capabilities #### 核心数据模型规范化 - `iot-card`: 修改 IoT 卡业务模型 - 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_iot_card`,使用整数存储金额,完善索引和约束 - `iot-device`: 修改设备业务模型 - 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_device`,规范化所有关联字段 - `iot-number-card`: 修改号卡业务模型 - 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_number_card`,使用整数存储金额 - `iot-package`: 修改套餐管理模型 - 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名(`tb_package_series`、`tb_package`、`tb_agent_package_allocation`、`tb_package_usage`),使用整数存储金额 - `iot-order`: 修改订单管理模型 - 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_order`,使用整数存储金额,规范化 JSONB 字段 - `iot-agent-commission`: 修改代理分佣模型 - 统一所有分佣相关模型字段定义,嵌入 BaseModel 和 gorm.Model,修正表名(添加 `tb_` 前缀),使用整数存储金额 #### 财务和系统模型规范化 - 修改财务相关模型(CommissionWithdrawalRequest、CommissionWithdrawalSetting、PaymentMerchantSetting)- 统一字段定义,使用整数存储金额,完善索引和约束 - 修改系统配置模型(DevCapabilityConfig、CardReplacementRequest)- 统一字段定义,嵌入 BaseModel 和 gorm.Model - 修改运营商模型(Carrier)- 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_carrier` - 修改流量记录模型(DataUsageRecord)- 统一字段定义,嵌入 gorm.Model,修正表名为 `tb_data_usage_record` - 修改轮询配置模型(PollingConfig)- 统一字段定义,嵌入 BaseModel 和 gorm.Model,修正表名为 `tb_polling_config` ## Impact **代码变更:** - 重构约 25 个 GORM 模型文件(`internal/model/`) - 所有模型的字段定义将发生变化(字段名、类型、标签) - 所有表名将从复数变为 `tb_` 前缀单数形式 **数据库变更:** - 需要生成新的数据库迁移脚本以反映模型变更 - 表名变更(如 `iot_cards` → `tb_iot_card`) - 字段变更(如 `cost_price DECIMAL` → `cost_price BIGINT`,金额从元改为分) - 新增字段(`creator`、`updater`、`deleted_at`) - 新增索引和约束 **向后兼容性:** - ❌ **不兼容变更**:此次修复涉及破坏性变更(表名、字段类型) - 由于 IoT 模块尚未实际部署到生产环境,可以直接修改而无需数据迁移 - 如果已有测试数据,需要编写数据迁移脚本 **业务影响:** - 不影响现有用户体系(Account、Role、Permission 等) - 不影响个人客户模块(PersonalCustomer) - IoT 模块的 Service 层和 Handler 层代码需要相应调整(字段类型变化) **依赖关系:** - 必须在实现 IoT 业务逻辑(Handlers、Services、Stores)之前修复 - 修复后才能生成正确的数据库迁移脚本 - 修复后才能生成准确的 API 文档 **文档变更:** - 更新 `CLAUDE.md` 中的数据库设计原则和 GORM 模型字段规范 - 补充完整的字段定义规范(显式 column 标签、类型定义、注释要求) - 添加金额字段整数存储的详细说明和示例 - 完善表名命名规范和 BaseModel 使用说明 - 确保全局规范文档与实际实现保持一致 **明确排除的范围**(本次不涉及): - Handler 层代码修改(将在后续任务中处理) - Service 层代码修改(将在后续任务中处理) - Store 层代码修改(将在后续任务中处理) - DTO 模型调整(请求/响应结构体) - 单元测试和集成测试 - API 文档更新 **风险和注意事项:** - 所有金额字段从 `float64` 改为 `int64`(分为单位),需要在业务逻辑中进行单位转换 - 表名变更需要确保迁移脚本正确执行 - 新增的 `creator` 和 `updater` 字段需要在业务逻辑中正确赋值 - 软删除(`DeletedAt`)的引入可能需要调整查询逻辑(GORM 会自动处理)