Files
woogo/report.go

182 lines
4.3 KiB
Go
Raw Normal View History

2025-04-08 19:24:11 +02:00
package woogo
import (
"fmt"
"git.cloudyne.io/go/woogo/entity"
"github.com/araddon/dateparse"
validation "github.com/go-ozzo/ozzo-validation/v4"
jsoniter "github.com/json-iterator/go"
)
type reportService service
type ReportsQueryParams struct {
Context string `url:"context,omitempty"`
Period string `url:"period,omitempty"`
DateMin string `url:"date_min,omitempty"`
DateMax string `url:"date_max,omitempty"`
}
func (m ReportsQueryParams) Validate() error {
return validation.ValidateStruct(&m,
validation.Field(&m.Period, validation.When(m.Period != "", validation.In("week", "month", "last_month", "year").Error("无效的报表周期"))),
validation.Field(&m.DateMin,
validation.Required.Error("报表开始时间不能为空"),
validation.By(func(value interface{}) error {
dateStr, _ := value.(string)
return IsValidateTime(dateStr)
}),
),
validation.Field(&m.DateMax,
validation.Required.Error("报表结束时间不能为空"),
validation.By(func(value interface{}) (err error) {
dateStr, _ := value.(string)
err = IsValidateTime(dateStr)
if err != nil {
return
}
dateMin, err := dateparse.ParseAny(m.DateMin)
if err != nil {
return
}
dateMax, err := dateparse.ParseAny(m.DateMax)
if err != nil {
return
}
if dateMax.Before(dateMin) {
return fmt.Errorf("结束时间不能小于 %s", m.DateMin)
}
return nil
}),
),
)
}
// All list all reports
func (s reportService) All() (items []entity.Report, err error) {
resp, err := s.httpClient.R().Get("/reports")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// Sales reports
type SalesReportsQueryParams = ReportsQueryParams
// SalesReports list all sales reports
func (s reportService) SalesReports(params SalesReportsQueryParams) (items []entity.SaleReport, err error) {
if err = params.Validate(); err != nil {
return
}
params.DateMin = ToISOTimeString(params.DateMin, true, false)
params.DateMax = ToISOTimeString(params.DateMax, false, true)
resp, err := s.httpClient.R().
SetQueryParamsFromValues(toValues(params)).
Get("/reports/sales")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// TopSellerReports list all sales reports
type TopSellerReportsQueryParams = SalesReportsQueryParams
func (s reportService) TopSellerReports(params SalesReportsQueryParams) (items []entity.TopSellerReport, err error) {
if err = params.Validate(); err != nil {
return
}
params.DateMin = ToISOTimeString(params.DateMin, true, false)
params.DateMax = ToISOTimeString(params.DateMax, false, true)
resp, err := s.httpClient.R().
SetQueryParamsFromValues(toValues(params)).
Get("/reports/top_sellers")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// CouponTotals retrieve coupons totals
func (s reportService) CouponTotals() (items []entity.CouponTotal, err error) {
resp, err := s.httpClient.R().Get("/reports/coupons/totals")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// CustomerTotals retrieve customer totals
func (s reportService) CustomerTotals() (items []entity.CustomerTotal, err error) {
resp, err := s.httpClient.R().Get("/reports/customers/totals")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// OrderTotals retrieve customer totals
func (s reportService) OrderTotals() (items []entity.OrderTotal, err error) {
resp, err := s.httpClient.R().Get("/reports/orders/totals")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// ProductTotals retrieve product totals
func (s reportService) ProductTotals() (items []entity.OrderTotal, err error) {
resp, err := s.httpClient.R().Get("/reports/products/totals")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}
// ReviewTotals retrieve review totals
func (s reportService) ReviewTotals() (items []entity.OrderTotal, err error) {
resp, err := s.httpClient.R().Get("/reports/reviews/totals")
if err != nil {
return
}
if resp.IsSuccess() {
err = jsoniter.Unmarshal(resp.Body(), &items)
}
return
}