fee_seed.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package initialize
  2. import (
  3. "wails-app/internal/dao"
  4. "wails-app/internal/global"
  5. )
  6. // EnsureDefaultFeeConfig 确保系统内置"临时车"类型存在收费配置占位记录,
  7. // 并修复存量脏配置(旧版本无校验时可能写入无业务含义的数值)。
  8. //
  9. // 补正规则(只修无业务含义的值,不动用户的有效费率):
  10. // - unit_time <= 0:单位时间无意义,补正为 60 分钟(配合全零费用表示显式免费)。
  11. // - vip_discount <= 0:折扣为 0 会让 VIP 费用归零,补正为 1.0(不打折)。
  12. // - 负金额:补正为 0(防止出场倒贴)。
  13. func EnsureDefaultFeeConfig() error {
  14. db := global.GVA_DB
  15. if db == nil {
  16. return nil
  17. }
  18. // 存量脏配置修复
  19. var invalidUnitTime []dao.FeeConfig
  20. if err := db.Where("unit_time <= 0").Find(&invalidUnitTime).Error; err == nil {
  21. for i := range invalidUnitTime {
  22. db.Model(&invalidUnitTime[i]).Update("unit_time", 60)
  23. }
  24. }
  25. var invalidDiscount []dao.FeeConfig
  26. // 注意:GORM 对 VIPDiscount 的列名转换是 v_ip_discount(手写 SQL 须用真实列名)
  27. if err := db.Where("v_ip_discount <= 0").Find(&invalidDiscount).Error; err == nil {
  28. for i := range invalidDiscount {
  29. // 用结构体更新以依赖 GORM 列名转换
  30. db.Model(&invalidDiscount[i]).Updates(dao.FeeConfig{VIPDiscount: 1.0})
  31. }
  32. }
  33. var negativeFees []dao.FeeConfig
  34. if err := db.Where("start_fee < 0 OR unit_fee < 0 OR daily_max_fee < 0").Find(&negativeFees).Error; err == nil {
  35. for i := range negativeFees {
  36. updates := map[string]interface{}{}
  37. if negativeFees[i].StartFee < 0 {
  38. updates["start_fee"] = 0
  39. }
  40. if negativeFees[i].UnitFee < 0 {
  41. updates["unit_fee"] = 0
  42. }
  43. if negativeFees[i].DailyMaxFee < 0 {
  44. updates["daily_max_fee"] = 0
  45. }
  46. db.Model(&negativeFees[i]).Updates(updates)
  47. }
  48. }
  49. var tempType dao.VehicleType
  50. if err := db.Where("name = ? AND is_system = ?", "临时车", true).First(&tempType).Error; err != nil {
  51. return nil // 临时车类型不存在(新库种子尚未执行),跳过
  52. }
  53. var existing dao.FeeConfig
  54. result := db.Where("vehicle_type_id = ?", tempType.ID).First(&existing)
  55. if result.RowsAffected == 0 {
  56. return db.Create(&dao.FeeConfig{
  57. VehicleTypeID: tempType.ID,
  58. UnitTime: 60,
  59. VIPDiscount: 1.0,
  60. Description: "系统默认占位配置(免费),请按实际费率修改",
  61. }).Error
  62. }
  63. return nil
  64. }