From 2e2790d8be2f659ab4f0b1451913c840a0767329 Mon Sep 17 00:00:00 2001 From: danial Date: Wed, 5 Mar 2025 21:50:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor(internal/models/order):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=AE=A2=E5=8D=95=E5=88=A9=E6=B6=A6=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用并发查询来处理大量订单 ID- 采用 CopyOnWriteList以提高线程安全性 -优化了数据处理流程,提高了整体性能 --- internal/models/order/order_profit_info.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/internal/models/order/order_profit_info.go b/internal/models/order/order_profit_info.go index f6cccc4..4f1caa9 100644 --- a/internal/models/order/order_profit_info.go +++ b/internal/models/order/order_profit_info.go @@ -1,6 +1,7 @@ package order import ( + datastructure "github.com/duke-git/lancet/v2/datastructure/list" "github.com/duke-git/lancet/v2/slice" "strings" "time" @@ -54,21 +55,28 @@ func GetOrderProfitByBankOrderId(bankOrderId string) OrderProfitInfo { func GetOrderProfitListByBankOrderIdList(bankOrderIdList []string) []OrderProfitInfo { o := orm.NewOrm() - orderProfitList := make([]OrderProfitInfo, 0) + orderProfitList := datastructure.NewCopyOnWriteList([]OrderProfitInfo{}) + orderProfitListUnsafe := make([]OrderProfitInfo, 0) if len(bankOrderIdList) == 0 { - return orderProfitList + 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) { - tmpOrderProfitList := make([]OrderProfitInfo, 0) - _, err := o.QueryTable(ORDER_PROFIT_INFO).Filter("bank_order_id__in", item).All(&tmpOrderProfitList) + 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 = append(orderProfitList, tmpOrderProfitList...) + orderProfitList.AddAll(tmpOrderProfitListTmp) + }, 20) + orderProfitList.ForEach(func(info OrderProfitInfo) { + orderProfitListUnsafe = append(orderProfitListUnsafe, info) }) - return orderProfitList + return orderProfitListUnsafe } func GetAllOrderProfit(params map[string]string) []OrderProfitInfo {