repo.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package repository
  2. import (
  3. "time"
  4. "wails-app/internal/dao"
  5. "wails-app/internal/global"
  6. )
  7. type PaymentRepository struct{}
  8. func (r *PaymentRepository) Create(record *dao.PaymentRecord) error {
  9. return global.GVA_DB.Create(record).Error
  10. }
  11. // PaymentListQuery 收费记录查询参数
  12. type PaymentListQuery struct {
  13. PlateNumber string `form:"plate_number"`
  14. PaymentMethod string `form:"payment_method"`
  15. ParkingLotID uint `form:"parking_lot_id"`
  16. StartDate string `form:"start_date"`
  17. EndDate string `form:"end_date"`
  18. Page int `form:"page"`
  19. PageSize int `form:"page_size"`
  20. }
  21. // PaymentListResult 收费记录列表项
  22. type PaymentListResult struct {
  23. ID uint `json:"id"`
  24. PlateNumber string `json:"plate_number"`
  25. VehicleType string `json:"vehicle_type"`
  26. PaymentMethod string `json:"payment_method"`
  27. Amount float64 `json:"amount"`
  28. PaidAmount float64 `json:"paid_amount"`
  29. ChangeAmount float64 `json:"change_amount"`
  30. OperatorID uint `json:"operator_id"`
  31. OperatorName string `json:"operator_name"`
  32. ParkingLot string `json:"parking_lot"`
  33. PaidAt string `json:"paid_at"`
  34. EntryTime string `json:"entry_time"`
  35. ExitTime string `json:"exit_time"`
  36. StayTime int64 `json:"stay_time"`
  37. }
  38. // List 查询收费记录列表(关联 vehicle_record + vehicle + vehicle_type)
  39. func (r *PaymentRepository) List(q PaymentListQuery) ([]PaymentListResult, int64, error) {
  40. db := global.GVA_DB.Table("payment_record").
  41. Select(`payment_record.id, vehicle_record.plate_number, vehicle_type.name as vehicle_type, payment_record.payment_method,
  42. payment_record.amount, payment_record.paid_amount, payment_record.change_amount,
  43. payment_record.operator_id, sys_users.nick_name as operator_name, vehicle_record.parking_lot_id, parking_lot.lot_name as parking_lot, payment_record.paid_at,
  44. vehicle_record.entry_time, vehicle_record.exit_time, vehicle_record.stay_time`).
  45. Joins("LEFT JOIN vehicle_record ON vehicle_record.id = payment_record.record_id").
  46. Joins("LEFT JOIN vehicle ON vehicle.plate_number = vehicle_record.plate_number").
  47. Joins("LEFT JOIN vehicle_type ON vehicle_type.id = vehicle.vehicle_type_id").
  48. Joins("LEFT JOIN sys_users ON sys_users.id = payment_record.operator_id").
  49. Joins("LEFT JOIN parking_lot ON parking_lot.id = vehicle_record.parking_lot_id")
  50. if q.PlateNumber != "" {
  51. db = db.Where("vehicle_record.plate_number LIKE ?", "%"+q.PlateNumber+"%")
  52. }
  53. if q.ParkingLotID > 0 {
  54. db = db.Where("vehicle_record.parking_lot_id = ?", q.ParkingLotID)
  55. }
  56. if q.PaymentMethod != "" {
  57. db = db.Where("payment_record.payment_method = ?", q.PaymentMethod)
  58. }
  59. if q.StartDate != "" {
  60. db = db.Where("payment_record.paid_at >= ?", q.StartDate)
  61. }
  62. if q.EndDate != "" {
  63. db = db.Where("payment_record.paid_at <= ?", q.EndDate+" 23:59:59")
  64. }
  65. var total int64
  66. db.Count(&total)
  67. if q.Page <= 0 {
  68. q.Page = 1
  69. }
  70. if q.PageSize <= 0 {
  71. q.PageSize = 10
  72. }
  73. offset := (q.Page - 1) * q.PageSize
  74. var results []PaymentListResult
  75. err := db.Order("payment_record.paid_at DESC").Offset(offset).Limit(q.PageSize).Scan(&results).Error
  76. return results, total, err
  77. }
  78. // TodaySummary 当日收费汇总
  79. type TodaySummary struct {
  80. TotalAmount float64 `json:"total_amount"`
  81. CashAmount float64 `json:"cash_amount"`
  82. FreeAmount float64 `json:"free_amount"`
  83. TotalCount int64 `json:"total_count"`
  84. }
  85. // GetTodaySummary 获取当日收费汇总
  86. func (r *PaymentRepository) GetTodaySummary() (TodaySummary, error) {
  87. var s TodaySummary
  88. today := time.Now().Format("2006-01-02")
  89. err := global.GVA_DB.Table("payment_record").
  90. Select(`COALESCE(SUM(amount), 0) as total_amount,
  91. COALESCE(SUM(CASE WHEN payment_method = 'cash' THEN amount ELSE 0 END), 0) as cash_amount,
  92. COALESCE(SUM(CASE WHEN payment_method = 'free' THEN amount ELSE 0 END), 0) as free_amount,
  93. COUNT(*) as total_count`).
  94. Where("paid_at >= ? AND paid_at < ?", today, today+" 23:59:59").
  95. Scan(&s).Error
  96. return s, err
  97. }