Files
kami_boss/internal/models/order/order_profit_info.go
danial 2e2790d8be refactor(internal/models/order): 优化订单利润列表查询性能
- 使用并发查询来处理大量订单 ID- 采用 CopyOnWriteList以提高线程安全性
-优化了数据处理流程,提高了整体性能
2025-03-05 21:50:42 +08:00

168 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 (
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(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.ForEachConcurrent(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).All(&tmpOrderProfitListTmp)
if err != nil {
logs.Error("GetOrderProfitByBankOrderId fail", err)
return
}
orderProfitList.AddAll(tmpOrderProfitListTmp)
}, 20)
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
}