service.go 1.2 KB

123456789101112131415161718192021222324252627282930313233
  1. package service
  2. import "wails-app/internal/global"
  3. type RevenueItem struct {
  4. Date string `json:"date"`
  5. ParkingLot string `json:"parking_lot"`
  6. Cash float64 `json:"cash"`
  7. Free float64 `json:"free"`
  8. Total float64 `json:"total"`
  9. Count int64 `json:"count"`
  10. }
  11. type ReportService struct{}
  12. func (s *ReportService) RevenueReport(startDate, endDate string, lotID uint) ([]RevenueItem, error) {
  13. var items []RevenueItem
  14. db := global.GVA_DB.Table("payment_record p").
  15. Select(`DATE(p.paid_at) as date, COALESCE(pr.lot_name,'-') as parking_lot,
  16. COALESCE(SUM(CASE WHEN p.payment_method='cash' THEN p.amount ELSE 0 END),0) as cash,
  17. COALESCE(SUM(CASE WHEN p.payment_method='free' THEN p.amount ELSE 0 END),0) as free,
  18. COALESCE(SUM(p.amount),0) as total, COUNT(*) as count`).
  19. Joins("LEFT JOIN vehicle_record vr ON vr.id = p.record_id").
  20. Joins("LEFT JOIN parking_lot pr ON pr.id = vr.parking_lot_id")
  21. if startDate != "" && endDate != "" {
  22. db = db.Where("p.paid_at >= ? AND p.paid_at <= ?", startDate, endDate+" 23:59:59")
  23. }
  24. if lotID > 0 {
  25. db = db.Where("vr.parking_lot_id = ?", lotID)
  26. }
  27. err := db.Group("DATE(p.paid_at), vr.parking_lot_id").Order("date DESC").Scan(&items).Error
  28. return items, err
  29. }