Files
kami_boss/internal/models/order/order_profit_info.go
danial e016db918b feat(order): 优化订单查询性能并添加上下文支持
- 在查询订单摘要信息时添加了对大量数据的分页处理,提升性能
- 新增 GetOrderCountByMap 函数用于获取订单总数
- 更新 QueryTotalSummary 和 QueryTodaySummary 函数,支持分页查询
- 为相关函数添加了 context 参数,以便于传递请求上下文
- 优化了部分代码结构,提高可读性和可维护性
2025-06-22 18:36:56 +08:00

169 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package order
import (
"context"
datastructure "github.com/duke-git/lancet/v2/datastructure/list"
"github.com/duke-git/lancet/v2/slice"
"strings"
"time"
)
import (
"github.com/beego/beego/v2/client/orm"
"github.com/beego/beego/v2/core/logs"
)
type OrderProfitInfo struct {
Id int
MerchantName string
MerchantUid string
AgentName string
AgentUid string
PayProductCode string
PayProductName string
PayTypeCode string
PayTypeName string
Status string
MerchantOrderId string
BankOrderId string
BankTransId string
OrderAmount float64
ShowAmount float64
FactAmount float64 //实际支付金额
UserInAmount float64
SupplierRate float64
PlatformRate float64
AgentRate float64
AllProfit float64
SupplierProfit float64
PlatformProfit float64
AgentProfit float64
UpdateTime time.Time
CreateTime time.Time
}
const ORDER_PROFIT_INFO = "order_profit_info"
func GetOrderProfitByBankOrderId(bankOrderId string) OrderProfitInfo {
o := orm.NewOrm()
var orderProfit OrderProfitInfo
_, err := o.QueryTable(ORDER_PROFIT_INFO).Filter("bank_order_id", bankOrderId).Limit(1).All(&orderProfit)
if err != nil {
logs.Error("GetOrderProfitByBankOrderId fail", err)
}
return orderProfit
}
func GetOrderProfitListByBankOrderIdList(ctx context.Context, bankOrderIdList []string) []OrderProfitInfo {
o := orm.NewOrm()
orderProfitList := datastructure.NewCopyOnWriteList([]OrderProfitInfo{})
orderProfitListUnsafe := make([]OrderProfitInfo, 0)
if len(bankOrderIdList) == 0 {
orderProfitList.ForEach(func(info OrderProfitInfo) {
orderProfitListUnsafe = append(orderProfitListUnsafe, info)
})
return orderProfitListUnsafe
}
bankOrderIdList = slice.Unique(bankOrderIdList)
slice.ForEach(slice.Chunk(bankOrderIdList, 100), func(index int, item []string) {
tmpOrderProfitListTmp := make([]OrderProfitInfo, 0)
_, err := o.QueryTable(ORDER_PROFIT_INFO).Filter("bank_order_id__in", item).AllWithCtx(ctx, &tmpOrderProfitListTmp)
if err != nil {
logs.Error("GetOrderProfitByBankOrderId fail", err)
return
}
orderProfitList.AddAll(tmpOrderProfitListTmp)
})
orderProfitList.ForEach(func(info OrderProfitInfo) {
orderProfitListUnsafe = append(orderProfitListUnsafe, info)
})
return orderProfitListUnsafe
}
func GetAllOrderProfit(params map[string]string) []OrderProfitInfo {
o := orm.NewOrm()
var orderProfit []OrderProfitInfo
qs := o.QueryTable(ORDER_PROFIT_INFO)
for k, v := range params {
if len(v) > 0 {
qs = qs.Filter(k, v)
}
}
_, err := qs.RelatedSel().All(&orderProfit)
if err != nil {
logs.Error("GetOrderProfitByBankOrderId fail", err)
}
return orderProfit
}
func GetOrderProfitLenByMap(params map[string]interface{}) int {
o := orm.NewOrm()
qs := o.QueryTable(ORDER_PROFIT_INFO)
for k, v := range params {
switch v.(type) {
case string:
if len(v.(string)) > 0 {
qs = qs.Filter(k, v)
}
default:
qs = qs.Filter(k, v)
}
}
cnt, _ := qs.Limit(-1).Count()
return int(cnt)
}
func GetOrderProfitByMap(params map[string]interface{}, display, offset int) []OrderProfitInfo {
o := orm.NewOrm()
var orderProfitInfoList []OrderProfitInfo
qs := o.QueryTable(ORDER_PROFIT_INFO)
for k, v := range params {
switch v.(type) {
case string:
if len(v.(string)) > 0 {
qs = qs.Filter(k, v)
}
default:
qs = qs.Filter(k, v)
}
}
_, err := qs.Limit(display, offset).OrderBy("-update_time").All(&orderProfitInfoList)
if err != nil {
logs.Error("get order by map fail: ", err)
}
return orderProfitInfoList
}
func GetPlatformProfitByMap(params map[string]string) []PlatformProfit {
o := orm.NewOrm()
cond := "select merchant_name, agent_name, pay_product_name as supplier_name, pay_type_name, sum(fact_amount) as order_amount, count(1) as order_count, " +
"sum(platform_profit) as platform_profit, sum(agent_profit) as agent_profit from " + ORDER_PROFIT_INFO + " where status='success' "
flag := false
for k, v := range params {
if len(v) > 0 {
if flag {
cond += " and"
}
if strings.Contains(k, "create_time__gte") {
cond = cond + " create_time>='" + v + "'"
} else if strings.Contains(k, "create_time__lte") {
cond = cond + " create_time<='" + v + "'"
} else {
cond = cond + " " + k + "='" + v + "'"
}
flag = true
}
}
logs.Info(cond)
var platformProfitList []PlatformProfit
_, err := o.Raw(cond).QueryRows(&platformProfitList)
if err != nil {
logs.Error("get platform profit by map fail:", err)
}
return platformProfitList
}