package initialize import ( "wails-app/internal/dao" "wails-app/internal/global" ) // EnsureDefaultFeeConfig 确保系统内置"临时车"类型存在收费配置占位记录, // 并修复存量脏配置(旧版本无校验时可能写入无业务含义的数值)。 // // 补正规则(只修无业务含义的值,不动用户的有效费率): // - unit_time <= 0:单位时间无意义,补正为 60 分钟(配合全零费用表示显式免费)。 // - vip_discount <= 0:折扣为 0 会让 VIP 费用归零,补正为 1.0(不打折)。 // - 负金额:补正为 0(防止出场倒贴)。 func EnsureDefaultFeeConfig() error { db := global.GVA_DB if db == nil { return nil } // 存量脏配置修复 var invalidUnitTime []dao.FeeConfig if err := db.Where("unit_time <= 0").Find(&invalidUnitTime).Error; err == nil { for i := range invalidUnitTime { db.Model(&invalidUnitTime[i]).Update("unit_time", 60) } } var invalidDiscount []dao.FeeConfig // 注意:GORM 对 VIPDiscount 的列名转换是 v_ip_discount(手写 SQL 须用真实列名) if err := db.Where("v_ip_discount <= 0").Find(&invalidDiscount).Error; err == nil { for i := range invalidDiscount { // 用结构体更新以依赖 GORM 列名转换 db.Model(&invalidDiscount[i]).Updates(dao.FeeConfig{VIPDiscount: 1.0}) } } var negativeFees []dao.FeeConfig if err := db.Where("start_fee < 0 OR unit_fee < 0 OR daily_max_fee < 0").Find(&negativeFees).Error; err == nil { for i := range negativeFees { updates := map[string]interface{}{} if negativeFees[i].StartFee < 0 { updates["start_fee"] = 0 } if negativeFees[i].UnitFee < 0 { updates["unit_fee"] = 0 } if negativeFees[i].DailyMaxFee < 0 { updates["daily_max_fee"] = 0 } db.Model(&negativeFees[i]).Updates(updates) } } var tempType dao.VehicleType if err := db.Where("name = ? AND is_system = ?", "临时车", true).First(&tempType).Error; err != nil { return nil // 临时车类型不存在(新库种子尚未执行),跳过 } var existing dao.FeeConfig result := db.Where("vehicle_type_id = ?", tempType.ID).First(&existing) if result.RowsAffected == 0 { return db.Create(&dao.FeeConfig{ VehicleTypeID: tempType.ID, UnitTime: 60, VIPDiscount: 1.0, Description: "系统默认占位配置(免费),请按实际费率修改", }).Error } return nil }