67 lines
1.8 KiB
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
|
|
}
|