package handler import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "github.com/wangjia/jiu/backend/internal/middleware" "github.com/wangjia/jiu/backend/internal/model" ) type FinanceHandler struct { db *gorm.DB } func NewFinanceHandler(db *gorm.DB) *FinanceHandler { return &FinanceHandler{db: db} } // ListRecords GET /api/v1/finance/records func (h *FinanceHandler) ListRecords(c *gin.Context) { shopID := middleware.GetShopID(c) var q struct { Type string `form:"type"` Month string `form:"month"` // e.g. "2026-04" Page int `form:"page,default=1"` PageSize int `form:"page_size,default=50"` } if err := c.ShouldBindQuery(&q); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if q.PageSize <= 0 { q.PageSize = 50 } if q.Page <= 0 { q.Page = 1 } base := h.db.Model(&model.FinanceRecord{}).Where("shop_id = ?", shopID) if q.Type != "" { base = base.Where("type = ?", q.Type) } if q.Month != "" { base = base.Where("DATE_FORMAT(record_date, '%Y-%m') = ?", q.Month) } var total int64 base.Count(&total) var records []model.FinanceRecord offset := (q.Page - 1) * q.PageSize base.Preload("Partner").Order("record_date DESC, id DESC").Offset(offset).Limit(q.PageSize).Find(&records) c.JSON(http.StatusOK, gin.H{ "data": records, "total": total, "page": q.Page, "page_size": q.PageSize, }) }