From 7a91faec5bd3da87a3b60b469cc2e8ed00650b4e Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 20 Aug 2019 10:59:47 +0800 Subject: [PATCH] + GetStoresOrderSaleInfoNew --- business/jxcallback/orderman/orderman_ext.go | 100 ++++++++++++++++++- business/model/dao/dao_order.go | 53 ++++++++++ business/model/dao/dao_order_test.go | 16 +++ 3 files changed, 168 insertions(+), 1 deletion(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index c6675c700..6ea642180 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -775,7 +775,105 @@ func (c *OrderManager) GetOrdersFinancial(ctx *jxcontext.Context, fromDateStr, t } func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) { - return dao.GetStoresOrderSaleInfo(dao.GetDB(), storeIDList, fromTime, toTime, statusList) + if globals.IsProductEnv() { + return dao.GetStoresOrderSaleInfo(dao.GetDB(), storeIDList, fromTime, toTime, statusList) + } + return c.GetStoresOrderSaleInfoNew(ctx, storeIDList, fromTime, toTime, statusList) +} + +func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) { + db := dao.GetDB() + orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList) + if err != nil { + return nil, err + } + afsSkuList, err := dao.GetStoreAfsOrderSkuList(db, storeIDList, fromTime, toTime, []int{model.AfsOrderStatusFinished}) + if err != nil { + return nil, err + } + + orderMap := make(map[string]*model.GoodsOrder) + orderSkuMap := make(map[string]*dao.OrderSkuWithActualPayPrice) + saleInfoMap := make(map[int64]*dao.StoresOrderSaleInfo) + for _, v := range orderSkuList { + if v.EarningPrice == 0 { + v.EarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, v.PayPercentage) + } + + status := v.Status + if status < model.OrderStatusEndBegin { + status = 0 + } + index := jxutils.Combine2Int(v.StoreID, v.VendorID)*1000 + int64(status) + saleInfo := saleInfoMap[index] + if saleInfo == nil { + saleInfo = &dao.StoresOrderSaleInfo{} + saleInfoMap[index] = saleInfo + } + saleInfo.ShopPrice += v.ShopPrice + saleInfo.VendorPrice += v.VendorPrice + saleInfo.SalePrice += v.SalePrice + saleInfo.EarningPrice += v.EarningPrice + + universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID) + if orderMap[universalOrderID] == nil { + orderMap[universalOrderID] = &model.GoodsOrder{ + StoreID: v.StoreID, + VendorID: v.VendorID, + ActualPayPrice: v.ActualPayPrice, + } + saleInfo.ActualPayPrice += v.ActualPayPrice + saleInfo.Count++ + } + orderMap[universalOrderID].SkuCount += v.Count + + universalOrderSkuID := universalOrderID + "/" + utils.Int2Str(jxutils.GetSkuIDFromOrderSku(&v.OrderSku)) + if orderSkuMap[universalOrderSkuID] == nil { + orderSkuMap[universalOrderSkuID] = v + } + } + + afsOrderMap := make(map[string]*model.GoodsOrder) + for _, v := range afsSkuList { + universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID) + order := afsOrderMap[universalOrderID] + if order == nil { + order = &model.GoodsOrder{ + StoreID: v.JxStoreID, + VendorID: v.VendorID, + } + if order.StoreID == 0 { + order.StoreID = v.StoreID + } + afsOrderMap[universalOrderID] = order + } + order.SkuCount += v.Count + + universalOrderSkuID := universalOrderID + "/" + utils.Int2Str(jxutils.GetSkuIDFromOrderSkuFinancial(v)) + if orderSku := orderSkuMap[universalOrderSkuID]; orderSku != nil { + order.EarningPrice += orderSku.EarningPrice + } + } + for universalOrderID, v := range afsOrderMap { + if orderMap[universalOrderID] != nil { + if orderMap[universalOrderID].SkuCount == v.SkuCount { + v.EarningPrice = orderMap[universalOrderID].ActualPayPrice + } + } + + index := jxutils.Combine2Int(v.StoreID, v.VendorID)*1000 + -1 + saleInfo := saleInfoMap[index] + if saleInfo == nil { + saleInfo = &dao.StoresOrderSaleInfo{} + saleInfoMap[index] = saleInfo + } + saleInfo.ActualPayPrice += v.ActualPayPrice + saleInfo.Count += v.SkuCount + } + for _, v := range saleInfoMap { + saleInfoList = append(saleInfoList, v) + } + return saleInfoList, err } func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList []int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) { diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index f85b62587..45dc3c88a 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -25,6 +25,17 @@ type StoresOrderSaleInfo struct { EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 } +type OrderSkuWithActualPayPrice struct { + model.OrderSku + + ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 + + StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid + Status int `json:"status"` // 参见OrderStatus*相关的常量定义 + + PayPercentage int `json:"payPercentage"` +} + func QueryOrders(db *DaoDB, vendorIDs []int, storeID int, orderCreatedAtBegin, orderCreatedAtEnd time.Time) (orderList []*model.GoodsOrder, err error) { sql := ` SELECT t1.* @@ -214,3 +225,45 @@ func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID in err = GetRows(db, &skus, sql, sqlParams...) return skus, err } + +func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int) (skuList []*OrderSkuWithActualPayPrice, err error) { + sql := ` + SELECT t1.*, + t2.actual_pay_price, t2.status, IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, + t3.pay_percentage + FROM order_sku t1 + JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id + LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) + WHERE IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.order_finished_at >= ? AND t2.order_finished_at <= ?` + sqlParams := []interface{}{ + storeIDs, + finishedAtBegin, + finishedAtEnd, + } + if len(statusList) > 0 { + sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" + sqlParams = append(sqlParams, statusList) + } + err = GetRows(db, &skuList, sql, sqlParams...) + return skuList, err +} + +func GetStoreAfsOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, statusList []int) (afsSkuList []*model.OrderSkuFinancial, err error) { + sql := ` + SELECT t1.* + FROM order_sku_financial t1 + JOIN afs_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id + WHERE t1.is_afs_order = 1 + AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (` + GenQuestionMarks(len(storeIDs)) + `) AND t2.afs_finished_at >= ? AND t2.afs_finished_at <= ?` + sqlParams := []interface{}{ + storeIDs, + finishedAtBegin, + finishedAtEnd, + } + if len(statusList) > 0 { + sql += " AND t2.status IN (" + GenQuestionMarks(len(statusList)) + ")" + sqlParams = append(sqlParams, statusList) + } + err = GetRows(db, &afsSkuList, sql, sqlParams...) + return afsSkuList, err +} diff --git a/business/model/dao/dao_order_test.go b/business/model/dao/dao_order_test.go index 33039f28d..9d80b27a7 100644 --- a/business/model/dao/dao_order_test.go +++ b/business/model/dao/dao_order_test.go @@ -2,6 +2,7 @@ package dao import ( "testing" + "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" @@ -23,3 +24,18 @@ func TestGetAfsOrderSkuInfo(t *testing.T) { } globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false)) } + +func TestGetStoreOrderSkuList(t *testing.T) { + skuList, err := GetStoreOrderSkuList(GetDB(), []int{100118}, time.Now().Add(-30*time.Hour), time.Now(), nil) + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(skuList, false)) + + afsSkuList, err := GetStoreOrderSkuList(GetDB(), []int{100118}, time.Now().Add(-30*time.Hour), time.Now(), nil) + if err != nil { + t.Fatal(err) + } + t.Log(utils.Format4Output(afsSkuList, false)) + +}