Files
kami_merchant/internal/models/order/summary.go

67 lines
1.8 KiB
Go

package order
import (
"context"
"time"
"github.com/beego/beego/v2/client/orm"
"github.com/duke-git/lancet/v2/slice"
)
// Summary 订单总结
type Summary struct {
TotalNum int `json:"totalNum"` // 提交订单数
TotalAmount float64 `json:"totalAmount"` // 订单总金额
Rate float64 `json:"rate"` // 成功率
SuccessNum int `json:"successNum"` // 成功订单数
SuccessAmount float64 `json:"successAmount"` // 成功订单总金额
Date time.Time `json:"date"` // 日期
}
func GetSummaryByRoadAndMerchant(ctx context.Context, roadUid, merchantUid string) (summariesList []Summary) {
o := orm.NewOrm()
summariesList = make([]Summary, 0)
sql := `
SELECT
COUNT(id) AS totalNum,
SUM(order_info.order_amount) AS totalAmount,
COUNT(CASE WHEN order_info.status = 'success' THEN 1 END) AS successNum,
SUM(CASE WHEN order_info.status = 'success' THEN order_info.order_amount ELSE 0 END) AS successAmount,
DATE(create_time) AS date
FROM
order_info
WHERE
order_info.road_uid = ? AND
order_info.merchant_uid = ?
GROUP BY
DATE(create_time)
`
o.RawWithCtx(ctx, sql, roadUid, merchantUid).QueryRows(&summariesList)
if len(summariesList) == 0 {
return
}
// 补齐从今天到第一天中空缺天的数据
firstDate := summariesList[0].Date
for date := time.Now(); date.After(firstDate); date = date.AddDate(0, 0, -1) {
if slice.ContainBy(summariesList, func(item Summary) bool {
return item.Date.Format("2006-01-02") == date.Format("2006-01-02")
}) {
continue
}
summariesList = append(summariesList, Summary{Date: date})
}
// 计算成功率
for _, summary := range summariesList {
if summary.TotalNum == 0 {
summary.Rate = 0
continue
}
summary.Rate = float64(summary.SuccessNum) / float64(summary.TotalNum)
}
return
}