refactor(orders): 重构订单列表查询逻辑,支持按消耗状态筛选 feat(orders): 订单列表返回新增活动分类与玩法类型信息 fix(orders): 修复订单支付时间空指针问题 docs(swagger): 更新订单相关接口文档 test(matching): 添加对对碰奖励匹配测试用例 chore: 清理无用脚本文件
118 lines
3.6 KiB
Go
118 lines
3.6 KiB
Go
package admin
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"bindbox-game/internal/code"
|
|
"bindbox-game/internal/pkg/core"
|
|
"bindbox-game/internal/pkg/validation"
|
|
|
|
"github.com/tealeg/xlsx"
|
|
)
|
|
|
|
type exportOrdersRequest struct {
|
|
Status *int32 `form:"status"`
|
|
SourceType *int32 `form:"source_type"`
|
|
StartDate string `form:"start_date"`
|
|
EndDate string `form:"end_date"`
|
|
}
|
|
|
|
func (h *handler) ExportPayOrders() core.HandlerFunc {
|
|
return func(ctx core.Context) {
|
|
req := new(exportOrdersRequest)
|
|
if err := ctx.ShouldBindForm(req); err != nil {
|
|
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
|
|
return
|
|
}
|
|
q := h.readDB.Orders.WithContext(ctx.RequestContext()).ReadDB()
|
|
if req.Status != nil {
|
|
q = q.Where(h.readDB.Orders.Status.Eq(*req.Status))
|
|
}
|
|
if req.SourceType != nil {
|
|
q = q.Where(h.readDB.Orders.SourceType.Eq(*req.SourceType))
|
|
}
|
|
if req.StartDate != "" {
|
|
if t, err := time.Parse("2006-01-02", req.StartDate); err == nil {
|
|
q = q.Where(h.readDB.Orders.CreatedAt.Gte(t))
|
|
}
|
|
}
|
|
if req.EndDate != "" {
|
|
if t, err := time.Parse("2006-01-02", req.EndDate); err == nil {
|
|
t = t.Add(24 * time.Hour).Add(-time.Second)
|
|
q = q.Where(h.readDB.Orders.CreatedAt.Lte(t))
|
|
}
|
|
}
|
|
rows, err := q.Order(h.readDB.Orders.ID.Desc()).Limit(5000).Find()
|
|
if err != nil {
|
|
ctx.AbortWithError(core.Error(http.StatusBadRequest, 23001, err.Error()))
|
|
return
|
|
}
|
|
var pointsRate int64 = 1
|
|
if cfgRate, _ := h.readDB.SystemConfigs.WithContext(ctx.RequestContext()).Where(h.readDB.SystemConfigs.ConfigKey.Eq("points_exchange_per_cent")).First(); cfgRate != nil {
|
|
var r int64
|
|
_, _ = fmt.Sscanf(cfgRate.ConfigValue, "%d", &r)
|
|
if r > 0 {
|
|
pointsRate = r
|
|
}
|
|
}
|
|
file := xlsx.NewFile()
|
|
sheet, _ := file.AddSheet("orders")
|
|
header := []string{"订单号", "用户ID", "来源", "状态", "总金额", "折扣", "积分抵扣(分)", "积分抵扣(积分)", "优惠券抵扣(分)", "实付", "支付时间", "创建时间"}
|
|
row := sheet.AddRow()
|
|
for _, hname := range header {
|
|
cell := row.AddCell()
|
|
cell.Value = hname
|
|
}
|
|
for _, o := range rows {
|
|
leds, _ := h.readDB.UserPointsLedger.WithContext(ctx.RequestContext()).ReadDB().Where(h.readDB.UserPointsLedger.RefTable.Eq("orders"), h.readDB.UserPointsLedger.RefID.Eq(o.OrderNo)).Find()
|
|
var consumePointsSum int64
|
|
for _, lg := range leds {
|
|
if lg.Points < 0 {
|
|
consumePointsSum += -lg.Points
|
|
}
|
|
}
|
|
pa := o.PointsAmount
|
|
if pa == 0 && consumePointsSum > 0 {
|
|
pa = consumePointsSum / pointsRate
|
|
}
|
|
pu := int64(0)
|
|
if consumePointsSum > 0 {
|
|
pu = consumePointsSum
|
|
} else if pa > 0 {
|
|
pu = pa * pointsRate
|
|
}
|
|
ocs, _ := h.readDB.OrderCoupons.WithContext(ctx.RequestContext()).ReadDB().Where(h.readDB.OrderCoupons.OrderID.Eq(o.ID)).Find()
|
|
var couponApplied int64
|
|
for _, oc := range ocs {
|
|
couponApplied += oc.AppliedAmount
|
|
}
|
|
r := sheet.AddRow()
|
|
r.AddCell().Value = o.OrderNo
|
|
r.AddCell().SetInt64(o.UserID)
|
|
r.AddCell().SetInt(int(o.SourceType))
|
|
r.AddCell().SetInt(int(o.Status))
|
|
r.AddCell().SetInt64(o.TotalAmount)
|
|
r.AddCell().SetInt64(o.DiscountAmount)
|
|
r.AddCell().SetInt64(pa)
|
|
r.AddCell().SetInt64(pu)
|
|
r.AddCell().SetInt64(couponApplied)
|
|
r.AddCell().SetInt64(o.ActualAmount)
|
|
if o.PaidAt != nil {
|
|
r.AddCell().Value = o.PaidAt.Format("2006-01-02 15:04:05")
|
|
} else {
|
|
r.AddCell().Value = ""
|
|
}
|
|
r.AddCell().Value = o.CreatedAt.Format("2006-01-02 15:04:05")
|
|
}
|
|
var buf bytes.Buffer
|
|
if err := file.Write(&buf); err != nil {
|
|
ctx.AbortWithError(core.Error(http.StatusBadRequest, 23002, err.Error()))
|
|
return
|
|
}
|
|
ctx.ExcelData("orders.xlsx", buf.Bytes())
|
|
}
|
|
}
|